(深度学习评估指标)——MS COCO detection evaluation metrics

本文深入解析COCO数据集中的评估指标,包括平均精度(AP)和平均召回率(AR)的计算方法,以及各类目标大小的定义。通过实例分析,如ResNet检测器的表现,揭示定位误差、类别混淆和背景假正例对检测性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章可以教会你如何看论文最下面的评价指标曲线图。
目前网上关于coco metrics的翻译都比较差,希望以此提高整体水平。
如有不足,还请指教!

1、概述:

本文介绍MC COCO数据集用到的Metrics

2、Metrics 简介

在这里插入图片描述
说明:
1、除非有其他说明,否则AP和AR是多个IoU的平均值,具体来说就是我们使用十个不同的阈值.50:.05:.95。相对于传统只使用单个0.5的阈值相比,这是一个突破。使用平均IoU可以提高探测器的定位精度。
2、AP是各个种类的平均值,传统上我们也叫作mAP,但是在COCO Metrics中我们认为他们是一样的。
3、AP(averaged across all 10 IoU thresholds and all 80 categories)将被用来确定挑战赛的冠军,它是最重要的评价指标。
4、在COCO数据集中,小目标的数量更多,具体为:

  • 41% of objects are small (area < 322)
  • 34% are medium (322 < area < 962)
  • 24% are large (area > 962)

area的计算方法:像素点的个数
5、AR是这样计算的,每张图给出固定个数个detection,比如分别给出1个、10个、100个detection,我们分别计算这三种不同条件下的recall,取其中的最大值。然后还需要进一步在类别和IOU阈值上进行平均。
6、在计算Metrics时,一张图最多使用得分最高的100个detection参与计算,这100个detection可以属于不同的类别。
7、在评价bounding boxes和segmentation masks时,评价指标是完全一样的。但是要注意它们的IOU计算方式不同。

3. Evaluation Code

python API:https://github.com/cocodataset/cocoapi/blob/master/PythonAPI/pycocotools/cocoeval.py
在运行evaluation code前,首先要保证你的数据格式正确。
格式另外介绍

4. Analysis Code

为了更好的分析结果,COCO官方还提供了analyze()函数,它可以可视化误报的情况(false postive),以下两幅图是2015年何凯明等人使用ResNet(bbox)检测器的分析结果
在这里插入图片描述
1、C75: 在IOU=0.75条件下,recall-AP曲线下的面积
2、C50: 在IOU=0.5条件下,recall-AP曲线下的面积
3、Loc: 在IoU=.10条件下,recall-AP曲线下的面积(由于此时IoU的阈值很小,可以认为忽略了定位误差,但保证了不会重复检测——localization errors ignored, but not duplicate detections)
4、Sim: 去除相似类别的混淆后的recall-AP曲线下的面积
5、Oth: 不同类别之间的混淆后的recall-AP曲线下的面积
6、BG: 去除背景上的假正例后的recall-AP曲线下的面积
7、FN: 所有错误都去掉后的recall-AP曲线下的面积

注:关于Sim,Oth,BG,FN
每个假正例(False Positive)被分类成四种类型:
(1)Loc:定位错误(一种与正确类重叠交叉面积在0.1到0.5之间的检测方式)
(2)Sim:与相似类别混淆 ,什么是相似类别(比如狼、狗都属于犬科这种),注意人类没有相似类别
(3)Oth:不同类别之间的混淆 ,把猫认成了狗
(4)BG:对于背景上的假正例

对于上面两张图的分析: 对于overall-all-all这个图来说,IOU在0.75时的AP是0.399,如果我们去掉定位误差,那么它的AP增长到了0.628,但是如果只去掉不同类别之间的混淆,AP仅仅增长到了0.713。如果把所有的误报(FN)都去掉的话,那么AP直接增长到了0.870,剩下的0.130就是漏报了(missing detection)。总的来说,ResNet的误差主要来自于定位误差和背景上的假正

For a given detector, the code generates a total of 372 plots! There are 80 categories, 12 supercategories, and 1 overall result, for a total of 93 different settings, and the analysis is performed at 4 scales (all, small, medium, large, so 934=372 plots). The file naming is [supercategory]-[category]-[size].pdf for the 804 per-category results, overall-[supercategory]-[size].pdf for the 124 per supercategory results, and overall-all-[size].pdf for the 14 overall results. Of all the plots, typically the overall and supercategory results are of the most interest.

Note: analyze() can take significant time to run, please be patient. As such, we typically do not run this code on the evaluation server; you must run the code locally using the validation set. Finally, currently analyze() is only part of the Matlab API; Python code coming soon.

