YOLO准确率的11

YOLO

YOLO是目标检测算法其中的一种,目前更新到第三代,即:YOLOv3;其官网为YOLO: Real-Time Object Detection。具体代码之后在解析,先把光光的问题给解决了=-=

问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for (i = 0; i < classes; ++i) {
double avg_precision = 0;
int point;
for (point = 0; point < 11; ++point) {
double cur_recall = point * 0.1;
double cur_precision = 0;
for (rank = 0; rank < detections_count; ++rank)
{
if (pr[i][rank].recall >= cur_recall) { // > or >=
if (pr[i][rank].precision > cur_precision) {
cur_precision = pr[i][rank].precision;
}
}
}
avg_precision += cur_precision;
}
avg_precision = avg_precision / 11;
printf("class_id = %d, name = %s, \t ap = %2.2f %% \n", i, names[i], avg_precision*100);
mean_average_precision += avg_precision;
}

问:为什么point要小于11,已经写死的,如果可换是一个变量= =

解析

从代码上下文可知point取0~10(0,1,2,3,4,5,6,7,8,9,10)这11个数,之后在分别乘以0.1作为cur_recall变量的取值,即:cur_recall的取值为0~1(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1)。。之后在与pr[i][rank].recall进行比较,若pr[i][rank].recall大,则进行更新cur_precision的值,否则不更新。
所以我们从pr[i][rank].recall入手,由前文可知pr[i][rank].recall是其的召回率,根据召回率的定义可知:召回率为所有正例中被分对的比例,衡量了分类器对正例的识别能力。而准确率则是:表示被分为正例的示例中实际为正例的比例
因此可以这么认为:任意一个召回率都有其准确率。
而在YOLO算法中,我们需要的是平均准确率,即:avg_precision,因此在循环中将不同召回率的准确率累加起来,在除以11作为平均准确率。

总结

  • 代码中的11就是0~1(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0),这11种不同的召回率。
  • if (pr[i][rank].recall >= cur_recall)这段代码表示不同种类预测的召回率与11个阀值进行比较,在根据if (pr[i][rank].precision > cur_precision)进行准确率的大小判断累加。
  • 我觉得要画图解释,但我太懒了=-=
0%