整理了一些关于目标检测评价指标的资料,并在通过代码展现给大家展示AP值的输出,目录如下,可以直接通目录检索所需部分
一提到评价指标,我们下意识其实是准确度和精度,确实如此。目标检测部分常用的评价指标为:
召回率(recall)——含有目标的样例中,能正确识别出来的比例。
平均精度(AP)——准确率-召回率(Precision-recall)曲线下面的面积
这个召回率其实很生动,我放上一位前辈的博客,里面对各个指标的解释都很详细
目标检测 — 评价指标
我需要提醒的一点是这个AP值该如何理解,盗个图(侵删)
横坐标是指我(分类器)识别的正样本里面正确标注的比例——召回率
纵坐标是指我(分类器)能识别出的正样本占总正样本比例——准确率
当我们 test.py ——也就是分类器代码分类结束后,在运行一个代码,他把我们的结果一个个输进去。
那么很显然,刚开始,准确率肯定高,前几个都是对的那比例值就是 1 了。此时召回率扛不住的,几千张图片的话,分子为个位数,那么百分比就将近 0 了
随着 test.py 结果的不断输入,我们的准确率会减少,召回率相当于大力出奇迹,就上去了。
那么可以看出,现有的目标检测系统都面临这么一个困境,准确率和召回率需要取舍。而AP曲线则很好的帮他们在论文中做了一个解释,也这就是大家很喜欢用的原因。
说到这个问题,首先得确定使用的是哪个数据集。不过他们的代码都是db文件里面,我也分别通过代码展示一下
我复现了CornerNet代码——初学者复现CornerNet:详细指导零基础在Ubuntu系统运行该代码并完全理解论文思路的教程
并且接下来的工作是对CornerNet进行一部分的改进,那么如何评价算法的好坏——也就是我改的怎么样呢?
我先试了试AP指标,找到一篇博客,看了看相关指标的代码有没有内嵌 COCO目标检测测评指标
确实如此,COCO官方直接给出了计算所需函数,各类指标都有,接下来就是去代码里面看了
在我的CornerNet代码里面是在db文件夹(这个文件夹如果不知道什么意思可以看我上面那个复现的博客里面有)下的coco.py文件里面定义了MSCOCO类,此类下面便有各类关键参数及指标
def evaluate(self, result_json, cls_ids, image_ids, gt_json=None):
if self._split == "testdev":
return None
coco = self._coco if gt_json is None else COCO(gt_json) #导入数据集——ground truth
eval_ids = [self._coco_eval_ids[image_id] for image_id in image_ids] #已经标注的图片id
cat_ids = [self._classes[cls_id] for cls_id in cls_ids] # 输出结果的图片id
coco_dets = coco.loadRes(result_json) #获取输出结果集中json对象
coco_eval = COCOeval(coco, coco_dets, "bbox") # 三个参数:ground truth,检测结果,IoU类型
coco_eval.params.imgIds = eval_ids
coco_eval.params.catIds = cat_ids
coco_eval.evaluate() #评价结果
coco_eval.accumulate() # 累加
coco_eval.summarize() # 总的结果
return coco_eval.stats[0], coco_eval.stats[12:] #返回我们需要的东西
我直接摘出关键部分,就是上面的evaluate函数,此函数是在coco.py 下面的,可以直接调用
如果觉得不是很好,想自己弄个评价函数,下次用在别的上面,我也找到现成的博客
利用COCOAPI计算Yolov3训练出的模型的MAP值,复现ap
MS COCO:指标问题(续集) MAP,MAR: 以项目:mmdetection(v1.0rc0)为例-coco拆分合并
如果熟练了之后,需要获取其他各类计算参数,以完成自己的需求,我准备了这个函数 AP计算函数
VOC数据集其实有现有的计算AP值等指标的代码,我举出三个例子,这三个例子的实现方式不一样,但是都可以
test.py 函数直接调用其他函数计算了AP
Faster-RNN:先运行detector valid命令,生成相应的txt文件,方便接下来通过其他函数调用
ATSS算法 :给了相应的计算AP值的 .py 文件,接口的变量传递需要自己参考第一个来写上去
打开链接,在蓝色链接的这个叫 test文件直接调用 名字的文件夹里面可以看到
test.py 文件结尾通过
if args.format_only:
dataset.format_results(outputs, **kwargs)
if args.eval:
dataset.evaluate(outputs, args.eval, **kwargs)
调用了voc.py 里面的
def evaluate(self,
results,
metric='mAP',
logger=None,
proposal_nums=(100, 300, 1000),
iou_thr=0.5,
scale_ranges=None):
而且在mean_ap.py里面也有很详细介绍了AP值的计算过程,甚至连tp(True Positive)fp(False Positive)都给出了单独的计算函数。
Faster R-CNN/R-FCN里mAP的计算过程(voc_eval.py解析)
YOLOv3 mAP计算教程
所需代码地址:https://github.com/DaiJianBo/AP.git