cocoeval代码解析

本文详细介绍了COCO评估工具(cocoeval)在目标检测中的工作原理,包括mAP的计算、IoU的重要性、置信度阈值的应用以及如何衡量误检率和漏检率。通过对COCO API的分析,揭示了目标检测模型性能评估的全过程。
摘要由CSDN通过智能技术生成

1.评测的是什么:

目标检测算法评估的指标是mAP:mean Average Precision,平均精度均值,也就是AP(Average Precision)的平均值,它是目标检测算法的主要评估指标,目标检测模型通常会用速度和精度指标描述优劣,mAP值越高。表明该目标检测模型在给定的数据集上的检测效果越好。

在机器学习中,通常将预测分为四种情况,True Positive(TP)(预测为真,实际也为真),True Negative(TN)(预测为假,实际也为假),False Positive(FP)(预测为真,实际为假),False Negative(FN)(预测为假,实际为真)。

\begin{gathered} \text { Precision }=\frac{T P}{T P+F P} \\ \text { Recall }=\frac{T P}{T P+F N} \\ \text { Accuracy }=\frac{T P+T N}{T P+F P+T N+F N} \\ \text { F1 Score }=2 * \frac{\text { Precision } * \text { Recall }}{\text { Precision }+ \text { Recall }}=\frac{2 T P}{2 T P+F P+F N} \end{gathered}

 由此可以得到精度Precision、召回率Recall、准确度Accuracy、F1分数的计算公式。

其中,精度表示预测为真的结果预测正确的比例,召回率表示真值结果中被预测出来的比例,准确性表示预测结果中预测正确的比例,F1分数是精度与召回率的调和平均,表征模型的综合能力。

而在目标检测中,通常会有真值框与检测框,此时Precision指的是真值框与检测框相交部分的面积与检测框面积的比例,Recall指的是真值框与检测框相交部分的面积与真值框面积的比例。

Precision通常用来表示误检率,Recall通常用来表示漏检率。

在目标检测中,使用置信度分数Confidence Score来表示分类器预测的锚框(Anchor Box)中包含某个对象的概率,通过设置置信度阈值,可以过滤掉小于threshold的预测对象。

IoU(Intersection over union)交并比,指的是预测框与真值框之间的重叠度,用于衡量预测框的准确度。

因此,对于所有的检测结果,我们将其按照置信度分数进行排序,设定一个置信度分数的阈值,高于该阈值的结果作为最终检测结果,低于该阈值的结果被过滤掉,就计算获得了该情况下的precision与recall的分数。随着置信度分数阈值的降低,越来越多的检测结果被加入到最终检测结果中,召回率不断增加,精度不断降低,这样就获得不同阈值下的pr曲线。在实际应用时,并不直接对pr曲线进行计算,而是对pr曲线进行平滑处理,即对于pr曲线上的每个点,precision的值取该点右侧最大的precision值。

在目标检测算法中,当一个检测结果被认为是TP时,需要满足三个条件:

1.Confidence Score>Confidence Threshold

2.预测类别匹配真值类别

3.预测边界框的IoU大于设定阈值

在coco评测方法中,按照召回率0到1,每增加0.01为一个等级,取pr曲线中的各个等级的点做平均,便计算得到了AP值。

同时,在coco中,设置了从0.5到0.95之间,每次递加值为0.05的10个iou阈值,计算在这些iou阈值下的mAP平均值,比仅考虑通用iou阈值评估指标更能体现出模型的精度。

2.cocoeval中是怎么做的

cocoeval中包含三种任务的评测:bbox、segmentation、keypoint,分别适用于目标检测、语义分割、关键点检测。此处仅考虑目标检测任务。

coco对于bbox面积阈值的划分,分为all(0<area<1e5²)、small(0<area<32²)、medium(32²<area<96²)、large(96²<area<1e5²),面积阈值数值的列表为areaRng,面积阈值标签的列表为areaRngLbl。

coco对于每张图片最大检测数maxDet的划分:1、10、100,用maxDets列表指代。

coco对于iou阈值的划分:0.5-0.95,间隔为0.05,共10个阈值,用iouThrs列表指代。

coco对于pr图中recall值的选取:0-1,间隔为0.01,共101个阈值,用recThrs列表指代。

coco还用useCats参数,来清除检测中出现gt中没有的img id,class id,当该参数为真时,只读取指定图片、指定类别的注释,当该参数为假时,只读取指定图片的注释。

(1)类初始化与数据准备阶段

在类的初始化阶段,如果传入了cocoGt,则会将gt中的所有img id 与category id传入self.params中。

_prepare函数为数据准备阶段,当useCats为真时,依据self.params中的图片与类别id读取gt与dt结果。该阶段读取的gt与dt数据存储在gts与dts中。

对于gts中的gt值,根据json中的注释来设置其是否被ignore,这部分主要是为了过滤掉一些比较小的物体。同时,会根据iscrowd标签对gt的ignore参数进行设置,iscrowd表示密集区域,若gt的iscrowd标签为真,则该gt的ignore也为真。

此后,在self._gts和self._dts中,根据前面读取的gts与dts的图像id与类别id,加载其对应的bbox数据、置信度分数数据。

(2)evaluate函数,对单张图片进行评估。

在该函数中,调用time函数,用来计算时间消耗。

