8.8 KiB
Executable File
8.8 KiB
Executable File
基于共同匹配集的3D指标对比 - 使用指南
问题背景
在比较两个模型的3D检测性能时,发现两个模型匹配到的样本数量不一致:
Model A: 匹配了 440,408 个 vehicle
Model B: 匹配了 491,768 个 vehicle
差异: 51,360 个样本 (11.7%)
问题:无法确定性能差异是因为模型质量不同,还是因为匹配了不同的目标。
解决方案:只比较两个模型都成功匹配到GT的目标,确保对比的是相同目标的3D性能。
快速开始
方法一:使用一键脚本(推荐)
bash eval_tools/compare_models_with_common_matches.sh
这个脚本会自动完成以下步骤:
- 评测 Model 1(mono3d)并保存详细匹配
- 评测 Model 2(yolov5s)并保存详细匹配
- 找出共同匹配的GT目标
- 生成基于共同匹配的对比报告
- 生成传统对比报告(用于参考)
方法二:手动执行步骤
步骤1:评测模型并保存详细匹配
# 评测 Model 1
python eval_tools/eval.py \
--config eval_tools/configs/eval_config_mono3d.yaml \
--save-detailed-matches
# 评测 Model 2
python eval_tools/eval.py \
--config eval_tools/configs/eval_config_yolov5.yaml \
--save-detailed-matches
输出文件:
evaluation_report.json- 评测报告detailed_3d_matches.json- 详细匹配信息(新增)
步骤2:找出共同匹配
python eval_tools/find_common_matches.py \
--model1-matches eval_results/model1/detailed_3d_matches.json \
--model2-matches eval_results/model2/detailed_3d_matches.json \
--output common_matches.json \
--model1-name "mono3d" \
--model2-name "yolov5s-300w"
输出示例:
================================================================================
COMMON MATCH STATISTICS
================================================================================
Overall:
Model 1 Total Matches: 440,408
Model 2 Total Matches: 491,768
Common Matches: 425,163 (96.5% of Model 1)
Model 1 Unique: 15,245 (3.5%)
Model 2 Unique: 66,605 (13.5%)
Per-Class Statistics:
Class Model1 Model2 Common Common% M1 Unique M2 Unique
--------------------------------------------------------------------------------
vehicle 440,408 491,768 425,163 96.5% 15,245 66,605
步骤3:比较模型(基于共同匹配)
python eval_tools/compare_models.py \
--model1 eval_results/model1/evaluation_report.json \
--model2 eval_results/model2/evaluation_report.json \
--model1-name "mono3d" \
--model2-name "yolov5s-300w" \
--common-matches common_matches.json \
--output-dir comparison_common_matches
关键参数:
--common-matches: 指定共同匹配数据文件- 如果不提供此参数,将使用传统方式比较(所有匹配)
对比报告解读
共同匹配对比报告
================================================================================
3D METRICS COMPARISON (COMMON MATCHES ONLY)
================================================================================
Match Statistics:
mono3d Total Matches: 440,408
yolov5s-300w Total Matches: 491,768
Common Matches: 425,163 (96.5% of mono3d)
mono3d Unique: 15,245
yolov5s-300w Unique: 66,605
VEHICLE (Common Matches: 425,163):
Metric mono3d yolov5s-300w Diff Change %
------------------------------------------------------------------------------------
Lateral (m) 1.3251 1.2103 -0.1148 -8.66% ✓
Longitudinal (m) 2.5892 2.4231 -0.1661 -6.42% ✓
Heading (rad) 0.2256 0.3098 +0.0842 +37.32% ✗
Note: 这些统计基于两个模型都成功匹配的目标,排除了只被一个模型匹配的目标。
关键信息解读
-
匹配统计:
- Common Matches: 两个模型都匹配到的GT数量
- Model Unique: 只被该模型匹配的GT数量
- Common%: 共同匹配占该模型总匹配的百分比
-
3D误差对比:
- 基于相同的GT目标进行比较
- 可以公平评估两个模型的3D预测质量
- ✓ 表示model2更好,✗ 表示model1更好
-
独有匹配分析:
- Model 1 Unique: 15,245 (3.5%)
- 这些是只有model1匹配到的目标
- 可能是容易匹配的目标
- Model 2 Unique: 66,605 (13.5%)
- 这些是只有model2匹配到的目标
- 说明model2的召回率更高
- Model 1 Unique: 15,245 (3.5%)
数据文件说明
detailed_3d_matches.json
保存每个匹配对的详细信息:
{
"case_019b178d": {
"frame_000018": {
"vehicle": [
{
"gt_id": "a1b2c3d4e5f6g7h8",
"gt_bbox": [90.48, 561.98, 241.52, 714.00],
"gt_center_3d": [-7.13, 0.91, 8.20],
"det_bbox": [91.2, 562.5, 240.8, 713.2],
"det_center_3d": [-7.25, 0.89, 8.35],
"iou": 0.89,
"confidence": 0.87478,
"errors": {
"lateral": 0.12,
"longitudinal": 0.15,
"heading": 0.05
},
"distance": {
"longitudinal": 8.20,
"lateral": -7.13
}
}
]
}
}
}
common_matches.json
包含共同匹配索引和重新计算的统计:
{
"match_statistics": {
"model1_total": 440408,
"model2_total": 491768,
"common": 425163,
"common_percentage_of_model1": 96.5
},
"model1_3d_stats": {
"vehicle": {
"num_samples": 425163,
"lateral_error": {"mean": 1.3251, "std": 0.8745},
"longitudinal_error": {"mean": 2.5892, "std": 1.2341}
}
},
"model2_3d_stats": { ... }
}
使用场景
场景1:公平对比两个模型的3D性能
问题:两个模型召回率不同,匹配的目标不一样。
方案:使用共同匹配对比,确保比较相同目标的预测质量。
# 使用 --common-matches 参数
python eval_tools/compare_models.py \
--model1 model1_report.json \
--model2 model2_report.json \
--common-matches common_matches.json \
--output-dir fair_comparison
场景2:分析模型独有匹配的特点
问题:想知道为什么一个模型能匹配更多目标。
方案:查看 common_matches.json 中的统计信息。
import json
with open('common_matches.json') as f:
data = json.load(f)
stats = data['match_statistics']
print(f"Model 1 Unique: {stats['model1_unique']}")
print(f"Model 2 Unique: {stats['model2_unique']}")
# 可以进一步分析独有匹配的距离分布、置信度等
场景3:对比不同训练策略的效果
问题:调整了训练参数,想知道3D精度是否真的提升。
方案:基于共同匹配对比,排除召回率变化的影响。
注意事项
-
存储开销:
detailed_3d_matches.json约为evaluation_report.json的 5-10 倍- 建议只在需要对比时使用
--save-detailed-matches
-
GT唯一标识:
- 基于2D bbox坐标生成MD5哈希
- 确保同一个GT在两个模型中有相同的ID
-
向后兼容:
- 不使用
--save-detailed-matches时,行为与之前完全一致 - 不使用
--common-matches时,compare_models.py 执行传统对比
- 不使用
-
性能考虑:
- 保存详细匹配会略微增加评测时间(约5-10%)
- 主要开销在JSON序列化
常见问题
Q1: 为什么Common Matches不是100%?
A: 有以下几种可能:
- 模型的召回率不同
- IoU阈值导致的边界情况
- 2D检测质量差异
Q2: 独有匹配有什么特点?
A: 可以使用以下分析:
# find_common_matches.py 会输出Per-Class统计
python eval_tools/find_common_matches.py ...
查看输出中的 "Model X Unique" 数量和比例。
Q3: 如何可视化独有匹配?
A: 可以基于 detailed_3d_matches.json 找出独有匹配的case和frame,然后可视化:
# 找出 model2 独有的匹配
for case in model2_matches:
for frame in model2_matches[case]:
for cls in model2_matches[case][frame]:
for match in model2_matches[case][frame][cls]:
gt_id = match['gt_id']
if gt_id not in common_gt_ids:
# 这是 model2 独有的匹配
visualize(case, frame, match)
总结
使用共同匹配对比方案:
- ✅ 公平对比:确保比较相同目标的预测质量
- ✅ 问题诊断:识别哪些目标一个模型能匹配而另一个不能
- ✅ 性能分析:可以单独分析各模型独有匹配的特点
- ✅ 向后兼容:不影响现有评测流程
相关文档
- COMMON_MATCH_COMPARISON_DESIGN.md - 详细设计方案
- eval_tools/find_common_matches.py - 共同匹配查找工具
- eval_tools/compare_models.py - 模型比较工具