IOU、非极大值抑制

1、IOU

参见https://blog.csdn.net/hjimce/article/details/50187029

物体检测需要定位出物体的bounding box,就像下面的图片一样,我们不仅要定位出车辆的bounding box 我们还要识别出bounding box 里面的物体就是车辆。对于bounding box的定位精度,有一个很重要的概念,因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU。


IOU定义了两个bounding box的重叠度,如下图所示:


矩形框A、B的一个重合度IOU计算公式为:

IOU=(A∩B)/(A∪B)

就是矩形框A、B的重叠面积占A、B并集的面积比例:

IOU=SI/(SA+SB-SI)

2、非极大值抑制

参看:https://www.cnblogs.com/makefile/p/nms.html

非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,用于目标检测中提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。

原理

对于Bounding Box的列表B及其对应的置信度S,采用下面的计算方式.选择具有最大score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.通常将B中剩余检测框中与M的IoU大于阈值Nt的框从B中移除.重复这个过程,直到B为空.

重叠率(重叠区域面积比例IOU)阈值

常用的阈值是 0.3 ~ 0.5.
其中用到排序,可以按照坐标排序或者面积排序,也可以是通过SVM等分类器得到的得分或概率,R-CNN中就是按得分进行的排序.

https:pic1.zhimg.com/v2-19c03377416e437a288e29bd27e97c14_b.png

就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。

(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;

(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。

(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

就这样一直重复,找到所有被保留下来的矩形框。

 

欢迎关注微信公众号“源起1024”或扫描下方二维码获取更多学习资源

 

Python中的非极大值抑制(Non-Maximum Suppression,简称NMS)是一种常用的目标检测算法,用于在重叠的候选框中选择最佳的目标框。它通常用于物体检测任务中,例如目标检测、人脸检测等。 NMS的基本思想是,在一组候选框中,首先选择具有最高置信度的框作为输出框,然后计算该框与其他候选框的重叠程度(如IoU),如果重叠程度高于一定阈值,则将该候选框剔除。这样可以确保输出的目标框之间没有太大的重叠,从而提高检测结果的准确性。 在Python中,可以使用以下步骤实现非极大值抑制: 1. 根据置信度对候选框进行排序,将置信度最高的框作为输出框。 2. 计算输出框与其他候选框的重叠程度(如IoU)。 3. 对于重叠程度高于设定阈值的候选框,将其从候选框列表中移除。 4. 重复步骤2和步骤3,直到所有候选框都被处理完毕。 5. 返回最终的输出框列表作为非极大值抑制的结果。 以下是一个简单的Python示例代码,演示了如何实现非极大值抑制: ```python def non_maximum_suppression(boxes, scores, threshold): # 根据置信度对候选框进行排序 sorted_indices = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True) selected_indices = [] while sorted_indices: # 选择置信度最高的框作为输出框 best_index = sorted_indices[0] selected_indices.append(best_index) # 计算输出框与其他候选框的重叠程度 best_box = boxes[best_index] other_indices = sorted_indices[1:] overlaps = [calculate_iou(best_box, boxes[i]) for i in other_indices] # 移除重叠程度高于阈值的候选框 filtered_indices = [i for i, overlap in zip(other_indices, overlaps) if overlap <= threshold] sorted_indices = filtered_indices return selected_indices # 计算两个框的重叠程度(IoU) def calculate_iou(box1, box2): # 计算两个框的相交区域 intersection = max(0, min(box1[2], box2[2]) - max(box1[0], box2[0])) * max(0, min(box1[3], box2[3]) - max(box1[1], box2[1])) # 计算两个框的并集区域 area1 = (box1[2] - box1[0]) * (box1[3] - box1[1]) area2 = (box2[2] - box2[0]) * (box2[3] - box2[1]) union = area1 + area2 - intersection # 计算IoU iou = intersection / union return iou # 示例用法 boxes = [[10, 10, 50, 50], [20, 20, 60, 60], [30, 30, 70, 70]] scores = [0.9, 0.8, 0.7] threshold = 0.5 selected_indices = non_maximum_suppression(boxes, scores, threshold) selected_boxes = [boxes[i] for i in selected_indices] print(selected_boxes) ``` 这段代码中,`boxes`表示候选框的坐标,`scores`表示候选框的置信度,`threshold`表示重叠程度的阈值。最后输出的`selected_boxes`即为经过非极大值抑制后的最终输出框。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值