首先用训练好的模型得到所有测试样本的 confidence score, 每一类 (如 car) 的 confidence score 保存到一个文件中(如 comp1_cls_test_car.txt). 假设共有 20 个测试样本, 每个的 id,confidence score 和 ground truth label 如下:
接下来对 confidence score 排序, 得到:
然后计算 precision 和 recall, 这两个标准的定义如下:
圆圈内 (true positives + false positives) 是我们选出的元素, 它对应于分类任务中我们取出的结果, 比如对测试样本在训练好的 car 模型上分类, 我们想得到 top-5 的结果, 即:
在这个例子中, 根据 ge_label 真实标签, true positives 就是指第 4 和第 2 张图片, false positives 就是指第 13,19,6 张图片. 方框内圆圈外的元素 (false negatives 和 true negatives) 是相对于方框内的元素而言, 在这个例子中, 是指 confidence score 排在 top-5 之外的元素, 即:
其中, false negatives 是指第 9,16,7,20 张图片, true negatives 是指第 1,18,5,15,10,17,12,14,8,11,3 张图片.
那么, 这个例子中 Precision=2/5=40%, 意思是对于 car 这一类别, 我们选定了 5 个样本, 其中正确的有 2 个, 即准确率为 40%;Recall=2/6=30%, 意思是在所有测试样本中, 共有 6 个 car, 但是因为我们只召回了 2 个, 所以召回率为 30%.
实际多类别分类任务中, 我们通常不满足只通过 top-5 来衡量一个模型的好坏, 而是需要知道从 top-1 到 top-N(N 是所有测试样本个数, 本文中为 20)对应的 precision 和 recall. 显然随着我们选定的样本越来也多, recall 一定会越来越高, 而 precision 整体上会呈下降趋势. 把 recall 当成横坐标, precision 当成纵坐标, 即可得到常用的 precision-recall 曲线. 这个例子的 precision-recall 曲线如下:
接下来说说 AP 的计算, 此处参考的是 PASCAL VOC CHALLENGE 的计算方法. 首先设定一组阈值,[0, 0.1, 0.2, ..., 1]. 然后对于 recall 大于每一个阈值(比如 recall>0.3), 我们都会得到一个对应的最大 precision. 这样, 我们就计算出了 11 个 precision.AP 即为这 11 个 precision 的平均值. 这种方法英文叫做 11-point interpolated average precision.?
当然 PASCAL VOC CHALLENGE 自 2010 年后就换了另一种计算方法. 新的计算方法假设这 N 个样本中有 M 个正例, 那么我们会得到 M 个 recall 值 (1/M, 2/M, ..., M/M), 对于每个 recall 值 r, 我们可以计算出对应(r'> r) 的最大 precision, 然后对这 M 个 precision 值取平均即得到最后的 AP 值. 计算方法如下:
相应的 Precision-Recall 曲线 (这条曲线是单调递减的) 如下:?
对每个 recall 对应的 precision 求均值就得到所谓的 average precision, 即 AP. 这样就得到了对应一个类 (分类器) 的 average precision, 它表示的是该模型在某个类别上的好坏, 如果要求模型在所有类别上的好坏, 就求所有类别对应的 AP 的均值, 即所谓的 mAP.
参考链接: http://blog.sina.com.cn/s/blog_9db078090102whzw.html
来源: http://www.bubuko.com/infodetail-2980533.html