博客
关于我
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/

你可能感兴趣的文章
PID控制器数字化
查看>>
Qwen-VL项目使用指南
查看>>
PIESDKDoNet二次开发配置注意事项
查看>>
PIGS POJ 1149 网络流
查看>>
PIL Image对图像进行点乘,加上常数(等像素操作)
查看>>
PIL Image转Pytorch Tensor
查看>>
PIL&QOOT;IOERROR:带有大图像的图像文件被截断(&Q)
查看>>
PIL.Image、cv2的img、bytes相互转换
查看>>
PIL.Image进行图像融合显示(Image.blend)
查看>>
pilicat-dfs 霹雳猫-分布式文件系统
查看>>
Pillow lacks the JPEG 2000 plugin
查看>>
SpringBoot之ElasticsearchRestTemplate常用示例
查看>>
ping 全网段CMD命令
查看>>
ping 命令的七种用法,看完瞬间成大神
查看>>
Pinia入门(快速上手)
查看>>
Pinia:$patch的使用场景
查看>>
Pinia:$subscribe()的使用场景
查看>>
Pinpoint对Kubernetes关键业务模块进行全链路监控
查看>>
Pinterest 大规模缓存集群的架构剖析
查看>>
pintos project (2) Project 1 Thread -Mission 1 Code
查看>>