导语
物体检测一般使用**map
**来评价目标检测的检测效果,如检测效果不好时,需深入了解哪些数据检测效果不好,如何调试模型的性能以及如何优化它获得更好的性能。这时一个好的开源库 TIDE
则可以准确实现对象检测,对于提高物体检测的模型的准确性有很大指导方向。
01 目标检测评价标准map
在目标检测中,评价模型好坏主要有两个关键方面:速度和准确性,一般的模型会在两者之间权衡,这里我们主要专注于分析模型的准确性。
目标检测预测一张图片中对象的类别、位置以及置信度。因此检测对象是由三个属性定义:
1. 对象类别(如人);
2. 对象的边界框(如[3, 52, 150, 79])
3. 置信度得分(如 58.3%)
对于map的定义以及计算方式请参考这里: map定义及计算
虽然使用map用一个数字来简洁的总结模型的性能,但是很难从map中分解出物体检测和实例分割中的错误:误检可能是重复检测、错误分类、错误定位、与背景混淆甚至是错误分类和错误定位。
02 TIDE(Toolkit for Identifying Detection and segmentation Errors)
TIDE(Toolkit for Identifying Detection and segmentation Errors)则是为了解决上述问题。它将物体检测的错误结果分为六类,并引入一种方法用于计算每种错误对总体检测性能的贡献度。TIDE是基础map的加强版。
如果你目标检测模型在自定义数据集上训练后具有较低的 mAP
,肯定想知道我们可以在哪些地方进一步改进它。这就是 TIDE 大放异彩的地方。TIDE
将帮助您查明您应该专注于改进的确切错误类型,以使您的模型运行得更好。
TIDE的错误类型
如上图所示:前景 IoU 阈值表示为 tᶠ,背景阈值表示为 tᵇ,除非另有说明,否则设置为 0.5 和 0.1。
- 分类错误:IoUᵐᵃˣ ≥ tᶠ 对于错误类别的box(即,定位正确但分类错误)。
- 定位误差: tᵇ ≤ IoUᵐᵃˣ ≤ tᶠ 对于正确类别的box(即,分类正确但定位不正确)。
- Cls 和 Loc 错误:tᵇ ≤ IoUᵐᵃˣ ≤ tᶠ 对于错误类别的box(即,分类错误和定位错误)。
- 重复检测错误:IoUᵐᵃˣ ≥ tᶠ 用于正确类别的box,但另一个更高得分的检测已经与该 GT 匹配(即,如果不是更高得分的检测,将是正确的)。
- 背景误差:IoUᵐᵃˣ ≤ tᵇ for all box(即,检测到的背景为前景)。
- Missed GT Error:分类或定位错误尚未涵盖的所有未检测到的ground truth(假阴性)。
TIDE 旨在替代COCO 评估工具包,入门非常简单:
from tidecv import TIDE, datasets
tide = TIDE()
tide.evaluate(datasets.COCO()),
datasets.COCOResult('path/to/your/results/file'),
mode=TIDE.BOX()
tide.summarize() # Summarize the results as tables in the console
tide.plot() # Show a summary figure `
其中包含一个代码示例,展示了如何将 TIDE 与 Tensorflow 对象检测 API 结合使用,代码链接如下:
[代码示例]
from tidecv import TIDE, datasets, Data
import json
with open(cocoGtFile) as f: # 加载标签的json文件
gt_json = json.load(f)
with open(cocoDtFile) as f: #加载检测结果的json文件
dets_json = json.load(f)
tide = TIDE()
gt_data = Data('gt_data')
det_data = Data('det_data')
for det in gt_json['annotations']:
image = det['image_id']
_cls = det['category_id']
box = det['bbox'] if 'bbox' in det else None
mask = det['segmentation'] if 'segmentation' in det else None
gt_data.add_ground_truth(image, _cls, box, mask)
for det in dets_json['annotations']:
image = det['image_id']
_cls = det['category_id']
score = det['score']
box = det['bbox'] if 'bbox' in det else None
mask = det['segmentation'] if 'segmentation' in det else None
det_data.add_detection(image, _cls, score, box, mask)
tide.evaluate(gt_data, det_data, mode=TIDE.BOX) # 两者通过tide对比
tide.summarize()
tide.plot()
对预测结果分析对比如下图:
通过对比 EfficientDet-D0
和 EfficientDet-D7
模型的 COCO 评估结果,我们看到
- EfficientDet-D7的 mAP 高出约 15%,这是因为与 EfficientDet-D0 相比,EfficientDet-D7 模型的容量更大,模型参数多约 13 倍。
注意: TIDE 和 pycocotools 中的 mAP 计算之间存在一些差异,差异如下:map计算对比,这就是 COCO mAP 和 TIDE mAP 在某些情况下不相等的原因。
在比较 TIDE 评估结果时,我们可以看到两个模型的分类和重复检测误差相似,而D7 模型的定位误差低 2%。与 D0 相比,D7 模型将背景检测为前景的误差高 2%,而 D7 模型的漏失 GT 误差小 3.5%。
这可以通过以下事实来解释:D7 模型具有更高的召回率,从而降低了错过的 GT 错误,但同时也增加了背景分类错误。比较中有趣的部分是误报和误报的 mAP。我们可以看到两个模型之间的误报率非常相似。这可能表明数据集中有一些未标记的数据,并且模型置信度高。
另一方面,D7 模型的假阴性率明显较低。所以,较大的模型可以检测较小容量模型难以处理的对象实例。
当我们想比较不同的模型架构时,TIDE 模型评估更有用,所以请自行尝试。TIDE
包含对不同对象检测和分割模型的附加分析。先前分析的 TIDE 图如下所示。
结语
使用TIDE 提供的更具洞察力的指标可以更轻松地识别数据集中的特定问题,例如未标记的图像、松散的边界框等。它还可以帮助您识别模型容量不足以满足特定问题的情况手头的任务。一一解决这些问题最终将引导获得明显更好的机器算法,并帮助为实际应用创建生产就绪模型!