首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解COCO评价“最大检测”

理解COCO评价“最大检测”
EN

Stack Overflow用户
提问于 2018-10-16 15:47:26
回答 2查看 12.1K关注 0票数 19

我开始使用茧皮来评估使用对象检测API训练的模型。在阅读了各种解释平均精度(mAP)和回忆的资料后,我对茧中使用的“最大检测”参数感到困惑。

根据我所理解的(例如这里这里这里),人们通过计算精确性和对各种模型分数阈值的回忆来计算mAP。这给出了查全率曲线,并计算了mAP作为该曲线下面积的近似值。或者,用定义的召回范围内最大精度的平均值(0:0.1:1)来表示。

然而,cocoapi似乎计算出一个给定数量的最高检测值(maxDet)的精确性和召回率,并且得分最高。并由此得到maxDets = 1, 10, 100的查全率曲线.为什么这是一个很好的度量,因为它显然与上面的方法不一样(它可能不包括数据点)?

在我的例子中,每幅图像有3000个对象。使用cocoapi评估结果会让人产生可怕的回忆,因为它将检测到的对象数量限制在100个。

为了测试目的,我将评估数据集作为基本真理和检测对象(带有一些人工分数)。我期待着精确性,并能很好地回忆起实际发生的事情。但一旦我输入了100多个对象,查准率和召回率就会随着“检测对象”数量的增加而下降。即使他们都是“正确的”!这有什么意义?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-02 15:02:52

我得出的结论是,这正是茧定义它的度量的方式。这在他们的上下文中可能是有意义的,但我也可以根据我读到的和链接到的文章来定义我自己的(这就是我所做的)。

票数 7
EN

Stack Overflow用户

发布于 2019-05-14 07:15:56

您可以更改maxDets参数并定义一个新的summarize()实例方法。

让我们创建一个COCOeval对象:

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
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.

如果在dataset上运行上述方法,您将得到一个类似于以下内容的输出:

代码语言:javascript
复制
 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
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52839368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档