一、IOU(交并比)
是目标检测中常用的评估指标和匹配准则之一。它衡量了两个边界框(或区域)的重叠程度,通过计算它们的交集面积除以它们的并集面积来表示。
作用:
1.目标匹配:在目标检测任务中,IoU常用于匹配预测的边界框和真实的边界框。通过计算预测边界框与真实边界框的IoU,可以判断它们之间的重叠程度,从而确定是否正确地检测到了目标。
2.边界框评估:IoU可用于评估边界框的准确性。当预测的边界框与真实边界框的IoU高于一定阈值时,通常认为该预测是正确的,否则会被视为误检。
3.非极大值抑制(NMS):IoU在非极大值抑制中起到重要的作用。在多个重叠的预测边界框中,NMS通过比较它们之间的IoU,选择具有最高置信度的边界框,并抑制其他重叠的边界框,以避免重复检测同一目标。
4.边界框回归:在一些目标检测方法中,通过回归预测边界框的位置和尺寸。IoU可以用作回归目标的一部分,用于衡量回归预测的边界框与真实边界框之间的重叠程度,从而帮助模型学习更准确的边界框回归。
二、iou的缺陷
1.敏感性于目标大小:IoU对目标大小非常敏感。当目标较小时,即使存在较小的偏移或误差,IoU也可能会受到显著影响。因此,在评估小目标的性能时,IoU可能会导致不准确的结果。
2.对目标形状不敏感:IoU仅考虑了两个边界框的重叠区域,并未考虑目标的形状信息。因此,如果目标的形状与边界框不完全匹配,IoU可能无法准确评估目标检测或分割的性能。
3.没有相交无法进行梯度计算:在目标检测任务中,当两个边界框的IoU为0时,意味着它们没有任何重叠的区域。这种情况下,由于没有共享的区域,无法计算出可靠的梯度信息。
4.相同的IOU却反映不出实际情况:在某些情况下,相同的IoU值可能无法准确反映出实际情况。
具体改进大家可以参考这篇博客:http://t.csdn.cn/rTfIz
```python
在这里插入代码片
```def Iou(box1,box2,wh=False):
# 判断bbox的表示形式
if wh==False:
xmin1,ymin1,xmax1,ymax1=box1
xmin2,ymin2,xmax2,ymax2=box2
else:
xmin1,ymin1=int(box1[0]-box1[2]/2.0),int(box1[1]-box1[3]/2.0)
xmax1,ymax1=int(box1[0]+box1[2]/2.0),int(box1[1]+box1[3]/2.0)
xmin2,ymin2=int(box2[0]-box2[2]/2.0),int(box2[1]-box2[3]/2.0)
xmax2,ymax2=int(box2[0]+box2[2]/2.0),int(box2[1]+box2[3]/2.0)
# 获取矩形框交集对应的左上⻆和右下⻆的坐标(intersection)
xx1=np.max([xmin1,xmin2])
yy1=np.max([ymin1,ymin2])
xx2=np.min([xmax1,xmax2])
yy2=np.min([ymax1,ymax2])
# 计算两个矩形框⾯积
area1=(xmax1-xmin1)*(ymax1-ymin1)
area2=(xmax2-xmin2)*(ymax2-ymin2)
#计算交集⾯积
inter_area=(np.max([0,xx2-xx1]))*(np.max([0,yy2-yy1]))
#计算交并⽐
iou = inter_area / (area1+area2-inter_area+1e-6)
return iou
三、NMS(非极大值抑制)
非极大值抑制(Non-Maximum Suppression,NMS)是一种常用的目标检测算法中的后处理步骤,用于抑制重复的边界框,从而提高检测结果的准确性和去除重叠的目标框,并且我们都是对同一类别的检测框使用非极大值抑制。
他的步骤是:
1.输入:NMS的输入是一系列候选边界框(bounding boxes),每个边界框通常由以下信息组成:坐标(左上角和右下角)、置信度得分等。
2.根据置信度排序:首先,根据边界框的置信度得分对所有候选框进行降序排序,确保得分最高的边界框排在前面。
3.选择最高得分的边界框:从排序后的边界框列表中选择得分最高的边界框,将其标记为最终输出的检测结果。
4.计算重叠度:从剩余的边界框中,计算与选定边界框的重叠度。常用的重叠度度量是IoU(交并比),计算方式是两个边界框的相交面积除以它们的并集面积。
5.抑制重叠边界框:对于重叠度高于预设阈值的边界框,将其从列表中移除,只保留重叠度较低的边界框。
6.重复步骤4和步骤5:重复进行步骤4和步骤5,直到所有的边界框都被处理完毕。
7.输出最终边界框:最后,输出经过非极大值抑制后得到的最终边界框列表作为目标检测的结果。
NMS的主要作用是1.去除冗余边界框,2.选择最佳边界框,3.提高检测精度
代码如下为了更好的观察,我在中间设置了一些输出。
def nms(bboxes,score,threshold):
if len(bboxes)==0:
return [],[]
bboxes=np.array(bboxes)
print(bboxes)
score=np.array(score)
print(score)
x1=bboxes[:,0]
print(x1)
y1=bboxes[:,1]
print(y1)
x2=bboxes[:,2]
y2=bboxes[:,3]
picked_boxes=[]
picked_score=[]
order=np.argsort(score)
print('排序',order)
area=(x2-x1)*(y2-y1)
print('面积',area)
while order.size>0:
index=order[-1]
#保留该类剩余box中得分最⾼的⼀个
picked_boxes.append(bboxes[index])
picked_score.append(score[index])
# 获取当前置信度最⼤的候选框与其他任意候选框的相交⾯积
print(x1[order[:-1]])
x11=np.maximum(x1[index],x1[order[:-1]])
print('坐标x11',x11)
y11=np.maximum(y1[index],y1[order[:-1]])
x22=np.minimum(x2[index],x2[order[:-1]])
print('坐标x22',x11)
y22=np.minimum(y2[index],y2[order[:-1]])
w=np.maximum(0.0,x22-x11)
print('w的宽度',w)
h=np.maximum(0.0,y22-y11)
intersection=w*h
# 利⽤相交的⾯积和两个框⾃身的⾯积计算框的交并⽐
ratio=intersection/(area[index]+area[order[:-1]]-intersection)
print(area[index])
print(area[order[:-1]])
print('比率',ratio)
# 保留IoU⼩于阈值的box
keep_boxes_indics=np.where(ratio<threshold)
#保留剩余的框
order=order[keep_boxes_indics]
return picked_boxes,picked_score