导语 ? ? 物体检测一般使用**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(假阴性)。
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 jsonwith 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 = https://www.it610.com/article/Data('gt_data')
det_data = https://www.it610.com/article/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 图如下所示。
文章图片
更多cv关注公众号【所向披靡的张大刀】
推荐阅读
- 目标检测|【yolov6系列一】深度解析网络架构
- 目标检测|项目实战工具|目标检测评价map精细化系列工具
- 目标检测|yolov5 提速多GPU训练显存低的问题
- 深度学习|人工智能深度学习交流群
- 目标检测|【yolov5 6.0 源码解析】---utils /augmentations.py
- 机器学习|西瓜书《机器学习》第三章重点总结(下,二分类线性判别分析)
- 机器学习|西瓜书《机器学习》第三章重点总结(上,一元线性回归)
- 人工智能|西瓜书《机器学习》第三章重点总结(中2,对数几率回归)
- 机器学习|西瓜书《机器学习》第三章重点总结(中,多元线性回归)