首先,取出GT中的img id,category id,maxDets,随后,调用_prepare()函数进行参数的读取。

随后,调用computeIoU函数,对每个图像与每个类别,得到一个M*N维的ndarry,其中M表示在这个img id、category id下有多少个预测的dt,N是在这个img id、category id下有多少个真值gt。

随后,对于每一个图片id、每一个种类id、每一个面积阈值、每一个单张图片的最大检测数对应的检测结果,都调用一次evaluateImg函数,获得K*A*M*I维的检测结果,self.evalImgs

(3)computeIoU函数,传入指定的imgId、catId,返回M*N维的iou矩阵。

依据传入的imgId、catId与useCats参数,从self._gts与self._dts中读取相应的bbox、confidence score,存入gt与dt中。

根据dt中的confidence score将dt进行重新排序,将超过每张图片最大检测数maxDets的bbox删除。

将gt与dt中的bbox信息传入g与d中,同时使用iscrowd参数,调用maskUtils函数,获得g与d中所有bbox对应的iou值并返回。

(4)evaluateImg函数,根据传入的图片id、类别id、面积阈值、最大检测数,获得相应的检测结果。

依据useCats函数,从self._gts和self._dts中读取imgId和catId相对应的bbox与confidence score,并存入gt与dt中。

依据g['ignore]和g['area']中的面积与传入的面积阈值的比较,设置gt列表中每一个gt的‘_ignore'参数。依据g['_ignore']数值,对gt进行排序,使得_ignore为0的点排在前,_ignore为1的点排在后。

依据dt的confidence score对dt列表进行排序,取其中前maxDet个dt。

依据传入的imgId、catId,调用computeIoU函数,计算获得所有dt与gt相对应的m*n的iou矩阵,记为ious。

根据iou阈值数,建立gtm、dtm、gtIg、dtIg矩阵,分别不同的阈值下,与gt匹配的dt的id,与dt匹配的gt的id,gt是否被忽略,dt是否被忽略。

随后,使用三层循环进行遍历。第一层循环遍历所有iou阈值,第二次循环遍历所有dt,对于每一个dt,设置最佳iou为min[当前iou阈值,1-1e-10],并设置匹配标签m为-1,表示未匹配。第三层循环遍历所有gt。

1’在每一次匹配中,由于dt是按scores排序的,因此如果当前的gt已经与其他置信度更高的dt相匹配且该gt的iscrowd标签为假,则跳过这一次匹配。也就是说,非密集标签的gt只能匹配一个dt,而密集标签的gt可以匹配多个dt。而且,在_prepare()函数中,凡是iscrowd标签为真的gt,其ignore都被设为了真。

2‘由于gt是按照ignore进行排序的,值为0的在前,值为1的在后,因此,对于每一个dt,当它遍历到了ignore为1的gt,若它的匹配标签不为-1,即它已经与某一个gt匹配,则停止该dt对剩余gt的遍历,否则,若它的匹配标签仍为-1,则继续其对剩余gt的匹配。

3’依据前文计算获得的ious矩阵,获取当前dt与gt相对应的iou,若该iou小于最佳iou,则忽略该次匹配,若该iou超过最佳iou,则更新最佳iou与匹配标签m。

当该dt遍历完所有的gt后,若其匹配标签仍为-1,则继续进行下一个dt的匹配。

若该dt已与某一个gt匹配,且该gt是被ignore的,则将该dt也设为ignore。

随后,使用dt、gt的id值更新dtm、gtm。

对于未匹配的dt,若其面积不在给定的面积阈值内,则将其设为ignore。

对于匹配的结果进行存储,结果为一个字典。

因此,对于每一个dt而言,在其对所有的gt匹配结束后,共存在4种可能:

1‘’该dt与某一个gt匹配成功,且该gt未被ignore。(TP)

2‘’该dt与某一个gt匹配成功,由于该gt被ignore,所以该dt也被ignore。

3‘’该dt未与任意一个gt匹配,但该dt由于面积不在给定阈值内,所以该dt被ignore。

4‘’该dt未与任意一个gt匹配,且未被ignore。(FP)

(5)accumulate函数,该函数将evaluate函数中计算得到的结果进行累加。

T表示有多少个iou的阈值,R代表有多少个recall的阈值,K表示有多少个类别,A表示有多少个面积阈值,M表示有多少个最大检测数。

初始化precision、recall、scores矩阵。

获得不含重复数据的种类列表k_list、最大检测数列表m_list、面积阈值列表a_list、图片id列表i_list、图片总数I0、面积阈值总数A0。

随后,展开三层循环进行遍历,第一层循环遍历所有的种类,第二层循环遍历所有的面积阈值,第三层循环遍历所有的最大检测数。

从self.evalImgs中,获取当前种类、当前面积阈值下的所有图片的检测结果,按dtScores维度(即dt的置信度分数),取每张图片的前maxDet个结果并进行拼接,并按照dtScores得分进行排序。

从self.evalImags中,获取在当前种类、面积阈值下,每张图片不超过maxDet的检测结果,分别按照dtMatches、dtIgnore维度进行拼接。同时,按照gtIgnore维度,对所有的结果进行拼接。

所有的检测结果中,gt未被忽略的为正样本。如果dt与gt匹配,且gt未被忽略,则该dt为TP,如果dt未与gt匹配,且dt未被忽略&#x

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值