精度(precision),召回率(recall),map

目标检测中经常会见到precision,recall,map三个指标用来评估一个模型的优劣,当然在很多其他的应用中也可以看到这三个指标的具体应用;因此很有必要对这三个指标进行详细的了解。在介绍这三个指标之前有必要先了解几个基本的术语:True positives,True negatives,False positives,False negative。

大雁和飞机
假设现有一个测试集,测试集中仅包含大雁和飞机两种目标,如图所示:
精度(precision),召回率(recall),map
假设分类的目标是:取出测试集中所有飞机图片,而非大雁图片
现做如下定义:
True positives: 飞机的图片被正确识别为飞机
True negatives:大雁的图片被识别为大雁
False positives:大雁的图片被识别为飞机
False negatives:飞机的图片被识别为大雁

假设分类系统使用上述假设识别出了四个结果,如下图所示:
精度(precision),召回率(recall),map
识别为飞机的图片中:
True positives:有三个,画绿色框的飞机
False positives:有一个,画红色框的大雁

识别为大雁的图片中:
True negatives:有四个,这四个大雁的图片被识别为大雁
False negatives:有两个,这两个飞机被识别为大雁

Precision与Recall
Precision其实就是识别为飞机的图片中,True positives所占的比率:
precision = tp / (tp + fp) = tp / n
其中n表示(True positives + False positives),也就是系统一个识别为飞机的图片数。该例子中,True positives为3,False positives为1,所以precision = 3 / (3 + 1) = 0.75,意味着识别为飞机的图片中,真正为飞机的图片占比为0.75。

Recall是被正确识别出来飞机个数与测试集中所有真正飞机个数的比值:
recall = tp / (tp + fn)
Recall的分母是(True positives + False negatives),这两个值的和,可以理解为一共有多少张真正的飞机图片。该例子中,True positives为3,False negatives为2,那么recall的值是3 / (3 + 2) = 0.6;即所有飞机图片中,0.6的飞机被正确识别为飞机。

调整阈值
当然对某一个具体的模型而言precision和recall并不是一成不变的,而是随着阈值的改变而改变的。当阈值以某一步伐从0变化到1,那么就可以得到关于precision和recall生成的曲线,具体示意图如下:
精度(precision),召回率(recall),map
上图为一个pr曲线的例子,并不表示上面例子的pr曲线结果,从pr曲线可以看到precision和recall是相反的,因而在实际项目当中需要根据具体的情况来选取合适的阈值。