我开始使用cocoapi来评估使用Object Detection API训练的模型。 阅读了各种解释平均平均精度(mAP)和召回率的资料后,我对可可比中使用的“最大检测量”参数感到困惑。
根据我的理解(例如here,here或here),人们可以通过计算各种模型得分阈值的精确度和召回率来计算mAP。这给出了精确调用曲线,并且mAP被计算为该曲线下面积的近似值。或者,以不同的方式表示为定义的召回范围(0:0.1:1)中的最大精度的平均值。
但是,cocoapi似乎可以为给定数量的具有最高分数的最大检测次数(maxDet
)计算精度和召回率。然后从中获得maxDets = 1, 10, 100
的精确调用曲线。为什么这是一个好指标,因为它显然与上述方法不同(可能不包括数据点)?
在我的示例中,每个图像有〜3000个对象。使用cocoapi评估结果的召回性很差,因为它会将检测到的对象数限制为100。
出于测试目的,我将评估数据集作为基本事实和检测到的对象(带有一些人工得分)提供。我希望精确度和召回率非常好,这实际上是在发生。但是,一旦我提供了100多个对象,精度和查全率就会随着“检测到的对象”数量的增加而下降。即使它们都是“正确的”!这有什么意义?
答案 0 :(得分:2)
我得出的结论是,这只是cocoapi定义其指标的方式。在他们的上下文中,这也许很有意义,但是我也可以根据我在上面阅读和链接的文章来定义自己的方法(这就是我所做的)。
答案 1 :(得分:0)
您可以更改maxDets
参数并定义新的summarize()
实例方法。
我们创建一个COCOeval
对象:
cocoEval = COCOeval(cocoGt,cocoDt,annType)
cocoEval.params.maxDets = [200]
cocoEval.params.imgIds = imgIdsDt
cocoEval.evaluate()
cocoEval.accumulate()
cocoEval.summarize_2() # instead of calling cocoEval.summarize()
现在,通过以下方式在summarize_2()
模块中定义cocoeval.py
方法:
def summarize_2(self):
# Copy everything from `summarize` method here except
# the function `_summarizeDets()`.
def _summarizeDets():
stats = np.zeros((12,))
stats[0] = _summarize(1, maxDets=self.params.maxDets[0])
stats[1] = _summarize(1, iouThr=.5, maxDets=self.params.maxDets[0])
stats[2] = _summarize(1, iouThr=.75, maxDets=self.params.maxDets[0])
stats[3] = _summarize(1, areaRng='small', maxDets=self.params.maxDets[0])
stats[4] = _summarize(1, areaRng='medium', maxDets=self.params.maxDets[0])
stats[5] = _summarize(1, areaRng='large', maxDets=self.params.maxDets[0])
stats[6] = _summarize(0, maxDets=self.params.maxDets[0])
stats[9] = _summarize(0, areaRng='small', maxDets=self.params.maxDets[0])
stats[10] = _summarize(0, areaRng='medium', maxDets=self.params.maxDets[0])
stats[11] = _summarize(0, areaRng='large', maxDets=self.params.maxDets[0])
return stats
# Copy other things which are left from `summarize()` here.
如果对数据集运行上述方法,则会得到类似于以下内容的输出:
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=200 ] = 0.507
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=200 ] = 0.699
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=200 ] = 0.575
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=200 ] = 0.586
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=200 ] = 0.519
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=200 ] = 0.501
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=200 ] = 0.598
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=200 ] = 0.640
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=200 ] = 0.566
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=200 ] = 0.564