本文共 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/