# Heading误差可视化分析方案

## 方案概述

针对`detailed_3d_matches.json`中heading误差较大的目标，设计多维度可视化分析系统，帮助定位问题根源。

---

## 📋 方案设计

### 1. 数据筛选策略

#### 筛选条件
- **主要条件**：`heading_error > threshold`（建议threshold=1.5rad ≈ 85°）
- **辅助条件**：
  - 按类别筛选（vehicle/pedestrian/bicycle/rider）
  - 按距离范围筛选（近距离/中距离/远距离）
  - 按置信度筛选（高置信度bad cases更值得关注）
  - 按误差类型筛选（接近π的反转错误 vs 其他错误）

#### 误差分级
```python
# 误差等级定义
ERROR_LEVELS = {
    'critical': heading_error > 2.5,      # 严重错误（>143°）
    'severe': 1.5 < heading_error <= 2.5,  # 重大错误（85°-143°）
    'moderate': 0.5 < heading_error <= 1.5, # 中等错误（28°-85°）
    'minor': heading_error <= 0.5          # 轻微错误（<28°）
}
```

### 2. 可视化维度

#### A. BEV鸟瞰图视角 🗺️

**目的**：直观对比GT和预测的朝向差异

**可视化内容**：
```
┌─────────────────────────────────────┐
│  Bird's Eye View                     │
│                                      │
│  ↑ Z (Forward)                       │
│  │                                   │
│  │    ┏━━━━━━━━┓  ← GT (绿色)       │
│  │    ┃        ┃  箭头指向前方      │
│  │    ┃  →     ┃                    │
│  │    ┗━━━━━━━━┛                    │
│  │                                   │
│  │    ╔════════╗  ← Pred (红色)     │
│  │    ║    ←   ║  箭头指向相反      │
│  │    ║        ║                    │
│  │    ╚════════╝                    │
│  │                                   │
│  └────────────────→ X (Right)       │
│                                      │
│  误差：3.14 rad (180°) - 方向反转   │
└─────────────────────────────────────┘
```

**实现要点**：
- GT用绿色框+绿色箭头
- Prediction用红色框+红色箭头
- 标注误差值（弧度和角度）
- 显示自车位置
- 标注距离网格

#### B. 图像投影视角 📷

**目的**：在原图上查看目标外观和朝向关系

**可视化内容**：
- 原始图像
- 2D边界框（GT绿色，Pred红色）
- 3D边界框投影（8个顶点+12条边）
- 朝向指示箭头
- 信息标注：
  - 类别、置信度
  - heading_error值
  - GT rotation vs Pred rotation
  - 距离信息

#### C. 角度对比图 📐

**目的**：可视化角度差异的具体模式

**1. 圆形角度图（Polar Plot）**
```
        0° (Forward)
           ↑
           │
           │
  270° ────┼──── 90°
           │
           │
           ↓
        180° (Backward)

● GT角度位置（绿点）
● Pred角度位置（红点）
→ 误差向量（虚线箭头）
```

**2. 散点图（Scatter Plot）**
```
Pred Rotation
   π ┤         ●●●●●●  ← 反转错误聚集区
     │         ●
     │
     │    ●
  -π ├────●──────────────
    -π          0         π
           GT Rotation
```

**3. 误差分布直方图**
```
Count
  │  █
  │  █
  │  █  █
  │  █  █  █
  │  █  █  █  █
  └──────────────────→
     Heading Error (rad)
```

#### D. 多目标对比面板 📊

**目的**：同时展示多个bad cases，发现共性

**布局设计**：
```
┌─────────────────────────────────────────────────────┐
│  Top 10 Worst Heading Errors                        │
├──────────┬──────────┬──────────┬─────────────────────┤
│  Case 1  │  Case 2  │  Case 3  │  ...                │
│  ┌────┐  │  ┌────┐  │  ┌────┐  │                     │
│  │BEV │  │  │BEV │  │  │BEV │  │  每个case包含：     │
│  └────┘  │  └────┘  │  └────┘  │  - BEV图            │
│  ┌────┐  │  ┌────┐  │  ┌────┐  │  - 原图             │
│  │IMG │  │  │IMG │  │  │IMG │  │  - 关键信息         │
│  └────┘  │  └────┘  │  └────┘  │                     │
│  Info    │  Info    │  Info    │                     │
├──────────┴──────────┴──────────┴─────────────────────┤
│  共性分析：                                           │
│  - 80%为反转错误（error ≈ π）                        │
│  - 90%为vehicle类别                                   │
│  - 集中在中远距离（30-80m）                           │
└─────────────────────────────────────────────────────┘
```

