非极大值抑制中的DIOU-nms

文章介绍了非极大值抑制(NMS)的概念,用于筛选模型检测中的冗余框。DIoUNMS扩展了IoU考虑中心点距离和长宽比,尤其是DIOU(Distance-IoU)公式,通过添加中心点距离惩罚项来优化框的匹配。

目录

什么是非极大值抑制?

DIoU NMS

公式


什么是非极大值抑制?

非极大值抑制(Non-maximum supression)简称NMS,其作用是去除冗余的检测框,去冗余手段是剔除与极大值重叠较多的检测框结果

简单来说,非极大值抑制的作用就是模型检测出了很多框,我应该留下哪些。

 核心思想是搜索目标局部范围内的边界框置信度最大的这个最优值,去除目标邻域内的冗余边界框。

DIoU NMS

论文:   https://arxiv.org/pdf/1911.08287.pdf.

一个成熟的IoU衡量指标应该要考虑预测框与真实框的重叠面积、中心点距离、长宽比三个方面。但是IoU 只考虑到了预测框与真实框重叠区域,并没有考虑到中心点距离、长宽比。

基于此,DIOU-NMS就不仅仅考虑IOU,还考虑两个框中心点之间的距离。如果两个框之间IOU比较大,但是两个框的中心距离比较大时,可能会认为这是两个物体的框而不会被过滤掉。
具体的GIoU、DIoU、CIoU的细节可以看我的以下博客:GIoU、DIoUCIoU

公式

DIoU (Distance-IoU )。简单地在IoU loss基础上添加一个惩罚项,该惩罚项用于最小化两个bbox的中心点距离。

DIoU公式:

如下图,绿色框代表真实框,黑色框代表预测框,b 为预测框的中心,b^{gt}为真实框的中心,\rho ^{2}(b,b^{gt})代表真实框与预测框中心距离的平方d^{2},c表示两个框的最小闭包区域(同时包含了预测框和真实框的最小矩形框)的对角线长度。

### 介绍 DIoU-NMS 是一种结合了距离信息的 NMS非极大值抑制算法,对边界框的排列和尺寸变化具有较好的鲁棒性,能够更好地抑制冗余边界框[^1]。 ### 原理 DIoU-NMS 考虑了检测框的中心点距离和目标物体边界的距离。在传统的 NMS 算法中,主要依据检测框之间的交并比(IoU)来进行筛选,而 DIoU-NMS 在此基础上引入了中心点距离等信息,使得在处理边界框时能更综合地考虑其空间位置关系,从而更精准地判断哪些边界框是冗余的,进而进行抑制。 ### 应用 在目标检测任务中,目标检测模型通常会在图像中生成大量的检测框,其中很多是对同一目标的重复检测。DIoU-NMS 可以有效去除这些冗余的检测框,只保留置信度最高且位置最准确的检测框,从而提高目标检测的精度和效率。例如在安防监控场景中,对行人、车辆等目标的检测;在自动驾驶领域,对道路上各种目标(如其他车辆、行人、交通标志等)的检测。 ### 实现 在一些开源的目标检测框架中可以实现 DIoU-NMS。以引用[2]中提及的情况为例,在 ultralytics/utils/ops.py 中可以进行相关实现,在该文件里可能会有专门针对 DIoU-NMS 的代码模块。以下是一个简单的伪代码示例来说明其实现思路: ```python import torch def diou_nms(boxes, scores, iou_threshold): if boxes.numel() == 0: return torch.empty((0,), dtype=torch.int64, device=boxes.device) x1 = boxes[:, 0] y1 = boxes[:, 1] x2 = boxes[:, 2] y2 = boxes[:, 3] areas = (x2 - x1 + 1) * (y2 - y1 + 1) order = scores.argsort(descending=True) keep = [] while order.numel() > 0: i = order[0] keep.append(i) if order.numel() == 1: break xx1 = torch.max(x1[i], x1[order[1:]]) yy1 = torch.max(y1[i], y1[order[1:]]) xx2 = torch.min(x2[i], x2[order[1:]]) yy2 = torch.min(y2[i], y2[order[1:]]) w = torch.max(torch.tensor(0.0, device=boxes.device), xx2 - xx1 + 1) h = torch.max(torch.tensor(0.0, device=boxes.device), yy2 - yy1 + 1) inter = w * h # 计算 DIoU 相关信息(此处为简化示意,实际计算更复杂) center_x1 = (x1[i] + x2[i]) / 2 center_y1 = (y1[i] + y2[i]) / 2 center_x2 = (x1[order[1:]] + x2[order[1:]]) / 2 center_y2 = (y1[order[1:]] + y2[order[1:]]) / 2 d = ((center_x1 - center_x2) ** 2 + (center_y1 - center_y2) ** 2) # 这里省略了一些 DIoU 完整计算步骤 iou = inter / (areas[i] + areas[order[1:]] - inter) inds = torch.where(iou <= iou_threshold)[0] order = order[inds + 1] return torch.tensor(keep, dtype=torch.int64, device=boxes.device) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值