python nms 纯手写
时间: 2024-07-11 07:01:02 浏览: 121
非极大值抑制(Non-Maximum Suppression, NMS)是一个用于对象检测中处理重叠预测框的经典技术,特别是在基于滑动窗口或锚点的方法(如Faster R-CNN、YOLO等)中,经常用来从多个候选区域中选择概率最高的那一个。在Python中,纯手写NMS通常涉及以下几个步骤:
1. **计算IoU(交并比)**:对于每一个候选框,与其他框计算它们的交集和并集,从而得到IoU分数。
2. **排序和初始化得分**:根据每个框的置信度(通常是分类器输出的概率),对所有框按得分降序排列。
3. **遍历并筛选**:从最高分的框开始,如果当前框和其他某个框的IoU大于预设的阈值(比如0.5或0.7),则保留得分较高的框,并舍弃IoU较高的那个。
4. **更新结果**:每次迭代后,保留的框集合都会更新,直到没有其他框满足IoU条件为止。
下面是简单的Python代码示例(假设`scores`是一个包含每个框得分的一维数组,`boxes`是一个包含每个框坐标信息的二维数组):
```python
def non_max_suppression(boxes, scores, iou_threshold=0.5):
indices = np.argsort(scores)[::-1] # 按得分降序排列
suppressed = set() # 存储已处理过的框索引
result = [] # 最终结果
for idx in indices:
if idx not in suppressed:
# 如果框未被处理过
result.append((boxes[idx], scores[idx]))
suppressed.add(idx) # 添加到已处理列表
# 遍历剩余框,检查IoU是否超过阈值
for other_idx in range(len(indices)):
if other_idx not in suppressed and IoU(boxes[idx], boxes[other_idx]) > iou_threshold:
suppressed.add(other_idx)
return result # 返回最终不重叠的框及其得分
# 自定义IoU函数
def IoU(box1, box2):
# 计算两个矩形的IoU
xA, yA, xB, yB = box1
xAo, yAo, xBo, yBo = box2
interArea = max(0, min(xB, xBo) - max(xA, xAo)) * max(0, min(yB, yBo) - max(yA, yAo))
boxAArea = (xB - xA) * (yB - yA)
boxBArea = (xBo - xAo) * (yBo - yAo)
return interArea / float(boxAArea + boxBArea - interArea)
```
阅读全文