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

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

非极大值抑制(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/

你可能感兴趣的文章
POJ 1177 Picture(线段树:扫描线求轮廓周长)
查看>>
Qualitor checkAcesso.php 任意文件上传漏洞复现(CVE-2024-44849)
查看>>
POJ 1182 食物链(并查集拆点)
查看>>
POJ 1185 炮兵阵地 (状态压缩DP)
查看>>
POJ 1195 Mobile phones
查看>>
POJ 1228 Grandpa's Estate (稳定凸包)
查看>>
poj 1236(强连通分量分解模板题)
查看>>
poj 1258 Agri-Net
查看>>
quagga 和 zebos
查看>>
poj 1286 Necklace of Beads
查看>>
POJ 1321 棋盘问题
查看>>
poj 1321(回溯)
查看>>
Qt高级——Qt元对象系统源码解析
查看>>
qt调用vs2008编写的dll动态库(隐式调用)
查看>>
Qt读取注册表默认值
查看>>
poj 1679 判断MST是不是唯一的 (次小生成树)
查看>>
POJ 1703 Find them, Catch them
查看>>
POJ 1703 Find them, Catch them 并查集
查看>>
POJ 1738 An old Stone Game(石子合并)
查看>>
POJ 1740 A New Stone Game(博弈)题解
查看>>