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

你可能感兴趣的文章
One good websit for c#
查看>>
OneASP 安全公开课,深圳站, Come Here, Feel Safe!
查看>>
OneBlog Shiro 反序列化漏洞复现
查看>>
one_day_one--mkdir
查看>>
ONI文件生成与读取
查看>>
Online PDF to PNG、JPEG、WEBP、 TXT - toolfk
查看>>
onlyoffice新版5.1.2版解决中文汉字输入重复等问题
查看>>
onnx导出动态输入
查看>>
onTouchEvent构造器
查看>>
on_member_join 和删除不起作用.如何让它发挥作用?
查看>>
oobbs开发手记
查看>>
OPEN CASCADE Curve Continuity
查看>>
Open Graph Protocol(开放内容协议)
查看>>
Open vSwitch实验常用命令
查看>>
Open WebUI 忘了登入密码怎么办?
查看>>
Open-E DSS V7 应用系列之五 构建软件NAS
查看>>
Open-Source Service Discovery
查看>>
open-vm-tools-dkms : 依赖: open-vm-tools (>= 2:9.4.0-1280544-5ubuntu3) 但是它将不会被安装
查看>>
open3d-Dll缺失,未找到指定模块解决
查看>>
openai Midjourney代理服务 gpt大模型第三方api平台汇总 支持国内外各种大模型 持续更新中...
查看>>