#### E. 交互式分析面板 🖱️

**目的**：支持深入分析和探索

**功能设计**：
```
┌─────────────────────────────────────────────────────┐
│  Heading Error Analysis Dashboard                    │
├─────────────────────────────────────────────────────┤
│  [Filters]                                           │
│  Class:    [✓All ✓Vehicle ✓Pedestrian □Bicycle]    │
│  Distance: [0-30m] [30-60m] [60-100m] [100m+]       │
│  Error:    [>2.5] [1.5-2.5] [0.5-1.5] [<0.5]        │
│  Pattern:  [Reversal (≈π)] [Other]                  │
├─────────────────────────────────────────────────────┤
│  ┌──────────────┐  ┌──────────────┐                 │
│  │ Distribution │  │ Scatter Plot │                 │
│  │    Chart     │  │  GT vs Pred  │                 │
│  └──────────────┘  └──────────────┘                 │
├─────────────────────────────────────────────────────┤
│  [Selected Case Detail]                             │
│  ┌────────────┐  ┌────────────┐  ┌────────────┐    │
│  │   Image    │  │    BEV     │  │   Stats    │    │
│  │            │  │            │  │            │    │
│  └────────────┘  └────────────┘  └────────────┘    │
├─────────────────────────────────────────────────────┤
│  Navigation: [< Prev]  Case 15/234  [Next >]       │
└─────────────────────────────────────────────────────┘
```

### 3. 统计分析图表

#### A. 误差模式分析

**1. 误差类型饼图**
```
┌─────────────────────┐
│  Error Patterns     │
│                     │
│   ╱────╲            │
│  │ 68% │  反转错误  │
│  │  π  │            │
│   ╲────╱            │
│   ╱──╲ 22% 其他     │
│  │10%│  中等误差    │
│   ╲──╱              │
└─────────────────────┘
```

**2. 各类别误差对比**
```
Avg Error (rad)
   3.0 ┤
   2.5 ┤        █
   2.0 ┤     █  █
   1.5 ┤  █  █  █
   1.0 ┤  █  █  █  █
   0.5 ┤  █  █  █  █
   0.0 └──────────────→
       Veh Ped Bic Rid
```

**3. 距离-误差关系图**
```
Error (rad)
   3.0 ┤  ●●●
   2.5 ┤ ●●●●●
   2.0 ┤●●●●●●●
   1.5 ┤●●●●●●●●
   1.0 ┤ ●●●●●●●
   0.5 ┤  ●●●●●
   0.0 └────────────────→
       0   30   60   90
          Distance (m)
```

#### B. GT vs Pred角度关系矩阵

**热力图展示**：
```
Pred Angle
    π ┤ ██░░░░░░  ← 反转区域
      │ ░░░░░░░░
      │ ░░░░█░░░  ← 正常区域
      │ ░░░░░░░░
   -π └───────────
     -π    0    π
        GT Angle

颜色深度 = case数量
```

### 4. 输出报告

#### A. 自动生成分析报告

**报告结构**：
```markdown
# Heading误差分析报告

## 1. 概览
- 总样本数：596,602
- 高误差样本（>1.5rad）：5,839 (0.98%)
- 反转错误（>3.04rad）：4,012 (68.7%)

## 2. 典型Case展示
[Top 20 worst cases with images]

## 3. 误差模式
- 方向反转（≈180°）：68.7%
- 其他大误差：31.3%

## 4. 类别分布
- Vehicle: 86.8% 反转率
- Bicycle: 38.3% 反转率
- Rider: 34.0% 反转率
- Pedestrian: 11.7% 反转率

## 5. 建议
...
```

#### B. 交互式HTML报告

**功能**：
- 可筛选、排序的表格
- 点击查看详细可视化
- 导出功能
- 打印友好版本

---

## 🛠️ 实现工具

