验证目标检测模型性能时候,模型输出检测目标需要和真值目标匹配,然后计算精度acc。主要涉及bounding box和label的匹配。
(1)图片输入模型,并输出检测目标的bond_boxes,labels和probs。
(2)把bond_boxes通过尺寸缩放到原图对应尺寸,并对超出图像边界框进行去除
(3)对bond_boxes根据置信度probs过滤,去掉执行度低的(常0.5为阈值)
(4)对bond_boxes 进行非极大值抑制处理(NMS)
(5)处理时候,根据过滤后bond_boxes 的索引(index)同步更新labels和probs。
更名为det_bond_boxes,det_labels
(6)读取该图片对应真值文件(ground truth)中的bond_boxes和labels。
更名为gt_bond_boxes,gt_labels
(7)根据det_bond_boxes和gt_bond_boxes的IOU来匹配,这一步是需要操作技巧。具体流程如下
import numpy as np
if __name__ == "__main__":
#依次拿检测到的gt_boxes和真值ground truth中gt_box匹配,计算两者IOU,假设det_box为a,gt_box=b
a = [[1,2,4,5],
[4,5,6,7],
[8,9,10,11,12],
[13,14,15,16]]
b = [
[4, 5, 6, 7],
[1, 2, 4, 5],
[8, 9, 10, 11, 12],
]
det_boxes = np.array(a)
gt_boxes = np.array(b)
#假设IOU计算如下,一共12个,第一列是第一个dt_box和3个gt_box的IOU
IOU = [[0.1, 0.8, 0.1],
[0.8, 0.1, 0.1],
[0.1, 0.1, 0.9],
[0.1, 0.1, 0.2]]
#找出每个det_box和三个gt_box IOU最值
iou_max = np.max(IOU,axis = 1)
print(iou_max)
#iou_max = [0.8 0.3 0.9 0.9]
# 对IOU进行过滤小于0.5淘汰
iou_max_index = iou_max > 0.5
print(iou_max_index)#iou_max_index=[ True True False True]
new_det_boxes =det_boxes[iou_max_index]
#[list([1, 2, 4, 5]) list([4, 5, 6, 7]) list([8, 9, 10, 11, 12])
#已经过滤掉det_box的第四个box
#这时候需要给每个det_box 匹配对应的gt_box,首先去除IOU中那个属于错误检测框的IOU,也就是IOU第三列
gt_match_dt_index = np.argmax(IOU,axis=0)#返回给gt_box匹配IOU最大的对应det_box的索引
print(gt_match_dt_index)#[1 0 2]
new_gt_boxes = gt_boxes[gt_match_dt_index]#
# [list([1, 2, 4, 5]) list([4, 5, 6, 7]) list([8, 9, 10, 11, 12])
#完成检测框和真值框的一一匹配