共计 2266 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
目标检测是计算机视觉中的重要任务,但评估模型性能却常常让初学者感到困惑。不同于分类任务中简单的准确率指标,目标检测需要同时考虑定位精度和分类准确性,这导致评估指标更加复杂多样。不同指标之间计算逻辑差异大,选择合适的评估标准往往成为项目中的第一个拦路虎。

7 大核心指标解析
1. mAP@0.5:0.95
mAP(mean Average Precision)是最常用的综合评估指标。其计算过程分为三步:
- 对于每个类别,计算不同 IoU 阈值下的 AP(Average Precision)
- 在 IoU 阈值 0.5 到 0.95 之间(步长 0.05)取平均
- 对所有类别的 AP 取平均得到 mAP
数学表示为:
mAP = 1/N Σ (1/M Σ AP@IoU_threshold)
其中 N 是类别数,M 是 IoU 阈值数量(通常为 10 个)。
2. IoU 阈值选择
IoU(Intersection over Union)衡量预测框与真实框的重合程度:
IoU = Area of Overlap / Area of Union
阈值选择直接影响评估结果:
- 高阈值(如 0.75)要求更精确的定位
- 低阈值(如 0.5)对定位误差更宽容
3. Recall-Precision 曲线
PR 曲线直观展示模型在不同置信度阈值下的表现:
- X 轴:Recall = TP / (TP + FN)
- Y 轴:Precision = TP / (TP + FP)
曲线下面积即为 AP 值。
4. F1-Score
F1-Score 是 Precision 和 Recall 的调和平均数:
F1 = 2 * (Precision * Recall) / (Precision + Recall)
特别适合类别不平衡的场景。
5. FPS(Frames Per Second)
实时性关键指标,计算模型每秒处理的帧数:
FPS = 1 / (单帧推理时间 + 后处理时间)
6. FLOPs(Floating Point Operations)
理论计算量指标,反映模型复杂度:
FLOPs = Σ (层输入维度 × 层输出维度 × 卷积核面积)
7. 内存占用
包含两方面:
- 模型大小(存储占用)
- 推理时显存占用(运行时需求)
代码实战:COCO 指标计算
1. 准备 COCO 格式数据
from pycocotools.coco import COCO
# 加载标注文件(JSON 格式)annFile = 'annotations/instances_val2017.json'
coco = COCO(annFile)
# 获取类别映射
catIds = coco.getCatIds()
cats = coco.loadCats(catIds)
print(f'Loaded {len(cats)} categories')
2. 转换预测结果
import numpy as np
# 假设 predictions 是模型原始输出
coco_predictions = []
for pred in predictions:
coco_pred = {'image_id': pred['image_id'],
'category_id': pred['category_id'],
'bbox': [pred['x'], pred['y'], # 左上角坐标
pred['width'], pred['height'] # 宽高
],
'score': pred['confidence']
}
coco_predictions.append(coco_pred)
3. 调用评估 API
from pycocotools.cocoeval import COCOeval
# 加载评估器
cocoEval = COCOeval(coco, coco_predictions, 'bbox')
# 设置评估参数
cocoEval.params.iouThrs = np.linspace(0.5, 0.95, 10)
cocoEval.params.maxDets = [1, 10, 100] # 每张图最多检测数
# 执行评估
cocoEval.evaluate()
cocoEval.accumulate()
cocoEval.summarize()
# 输出 mAP 指标
print(f'mAP@0.5:0.95 = {cocoEval.stats[0]:.3f}')
4. 可视化 PR 曲线
import matplotlib.pyplot as plt
# 获取某类别的评估结果
class_id = 1 # 行人类别
cocoEval.params.catIds = [class_id]
cocoEval.evaluate()
# 提取 precision-recall 数据
precision = cocoEval.eval['precision'][0,:,0,0,2]
recall = cocoEval.params.recThrs
# 绘制曲线
plt.plot(recall, precision)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title(f'PR Curve for class {class_id}')
plt.grid(True)
plt.show()
常见误区
- 单一指标优化陷阱 :只优化 mAP 可能导致其他关键指标(如 FPS)恶化
- 测试集数据泄漏 :在验证集上调整参数会导致指标虚高
- 指标理解偏差 :混淆 AP 与 accuracy,忽略 IoU 阈值的影响
业务场景适配
不同应用场景需要侧重不同指标组合:
- 安防监控 :高 Recall(减少漏检)比高 Precision 更重要
- 自动驾驶 :严格限制 FPS(实时性需求)和 mAP@0.75(高精度定位)
- 移动端应用 :优先考虑模型大小和内存占用
建议根据业务需求建立加权评分体系,例如:
综合得分 = 0.5*mAP + 0.3*FPS + 0.2*(1/ 模型大小)
正文完
发表至: 未分类
近三天内
