mmdetection 实战:精准获取并可视化各类别AP,深入解析IoU阈值设定
1. 为什么需要精细化分析各类别AP在目标检测项目中我们常常会遇到这样的场景模型整体mAP平均精度看起来不错但某些关键类别的检测效果却差强人意。比如在自动驾驶场景中行人和车辆的检测精度可能比交通标志的精度更重要。这时候只看全局mAP就像用一把尺子量所有东西——根本无法反映关键类别的真实表现。我去年做过一个工业质检项目就深有体会。当时模型对常见缺陷的检测AP达到0.9但对一种罕见但致命的裂纹类型AP只有0.3。如果不单独分析各类别AP这个致命问题就会被整体0.85的mAP掩盖。这就是为什么我们需要类粒度分析了解每个类别的独立表现特定IoU阈值分析不同业务对定位精度的要求不同比如车牌识别需要更高IoU可视化对比直观发现模型在不同类别上的表现差异mmdetection作为业界领先的目标检测框架其实已经内置了这些能力只是默认配置没有开启。接下来我就手把手带大家解锁这些高级分析功能。2. 快速获取各类别AP的两种实战方法2.1 修改源码法适合长期配置打开mmdetection的评估核心文件通常位于mmdet/datasets/coco.py找到约300行处的evaluate函数。你会看到这样的参数定义def evaluate(self, results, metricbbox, loggerNone, jsonfile_prefixNone, classwiseFalse, # 关键参数 proposal_nums(100, 300, 1000), iou_thrsNone, metric_itemsNone):把classwise参数默认值改为True这样每次评估都会自动输出各类别AP。修改后需要重新编译python setup.py install build注意如果项目中有多人协作记得在团队文档中记录这个修改避免其他人困惑为什么输出结果不一样了。2.2 命令行参数法推荐临时使用更灵活的方式是在测试时通过命令行参数动态控制python tools/test.py \ configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ --eval bbox \ --options classwiseTrue这种方法的好处是不需要修改源码特别适合快速验证不同模型在各类别上的表现差异自动化测试脚本中灵活控制输出内容临时性分析需求3. 精准控制IoU阈值的三大技巧默认情况下mmdetection会计算0.5:0.05:0.95区间内多个IoU阈值下的AP即COCO标准评估方式。但在某些业务场景我们只需要特定IoU阈值下的结果。3.1 源码定制法继续修改coco.py中的evaluate函数显式指定iou_thrsdef evaluate(self, results, metricbbox, loggerNone, jsonfile_prefixNone, classwiseTrue, proposal_nums(100, 300, 1000), iou_thrs[0.5], # 只计算IoU0.5的情况 metric_itemsNone):3.2 命令行快捷法测试时添加--show-score-thr参数python tools/test.py \ configs/yolo/yolov3_d53_320_273e_coco.py \ checkpoints/yolov3_d53_320_273e_coco-421362b6.pth \ --show-score-thr 0.53.3 高级定制修改eval逻辑如果需要更精细的控制如不同类别使用不同IoU阈值可以修改evaluate_det_segm函数中的precision计算逻辑# 原始代码 precision precisions[:, :, idx, 0, -1] # 修改为只取IoU0.5的结果第一个维度对应iou_thrs precision precisions[0, :, idx, 0, -1]这个修改相当于固定使用iou_thrs列表中的第一个阈值前面我们设置了iou_thrs[0.5]。4. 可视化分析实战让数据说话获取原始数据只是第一步如何直观呈现结果同样重要。这里分享我常用的两种可视化方法4.1 类AP柱状图在测试脚本后添加以下代码生成类AP对比图import matplotlib.pyplot as plt # 假设categories和aps是从评估结果中提取的 categories [person, car, traffic light] aps [0.87, 0.92, 0.65] plt.figure(figsize(10, 5)) plt.bar(categories, aps) plt.title(AP0.5 per Category) plt.ylim(0, 1.0) plt.savefig(class_ap.png)4.2 混淆矩阵分析虽然严格来说不是AP分析但混淆矩阵能帮我们发现类别间的混淆情况from mmdet.core.evaluation import eval_map import seaborn as sns # 获取预测结果和标注 results ... # 模型预测结果 annotations ... # 标注数据 # 计算混淆矩阵 confusion_matrix eval_map(results, annotations, iou_thr0.5) # 可视化 plt.figure(figsize(12, 10)) sns.heatmap(confusion_matrix, annotTrue, fmt.2f) plt.savefig(confusion_matrix.png)5. 避坑指南我踩过的那些雷在实际项目中有几个容易忽略的细节需要特别注意版本兼容性问题不同mmdetection版本中评估函数的参数可能略有不同建议先查阅对应版本的源码多进程评估的坑使用--launcher pytorch等多进程评估时修改的源码可能不会立即生效COCO评估的特殊性某些自定义数据集格式可能需要调整评估逻辑IoU阈值的选择依据人脸检测常用0.5文字检测可能需要0.7工业缺陷检测往往需要0.9以上记得有次我为了赶进度直接用了默认的0.5:0.05:0.95评估结果上线后发现模型在实际场景中需要0.7以上IoU表现远低于测试结果。这个教训让我明白评估标准必须与业务需求严格对齐。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2437136.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!