### 工具1：数据提取器
```bash
python extract_bad_heading_cases.py \
    --input detailed_3d_matches.json \
    --threshold 1.5 \
    --output bad_heading_cases.json
```

### 工具2：可视化生成器
```bash
python visualize_heading_errors.py \
    --input bad_heading_cases.json \
    --gt-dir /path/to/labels \
    --img-dir /path/to/images \
    --output-dir runs/heading_analysis
```

### 工具3：交互式查看器
```bash
python heading_error_viewer.py \
    --input bad_heading_cases.json \
    --port 8080
# 在浏览器打开 http://localhost:8080
```

### 工具4：报告生成器
```bash
python generate_heading_report.py \
    --input bad_heading_cases.json \
    --output heading_error_report.html
```

---

## 📂 输出目录结构

```
runs/heading_error_analysis/
├── overview/
│   ├── error_distribution.png
│   ├── gt_vs_pred_scatter.png
│   ├── error_by_class.png
│   ├── error_by_distance.png
│   └── pattern_analysis.png
├── bev_visualization/
│   ├── case_000001_bev.png
│   ├── case_000002_bev.png
│   └── ...
├── image_visualization/
│   ├── case_000001_img.png
│   ├── case_000002_img.png
│   └── ...
├── combined_view/
│   ├── case_000001_combined.png  # BEV + IMG + Stats
│   ├── case_000002_combined.png
│   └── ...
├── multi_case_panels/
│   ├── top10_worst.png
│   ├── reversal_cases.png
│   └── by_class.png
├── bad_heading_cases.json
├── analysis_report.md
├── analysis_report.html
└── statistics.json
```

---

## 🎯 关键洞察点

### 预期发现

1. **反转错误模式**
   - GT接近0时，Pred接近π
   - GT为负值时，Pred为大正值
   - 特定类别更易发生反转

2. **距离相关性**
   - 远距离目标误差更大？
   - 近距离反转错误比例？

3. **类别差异**
   - Vehicle反转率最高（86.8%）
   - Pedestrian相对较好（11.7%）

4. **视觉特征**
   - 反转的目标有何共同特征？
   - 遮挡、截断的影响？
   - 角度标注的歧义性？

### 可能的根因

1. **模型架构问题**
   - Heading输出范围映射错误
   - 损失函数未考虑角度周期性
   - 前后方向特征不明显

2. **数据问题**
   - 训练数据角度分布不均
   - 标注歧义（前/后定义）
   - 数据增强影响角度

3. **后处理问题**
   - 角度归一化错误
   - 坐标系转换问题

---

## 📝 使用流程

### Step 1: 提取数据
```bash
python extract_bad_heading_cases.py \
    --input eval_results_common_match_comparison/yolov5s-300w/20260203_210259/detailed_3d_matches.json \
    --threshold 1.5 \
    --top-k 100 \
    --output bad_cases.json
```

### Step 2: 生成可视化
```bash
python visualize_heading_errors.py \
    --input bad_cases.json \
    --gt-dir /data/labels \
    --img-dir /data/images \
    --output-dir runs/heading_viz
```

### Step 3: 查看分析
```bash
# 方式1：静态报告
open runs/heading_viz/analysis_report.html

# 方式2：交互式查看
python heading_error_viewer.py --input bad_cases.json --port 8080
```

### Step 4: 深入分析
- 根据可视化结果筛选特定模式
- 对比不同条件下的误差
- 定位具体问题原因

---

## 🔄 迭代优化

基于分析结果，可以：

1. **模型改进**
   - 优化heading损失函数
   - 添加角度歧义解决机制
   - 增强前后方向特征学习

2. **数据改进**
   - 检查和修正标注错误
   - 平衡角度分布
   - 添加难例样本

3. **评估改进**
   - 区分反转错误和其他错误
   - 添加角度置信度评估
   - 引入人工review机制

---

## 📌 总结

这套方案提供：
- ✅ 多维度可视化（BEV、图像、统计图）
- ✅ 自动化工具链
- ✅ 交互式分析能力
- ✅ 完整的输出报告
- ✅ 可扩展的分析框架

通过这套方案，可以：
1. 快速定位heading误差大的样本
2. 直观理解误差模式
3. 发现问题根因
4. 指导模型改进
