博客
关于我
Objective-C实现NMS非极大值抑制(附完整源码)
阅读量:792 次
发布时间: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/

你可能感兴趣的文章
No qualifying bean of type XXX found for dependency XXX.
查看>>
No resource identifier found for attribute 'srcCompat' in package的解决办法
查看>>
No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
查看>>
NO.23 ZenTaoPHP目录结构
查看>>
NO32 网络层次及OSI7层模型--TCP三次握手四次断开--子网划分
查看>>
NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
查看>>
Node JS: < 一> 初识Node JS
查看>>
Node-RED中使用JSON数据建立web网站
查看>>
Node-RED中使用json节点解析JSON数据
查看>>
Node-RED中使用node-red-browser-utils节点实现选择Windows操作系统中的文件并实现图片预览
查看>>
Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
查看>>
Node-RED中实现HTML表单提交和获取提交的内容
查看>>
Node.js 函数是什么样的?
查看>>
Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
查看>>
node.js 怎么新建一个站点端口
查看>>
Node.js 文件系统的各种用法和常见场景
查看>>
node.js 配置首页打开页面
查看>>
node.js+react写的一个登录注册 demo测试
查看>>
Node.js中环境变量process.env详解
查看>>
Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅
查看>>