目标检测 YOLOv5 指标计算

目标检测 YOLOv5 指标计算

flyfish

主要在文件metrics.py中
计算每一个类的AP(average precision)指标
YOLOv5 AP计算代码参考地址

在给定召回率和精度曲线的情况下,计算AP

该计算AP的方式与faster-rcnn相同

def ap_per_class(tp, conf, pred_cls, target_cls, plot=False, save_dir='.', names=()):

参数说明
tp: true positive
conf: 目标的置信度,取值范围0-1
pred_cls: 预测目标类别
target_cls: 真实目标类别,target也可以用gt表示
plot: 在mAP@0.5的情况下,是否绘制P-R曲线
save_dir: P-R曲线图的保存路径

ap_per_class函数会调用compute_ap

计算混淆矩阵 (confusion matrix)

在这里插入图片描述

图中的actual values可以叫ground truth

class ConfusionMatrix:

def __init__(self, nc, conf=0.25, iou_thres=0.45):
    self.matrix = np.zeros((nc + 1, nc + 1))
    self.nc = nc  # number of classes
    self.conf = conf
    self.iou_thres = iou_thres

nc:类别个数
conf:目标置信度阈值
iou_thres :IOU的阈值

预测的结果

detections
一共6列 每列代表的意思 x1, y1, x2, y2, conf, class
一行表示预测目标的位置(x1, y1, x2, y2),预测目标的置信度(conf),预测目标属于什么类别(class)
shape是[7, 6]

[
[3.20333e+02, 1.08333e+00, 4.08333e+02, 2.37667e+02, 8.51074e-01, 0.00000e+00],
[8.02667e+02, 4.18000e+02, 1.06133e+03, 7.14667e+02, 8.42773e-01, 0.00000e+00],
[1.18067e+03, 5.42500e+01, 1.27667e+03, 3.76667e+02, 7.18262e-01, 0.00000e+00],
[5.24667e+02, 5.51667e+02, 7.94000e+02, 7.10000e+02, 6.36230e-01, 0.00000e+00],
[9.87333e+02, 0.00000e+00, 1.05400e+03, 6.83333e+01, 6.34766e-01, 0.00000e+00],
[1.06800e+03, 0.00000e+00, 1.14133e+03, 6.29167e+01, 4.94629e-01, 0.00000e+00],
[6.27000e+02, 5.50667e+02, 8.03333e+02, 7.13333e+02, 3.66455e-01, 0.00000e+00]
]

标注的真实情况

labels
一共5列 class, x1, y1, x2, y2
一行表示 目标真正属于什么类别(class),目标的真实位置(x1, y1, x2, y2)
shape是[7, 5]

[
[0.00000e+00, 3.21000e+02, 2.99988e+00, 4.02000e+02, 2.40000e+02],
[0.00000e+00, 7.69001e+02, 4.23000e+02, 1.05900e+03, 7.16000e+02],
[0.00000e+00, 4.29000e+02, 5.49000e+02, 7.85999e+02, 7.16000e+02],
[0.00000e+00, 1.17000e+03, 1.87000e+02, 1.28000e+03, 3.95000e+02],
[0.00000e+00, 1.08200e+03, 9.99969e-01, 1.14900e+03, 6.30000e+01],
[0.00000e+00, 1.19800e+03, 3.10000e+01, 1.28000e+03, 2.28000e+02],
[0.00000e+00, 9.85999e+02, 9.99969e-01, 1.05300e+03, 6.30000e+01]
]

预测的目标类别 ,一共预测了7个目标
detection_classes:
[0, 0, 0, 0, 0, 0, 0]

目标的真实类别,一共7个目标
gt_classes:
[0, 0, 0, 0, 0, 0, 0]

通过预测的目标位置和真实的目标位置计算iou的结果

iou = general.box_iou(labels[:, 1:], detections[:, :4])

iou: 
[
[0.90478, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000],
[0.00000, 0.85991, 0.00000, 0.03201, 0.00000, 0.00000, 0.05168],
[0.00000, 0.00000, 0.00000, 0.67960, 0.00000, 0.00000, 0.41423],
[0.00000, 0.00000, 0.51112, 0.00000, 0.00000, 0.00000, 0.00000],
[0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.72117, 0.00000],
[0.00000, 0.00000, 0.40877, 0.00000, 0.00000, 0.00000, 0.00000],
[0.00000, 0.00000, 0.00000, 0.00000, 0.87777, 0.00000, 0.00000]
]

iou结果的筛选

举例说明
看一眼上面的iou结果,0.90478在第0行,第0列;最后一行的0.87777在第6行第4列
matches:

[
[          0           0     0.90478]
[          1           1     0.85991]
[          2           3      0.6796]
[          3           2     0.51112]
[          4           5     0.72117]
[          6           4     0.87777]
]

代码是用x存储着阈值在什么位置,哪行哪列

x:
[0, 1, 2, 3, 4, 6],
[0, 1, 3, 2, 5, 4]

最后输出的混淆矩阵如下

matrix: 
[[          6           1]
 [          1           0]]

该代码实现的结果与上图相比 预测值(predicted value)与实际值(actual value)调换了一下。代码实现结果如下
在这里插入图片描述

深度学习基础 - 指标

版权声明:本文为CSDN博主「TheOldManAndTheSea」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/flyfish1986/article/details/117741939

TheOldManAndTheSea

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