前言
如何对不同的模型网络进行评估?这时候就对检测的模型进行分类二了,当检测模型只对单一目标进行检测,例如人脸识别,这时候用到的就是AP指标;
当检测模型对多个目标进行分类时,例如模型对VOC数据集进行多分类(>1)时,此时用到的评价指标就是mAP,mAP就是所有不同类的AP值求平均。
那么AP到底是什么,mAP是什么?
AP:单目标检测
mAP:多目标检测的均值
AP,就是利用precision和recall的点的组合,AP下的面积,就为某个类的AP值,当人为的为网络确定致信率(mAP),当取得的致信度越来越多时,就会用密集的点呈现出最终的评价指标,这个指标就是PR曲线。
项目介绍
(1)mAP曲线绘制项目
(2)生成绘制mAP需要的文件
知识学习
1 IoU
这样就很直观了吧:
分母:真实与预测的并集
分子:真实与预测的交集
再举一个实体的例子:
蓝色框代表ground Trough框,绿色代表检测模型的预测结果。可以看到IOU=96.64%
2 混淆矩阵(TP、TN、FP、FN)
为了方便理解混淆矩阵的概念,大家可以先想这样的事情,其实,混淆矩阵的作用,就是统一人和检测模型的意见:
(1)T(Ture)、F(False)代表人创造出模型得出的结果,是人的意见是否被正确分类
(2)N(Negative)、P(Positive)代表原本这个目标是正样本还是负样本,是模型的意见可和TF-boys没半毛钱关系
所以:
(1)TN:表示被分正确的负样本
(2)TP:表示被分正确的正样本
(3)FN:表示被分错误的负样本,应该被分为正样本的
(4)FP:表示被分错误的正样本,应该被分为负样本的
3 Precision(精确度) 和 Recall(召回率)
Precision代表的是,所有被分类的正样本作为分母(不管分类结果如何),分子为被分类正确的正样本,翻译成中文就是分类器认为是正类并且确实是正类的部分占所有分类器认为是正类的比例。
Recall代表的是,被分正确的正样本+被分错误的负样本,它们作为分母,分子为被分正确的正样本,翻译成中文就是分类器认为是正类并且确实是正类的部分占所有确实是正类的比例。
4 关于上面的一个例子
(1)蓝色框:人工标定的ground truth
(2)绿色框:预测框,检测为正样本框 = P
(3)红色框:预测框,检测为负样本框 = N
所以,precision = 2/(2+2) = 1/2,recall = 2/(2+1) = 2/3
例子二:假设有这样一张表
(1)当设置(超参数)置信度 = 0.94时,10个样本中,TP = 1,FP = 0,FN(没有被正确分类,且分类结果为负样本) = 2
所以:precision = 1/1+0 = 1;recall = 1/1+2 = 1/3
(2)当设置(超参数)置信度 = 0.5时,10个样本中,TP = 3, FP = 1,FN = 0
所以:precision = 3/3+1 = 3/4,recall = 3/3 = 1
5 PR曲线绘制
生成步骤:count-mAP-txt-master文件是b站UP bubliiiing自制的一个帮助生成
(1)detection-results:预测结果的txt。
(2)ground-truth:真实框的txt
(3)images-optional:可视化
如何生成这三个文件?一共分为6步,参考https://blog.csdn.net/weixin_44791964/article/details/104695264
(0)将训练好的模型
(1)将需要训练的VOC数据集放入VOCdevikit
(2)修改voc2ssd.py里面的trainval_percent,把trainval_percent设置成0,表示全部的数据都用于测试。
(3)运行voc2ssd.py,会生成test.txt文件,存放测试图片的名字
(4)运行主目录下的get_dr_txt.py 获得模型的预测框对应的txt文件
(5)运行主目录下的get_gt_txt.py获得真实框对应的txt文件
(6)生成之后,把三个文件的上一级文件文件复制进入mAP-master项目,运行main.py开始检测
下面放一些检测的效果图,运行再VOC2007数据集上
在output内的class文件,可以看到不同类的单个AP
我们打开一个:
最后我们查看最终的mAP结果
可以看到,完美生成了mAP综合指标,51.09%