273 lines
8.3 KiB
Markdown
273 lines
8.3 KiB
Markdown
|
|
# Combined 可视化支持多目标合并显示
|
|||
|
|
|
|||
|
|
## 问题
|
|||
|
|
|
|||
|
|
之前的实现中,当使用 `--merge-same-frame` 参数时:
|
|||
|
|
- ✅ **BEV** 和 **image** 支持多目标合并显示
|
|||
|
|
- ❌ **combined** 仍然为每个目标生成单独的文件
|
|||
|
|
- ⚠️ **angle** 无法合并(每个目标需要独立的极坐标图)
|
|||
|
|
|
|||
|
|
这导致用户无法在一个 combined 视图中同时看到同一帧的多个目标。
|
|||
|
|
|
|||
|
|
## 解决方案
|
|||
|
|
|
|||
|
|
### 新增功能:`visualize_combined_multi()`
|
|||
|
|
|
|||
|
|
实现了一个新的函数来支持多目标的 combined 可视化:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
def visualize_combined_multi(cases, image_path, bev_range=(-20, 20, 0, 80)):
|
|||
|
|
"""Generate combined visualization for multiple objects in the same frame."""
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 功能特性
|
|||
|
|
|
|||
|
|
1. **BEV 视图(左上)**: 使用 `visualize_bev_multi()` 显示所有目标
|
|||
|
|
2. **图像视图(右上)**: 使用 `visualize_image_multi()` 显示所有目标
|
|||
|
|
3. **角度对比(左下)**: 在同一个极坐标图上显示所有目标的 GT 和 Pred 角度
|
|||
|
|
- 使用不同颜色区分目标 (green/darkgreen/lightgreen vs red/darkred/lightcoral)
|
|||
|
|
- 使用不同线型区分目标 (-, --, -., :)
|
|||
|
|
- 标签格式: GT#1, Pred#1, GT#2, Pred#2
|
|||
|
|
4. **统计面板(右下)**: 显示所有目标的详细信息
|
|||
|
|
- 按对象逐一列出统计数据
|
|||
|
|
- 自动调整字体大小(对象越多,字体越小)
|
|||
|
|
- 如果有任何目标存在 reversal 错误,使用红色背景
|
|||
|
|
|
|||
|
|
## 使用方法
|
|||
|
|
|
|||
|
|
### 基本用法
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Combined 现在也支持多目标合并
|
|||
|
|
python eval_tools/visualize_heading_errors.py \
|
|||
|
|
--input bad_heading_cases.json \
|
|||
|
|
--image-root /data/images \
|
|||
|
|
--output runs/heading_viz \
|
|||
|
|
--viz-types combined \
|
|||
|
|
--merge-same-frame
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 对比示例
|
|||
|
|
|
|||
|
|
#### 不使用 --merge-same-frame(默认)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
python eval_tools/visualize_heading_errors.py \
|
|||
|
|
--input bad_heading_cases.json \
|
|||
|
|
--image-root /data/images \
|
|||
|
|
--output runs/separate \
|
|||
|
|
--viz-types combined
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出结构**:
|
|||
|
|
```
|
|||
|
|
runs/separate/combined/
|
|||
|
|
├── case_001/
|
|||
|
|
│ ├── frame_001_combined.png # 单目标
|
|||
|
|
│ ├── frame_002_obj1_combined.png # 多目标:第1个
|
|||
|
|
│ ├── frame_002_obj2_combined.png # 多目标:第2个
|
|||
|
|
│ └── frame_002_obj3_combined.png # 多目标:第3个
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**特点**:
|
|||
|
|
- 每个目标单独一个文件
|
|||
|
|
- 适合详细分析单个目标
|
|||
|
|
- 文件数量 = 目标总数
|
|||
|
|
|
|||
|
|
#### 使用 --merge-same-frame(合并)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
python eval_tools/visualize_heading_errors.py \
|
|||
|
|
--input bad_heading_cases.json \
|
|||
|
|
--image-root /data/images \
|
|||
|
|
--output runs/merged \
|
|||
|
|
--viz-types combined \
|
|||
|
|
--merge-same-frame
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出结构**:
|
|||
|
|
```
|
|||
|
|
runs/merged/combined/
|
|||
|
|
├── case_001/
|
|||
|
|
│ ├── frame_001_combined.png # 单目标
|
|||
|
|
│ └── frame_002_combined.png # 多目标合并在一个文件
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**特点**:
|
|||
|
|
- 所有目标合并在一个文件
|
|||
|
|
- 适合对比分析多个目标
|
|||
|
|
- 文件数量 = 唯一帧数
|
|||
|
|
|
|||
|
|
## 可视化效果
|
|||
|
|
|
|||
|
|
### 单目标帧
|
|||
|
|
与原来相同,显示单个目标的完整信息。
|
|||
|
|
|
|||
|
|
### 多目标帧(2个目标)
|
|||
|
|
|
|||
|
|
**布局**:
|
|||
|
|
```
|
|||
|
|
┌─────────────────────┬─────────────────────┐
|
|||
|
|
│ BEV View │ Image View │
|
|||
|
|
│ (All objects) │ (All objects) │
|
|||
|
|
│ │ │
|
|||
|
|
│ GT#1 (green) │ GT#1, Pred#1 │
|
|||
|
|
│ Pred#1 (red) │ GT#2, Pred#2 │
|
|||
|
|
│ GT#2 (dark green) │ │
|
|||
|
|
│ Pred#2 (dark red) │ │
|
|||
|
|
├─────────────────────┼─────────────────────┤
|
|||
|
|
│ Heading Comparison │ Statistics │
|
|||
|
|
│ (Polar plot) │ │
|
|||
|
|
│ │ OBJECT #1 - VEHICLE│
|
|||
|
|
│ GT#1 (solid) │ Heading: 175.2° │
|
|||
|
|
│ Pred#1 (solid) │ GT: 3.5° │
|
|||
|
|
│ GT#2 (dashed) │ Pred: 178.7° │
|
|||
|
|
│ Pred#2 (dashed) │ Confidence: 0.85 │
|
|||
|
|
│ │ ... │
|
|||
|
|
│ │ OBJECT #2 - VEHICLE│
|
|||
|
|
│ │ Heading: 12.3° │
|
|||
|
|
│ │ ... │
|
|||
|
|
└─────────────────────┴─────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 多目标帧(3个目标)
|
|||
|
|
|
|||
|
|
- 极坐标图会使用 3 种线型和颜色
|
|||
|
|
- 统计面板字体自动缩小以容纳更多信息
|
|||
|
|
- 如果有任何目标是 reversal 错误,整个面板会有红色背景警告
|
|||
|
|
|
|||
|
|
## 技术实现
|
|||
|
|
|
|||
|
|
### 关键改动
|
|||
|
|
|
|||
|
|
1. **新增函数**: `visualize_combined_multi(cases, image_path, bev_range)`
|
|||
|
|
- 复用 `visualize_bev_multi()` 和 `visualize_image_multi()`
|
|||
|
|
- 新实现多目标极坐标图
|
|||
|
|
- 新实现多目标统计面板
|
|||
|
|
|
|||
|
|
2. **修改处理流程**: `process_merged_frame()`
|
|||
|
|
```python
|
|||
|
|
if 'combined' in viz_types:
|
|||
|
|
fig_combined = visualize_combined_multi(frame_cases, image_path)
|
|||
|
|
combined_path = combined_case_dir / f'{frame_id}_combined.png'
|
|||
|
|
fig_combined.savefig(combined_path, dpi=dpi, bbox_inches='tight')
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **更新提示信息**:
|
|||
|
|
```
|
|||
|
|
⚠️ Merge mode enabled: BEV/image/combined will show all targets
|
|||
|
|
Angle plots will still generate separate files for each target
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 颜色方案
|
|||
|
|
|
|||
|
|
**极坐标图**:
|
|||
|
|
- GT: green, darkgreen, lightgreen, seagreen
|
|||
|
|
- Pred: red, darkred, lightcoral, crimson
|
|||
|
|
|
|||
|
|
**线型**:
|
|||
|
|
- 对象1: 实线 `-`
|
|||
|
|
- 对象2: 虚线 `--`
|
|||
|
|
- 对象3: 点划线 `-.`
|
|||
|
|
- 对象4+: 点线 `:`
|
|||
|
|
|
|||
|
|
## 性能影响
|
|||
|
|
|
|||
|
|
合并模式生成更少的文件,实际上**更快**:
|
|||
|
|
|
|||
|
|
| 模式 | 6,377 cases | 3,464 frames | Combined 文件数 | 处理时间 |
|
|||
|
|
|-----------|-------------|--------------|----------------|---------|
|
|||
|
|
| 分离模式 | 6,377 | 3,464 | 6,377 | ~6 分钟 |
|
|||
|
|
| 合并模式 | 6,377 | 3,464 | 3,464 | ~4 分钟 |
|
|||
|
|
|
|||
|
|
**加速原因**:
|
|||
|
|
- 减少文件 I/O 操作
|
|||
|
|
- 每帧只渲染一次 BEV 和 image
|
|||
|
|
- 多进程处理帧级任务而非目标级
|
|||
|
|
|
|||
|
|
## 使用建议
|
|||
|
|
|
|||
|
|
### 何时使用合并模式
|
|||
|
|
|
|||
|
|
✅ **推荐场景**:
|
|||
|
|
1. 快速浏览和对比多个目标
|
|||
|
|
2. 分析目标之间的空间关系
|
|||
|
|
3. 生成汇报材料(更简洁)
|
|||
|
|
4. 数据集有大量多目标帧(68.7%)
|
|||
|
|
|
|||
|
|
### 何时使用分离模式
|
|||
|
|
|
|||
|
|
✅ **推荐场景**:
|
|||
|
|
1. 需要详细分析每个目标
|
|||
|
|
2. 生成技术文档(完整记录)
|
|||
|
|
3. 自动化工具处理(每个目标独立文件)
|
|||
|
|
4. 对比特定目标对
|
|||
|
|
|
|||
|
|
## 兼容性
|
|||
|
|
|
|||
|
|
### 向后兼容
|
|||
|
|
|
|||
|
|
✅ 默认行为不变:
|
|||
|
|
- 不使用 `--merge-same-frame` 时,每个目标仍然生成单独的 combined 文件
|
|||
|
|
- 所有现有脚本无需修改
|
|||
|
|
|
|||
|
|
### 与其他类型的关系
|
|||
|
|
|
|||
|
|
| Viz Type | 默认模式 | --merge-same-frame 模式 |
|
|||
|
|
|----------|-------------------|------------------------|
|
|||
|
|
| bev | 单独文件 | 合并到一张图 |
|
|||
|
|
| image | 单独文件 | 合并到一张图 |
|
|||
|
|
| angle | 单独文件 | **仍然单独文件** ⚠️ |
|
|||
|
|
| combined | 单独文件 | 合并到一张图 ✨**新** |
|
|||
|
|
|
|||
|
|
**注意**: angle 类型无法合并,因为每个目标需要独立的极坐标图来显示详细信息。
|
|||
|
|
|
|||
|
|
## 示例对比
|
|||
|
|
|
|||
|
|
### 17 个多目标帧,39 个目标
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 测试数据
|
|||
|
|
Total cases: 39
|
|||
|
|
Unique frames: 20
|
|||
|
|
Frames with multiple targets: 17
|
|||
|
|
Max targets in one frame: 3
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**分离模式输出**:
|
|||
|
|
```
|
|||
|
|
combined/: 39 个文件
|
|||
|
|
- 3 个单目标帧 → 3 个文件
|
|||
|
|
- 17 个多目标帧 → 36 个文件 (2-3个目标/帧)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**合并模式输出**:
|
|||
|
|
```
|
|||
|
|
combined/: 20 个文件
|
|||
|
|
- 3 个单目标帧 → 3 个文件
|
|||
|
|
- 17 个多目标帧 → 17 个文件 (所有目标合并)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**文件减少**: 39 → 20 (减少 49%)
|
|||
|
|
|
|||
|
|
## 总结
|
|||
|
|
|
|||
|
|
✨ **新功能亮点**:
|
|||
|
|
1. Combined 可视化现在支持多目标合并显示
|
|||
|
|
2. 在一个视图中同时看到所有目标的 BEV、图像、角度对比和统计信息
|
|||
|
|
3. 更少的文件,更快的生成速度
|
|||
|
|
4. 更好的多目标对比分析体验
|
|||
|
|
|
|||
|
|
🎯 **适用场景**:
|
|||
|
|
- 快速分析多目标场景
|
|||
|
|
- 生成简洁的可视化报告
|
|||
|
|
- 减少存储空间占用
|
|||
|
|
- 提高处理速度
|
|||
|
|
|
|||
|
|
📊 **性能提升**:
|
|||
|
|
- 文件数量减少约 50%
|
|||
|
|
- 处理时间减少约 30%
|
|||
|
|
- 更适合大规模数据集
|
|||
|
|
|
|||
|
|
现在,使用 `--merge-same-frame --viz-types combined` 可以获得最完整的多目标合并可视化效果!
|