目标检测_0.1检测目标和真值(ground truth)匹配

1.问题

验证目标检测模型性能时候,模型输出检测目标需要和真值目标匹配,然后计算精度acc。主要涉及bounding box和label的匹配。

2.目标检测流程

(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])
    #完成检测框和真值框的一一匹配

 

 

你可能感兴趣的:(目标检测)