<think>好的,我需要帮助用户解决在MMDetection中使用coco_metric.py计算指标时数据集测试结果为空的问题。根据用户提供的引用内容,解决方案涉及到修改coco_metric.py文件和class_names.py文件中的数据集类别。 首先,我要确认用户的问题可能出在哪里。测试结果为空通常有几个常见原因:数据集的类别未正确配置,导致评估时无法匹配预测结果和真实标签;或者评估指标的计算过程中存在路径或文件读取错误;还有可能是数据预处理或后处理的步骤有误。 根据引用[1],用户提到在MMDetection3.x版本中,需要修改coco_metric.py文件来查看每个类别的mAP结果。这可能涉及到在计算指标时正确加载类别信息,并确保评估函数能够正确解析预测结果和真实标注的类别ID。 引用[2]指出,用户需要修改class_names.py中的coco_classes数据集类别。这说明用户可能在使用自定义数据集,或者在COCO数据集的类别定义上与当前配置不符,导致评估时类别不匹配,从而结果为空。 接下来,我需要将这些信息整合成一个解决方案。步骤可能包括: 1. 检查数据集配置是否正确,确保测试集路径和标注文件正确无误。 2. 修改coco_metric.py中的相关代码,确保在计算指标时正确获取类别信息,并处理预测结果。 3. 更新class_names.py中的类别列表,使其与当前数据集的类别一致,避免ID不匹配的问题。 4. 验证修改后的配置,重新运行测试,检查输出结果是否正常。 另外,可能还需要考虑其他因素,例如数据加载是否正确,预测结果是否生成,以及日志文件中的错误信息,这些都能帮助进一步诊断问题。例如,如果类别ID在预测结果中超出了数据集定义的类别数量,评估时可能会忽略这些结果,导致空值。 需要确保所有修改后的文件被正确保存,并且重新编译或重新安装相关模块(如果有必要),以避免缓存导致的旧代码执行。同时,建议用户在修改前后进行代码版本控制,方便回滚和比较变更。 最后,生成相关问题时要围绕MMDetection的配置、自定义数据集的评估、常见错误排查等方面,帮助用户扩展相关知识,预防类似问题。</think>针对MMDetectioncoco_metric.py计算指标时数据集测试结果为空的问题,以下是逐步解决方案: ### 解决方案 1. **检查数据集配置** - 确认`configs/_base_/datasets/coco_detection.py`中`test`字段的`ann_file`和`img_prefix`路径正确 - 验证测试集标注文件是否包含有效标注内容(可使用COCO API检查) 2. **修改评估指标参数** ```python # 修改coco_metric.py中的compute_metrics方法 def compute_metrics(self, results): metrics = ['bbox'] coco_evaluator = CocoEvaluator(self.ann_file, metrics) # 添加结果解析异常捕获 try: coco_evaluator.evaluate(results) except Exception as e: print(f"Evaluation error: {str(e)}") return coco_evaluator.get_results() ``` 3. **更新类别定义文件** ```python # 修改mmdet/evaluation/functional/class_names.py def get_classes(cls, dataset_type): if dataset_type == 'coco': return [ 'person', 'bicycle', 'car', ..., # 必须与测试集实际类别完全一致 ] # 添加自定义数据集处理分支 elif dataset_type == 'my_custom_dataset': return ['class1', 'class2', ...] ``` 4. **启用详细日志输出** ```python # 在configs中添加评估配置 evaluation = dict( interval=1, metric=['bbox'], save_best='bbox_mAP', rule='greater', # 新增详细输出参数 classwise=True, outfile_prefix='./work_dirs/coco_eval') ``` ### 关键验证步骤 1. **检查预测结果格式**:确保模型输出为标准的COCO JSON格式,包含: ```json { "image_id": int, "category_id": int, "bbox": [x,y,w,h], "score": float } ``` 2. **验证类别对应关系**: $$ \text{预测类别ID} \in \{0,1,...,N-1\} \quad \text{其中}N=\text{数据集类别总数} $$ 3. **查看中间输出**: ```bash tail -f work_dir/log.txt | grep 'Evaluating' ``` 应出现类似输出: ``` Evaluating bbox... Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.387 ``` ### 常见错误排查 - **类别ID偏移**:当使用预训练模型时,若自定义数据集类别数与COCO不同,需修改`num_classes`参数 - **标注格式错误**:使用`pycocotools.coco`验证标注文件: ```python from pycocotools.coco import COCO coco = COCO(ann_file) print(coco.getCatIds()) # 应输出有效类别ID列表 ``` [^1]: MMDetection官方文档建议通过修改评估参数解决类别指标显示问题 [^2]: COCO数据格式要求类别ID从1开始连续编号
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值