Files
yolov26_3d/eval_tools/docs/COMMON_MATCH_COMPARISON_USAGE.md

310 lines
8.8 KiB
Markdown
Raw Permalink Normal View History

2026-06-24 09:35:46 +08:00
# 基于共同匹配集的3D指标对比 - 使用指南
## 问题背景
在比较两个模型的3D检测性能时发现两个模型匹配到的样本数量不一致
```
Model A: 匹配了 440,408 个 vehicle
Model B: 匹配了 491,768 个 vehicle
差异: 51,360 个样本 (11.7%)
```
**问题**:无法确定性能差异是因为模型质量不同,还是因为匹配了不同的目标。
**解决方案**只比较两个模型都成功匹配到GT的目标确保对比的是相同目标的3D性能。
## 快速开始
### 方法一:使用一键脚本(推荐)
```bash
bash eval_tools/compare_models_with_common_matches.sh
```
这个脚本会自动完成以下步骤:
1. 评测 Model 1mono3d并保存详细匹配
2. 评测 Model 2yolov5s并保存详细匹配
3. 找出共同匹配的GT目标
4. 生成基于共同匹配的对比报告
5. 生成传统对比报告(用于参考)
### 方法二:手动执行步骤
#### 步骤1评测模型并保存详细匹配
```bash
# 评测 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找出共同匹配
```bash
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比较模型基于共同匹配
```bash
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: 这些统计基于两个模型都成功匹配的目标,排除了只被一个模型匹配的目标。
```
### 关键信息解读
1. **匹配统计**
- Common Matches: 两个模型都匹配到的GT数量
- Model Unique: 只被该模型匹配的GT数量
- Common%: 共同匹配占该模型总匹配的百分比
2. **3D误差对比**
- 基于相同的GT目标进行比较
- 可以公平评估两个模型的3D预测质量
- ✓ 表示model2更好✗ 表示model1更好
3. **独有匹配分析**
- Model 1 Unique: 15,245 (3.5%)
* 这些是只有model1匹配到的目标
* 可能是容易匹配的目标
- Model 2 Unique: 66,605 (13.5%)
* 这些是只有model2匹配到的目标
* 说明model2的召回率更高
## 数据文件说明
### detailed_3d_matches.json
保存每个匹配对的详细信息:
```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
包含共同匹配索引和重新计算的统计:
```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性能
**问题**:两个模型召回率不同,匹配的目标不一样。
**方案**:使用共同匹配对比,确保比较相同目标的预测质量。
```bash
# 使用 --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 中的统计信息。
```python
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精度是否真的提升。
**方案**:基于共同匹配对比,排除召回率变化的影响。
## 注意事项
1. **存储开销**
- `detailed_3d_matches.json` 约为 `evaluation_report.json` 的 5-10 倍
- 建议只在需要对比时使用 `--save-detailed-matches`
2. **GT唯一标识**
- 基于2D bbox坐标生成MD5哈希
- 确保同一个GT在两个模型中有相同的ID
3. **向后兼容**
- 不使用 `--save-detailed-matches` 时,行为与之前完全一致
- 不使用 `--common-matches`compare_models.py 执行传统对比
4. **性能考虑**
- 保存详细匹配会略微增加评测时间约5-10%
- 主要开销在JSON序列化
## 常见问题
### Q1: 为什么Common Matches不是100%
A: 有以下几种可能:
- 模型的召回率不同
- IoU阈值导致的边界情况
- 2D检测质量差异
### Q2: 独有匹配有什么特点?
A: 可以使用以下分析:
```bash
# find_common_matches.py 会输出Per-Class统计
python eval_tools/find_common_matches.py ...
```
查看输出中的 "Model X Unique" 数量和比例。
### Q3: 如何可视化独有匹配?
A: 可以基于 detailed_3d_matches.json 找出独有匹配的case和frame然后可视化
```python
# 找出 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](COMMON_MATCH_COMPARISON_DESIGN.md) - 详细设计方案
- [eval_tools/find_common_matches.py](find_common_matches.py) - 共同匹配查找工具
- [eval_tools/compare_models.py](compare_models.py) - 模型比较工具