博客
关于我
Objective-C实现NMS非极大值抑制(附完整源码)
阅读量:792 次
发布时间:2023-02-19

本文共 3007 字,大约阅读时间需要 10 分钟。

非极大值抑制(NMS)是一种常用的图像处理技术,尤其在目标检测领域中,用于清理冗余的边界框。NMS通过比较每个边界框的得分和重叠度,来决定哪些框应保留,从而保留最可能的边界框。

在目标检测中,边界框的重叠可能导致多个框识别同一对象。NMS通过剔除低得分且与其他框高度重叠的边界框,提升检测精度。

以下是Objective-C实现NMS的代码示例:

#import 
@interface NMSHandler : NSObject
- (NSArray *)applyNMSWithBoundingBoxes:(NSArray *)boundingBoxes
AndScores:(NSArray *)scores;
- (NSArray *)sortBoundingBoxesByScore;
@end
@implementation NMSHandler
- (NSArray *)applyNMSWithBoundingBoxes:(NSArray *)boundingBoxes
AndScores:(NSArray *)scores {
// 首先将边界框按得分排序
NSArray *sortedBoxes = [self sortBoundingBoxesByScore];
// 初始化一个数组来存储最终保留的边界框
NSMutableArray *selectedBoxes = [NSMutableArray array];
// 遍历排序后的边界框
for (int i = 0; i < sortedBoxes.count; i++) {
// 获取当前边界框和前一个边界框
CGRect currentBox = sortedBoxes[i];
CGRect previousBox = sortedBoxes[i-1];
// 计算边界框的重叠程度
CGRect intersection = [self calculateIntersectionBetweenRects:currentBox
andRect:previousBox];
// 如果当前边界框与前一个边界框重叠较多且得分较低,则跳过
if ([self shouldSkipBox:currentBox
hasHigherOverlapWith:previousBox
andScore:currentBox.score]) {
continue;
}
// 否则,将当前边界框加入结果数组
[selectedBoxes addObject:currentBox];
}
return [selectedBoxes sortedArray];
}
- (NSArray *)sortBoundingBoxesByScore {
return [self sortBoxesByScore:boundingBoxes];
}
- (BOOL)shouldSkipBox:(CGRect)currentBox
hasHigherOverlapWith:(CGRect)previousBox
andScore:(CGFloat)currentScore {
// 如果当前边界框得分高于前一个边界框,则保留
if (currentScore > previousBox.score) {
return NO;
}
// 计算边界框的重叠程度
CGFloat overlap = [self calculateOverlap:currentBox
andRect:previousBox];
// 如果重叠程度大于一定阈值且当前边界框得分低于前一个边界框,则跳过
return overlap > 0.5 && currentScore < previousBox.score;
}
- (CGFloat)calculateOverlap:(CGRect)rect1
andRect:(CGRect)rect2 {
// 计算边界框的重叠区域
CGFloat overlapWidth = max(0, min(rect1.maxX, rect2.maxX) - max(rect1.minX, rect2.minX));
CGFloat overlapHeight = max(0, min(rect1.maxY, rect2.maxY) - max(rect1.minY, rect2.minY));
return overlapWidth * overlapHeight;
}
- (CGRect)calculateIntersectionBetweenRects:(CGRect)rect1
andRect:(CGRect)rect2 {
// 计算两个边界框的交集区域
CGRect intersection = [self calculateOverlap:rect1 andRect:rect2];
// 确定交集区域的坐标
CGFloat minX = max(rect1.minX, rect2.minX);
CGFloat maxX = min(rect1.maxX, rect2.maxX);
CGFloat minY = max(rect1.minY, rect2.minY);
CGFloat maxY = min(rect1.maxY, rect2.maxY);
return CGRectMake(minX, minY, maxX - minX, maxY - minY);
}
@end

以上代码实现了NMS算法,接收一组边界框及其对应的得分,返回经过NMS处理后的边界框。代码中首先将边界框按得分排序,然后遍历排序后的边界框,根据重叠程度和得分来决定是否保留边界框。

NMS算法通过剔除低得分且与其他边界框高度重叠的框,确保保留的边界框最有可能是真实的边界框,从而提高目标检测的精度。

转载地址:http://zhnfk.baihongyu.com/

你可能感兴趣的文章
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
查看>>
NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
查看>>
NIH发布包含10600张CT图像数据库 为AI算法测试铺路
查看>>
Nim教程【十二】
查看>>
Nim游戏
查看>>
NIO ByteBuffer实现原理
查看>>
Nio ByteBuffer组件读写指针切换原理与常用方法
查看>>
NIO Selector实现原理
查看>>
nio 中channel和buffer的基本使用
查看>>
NIO三大组件基础知识
查看>>