文章目录[隐藏]
目标检测 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
暂无评论