# 距离区间3D评测功能说明

## 功能描述

新增了按距离区间统计3D检测误差的功能，可以分析模型在不同距离范围内的性能表现。

## 配置方法

在配置文件 `eval_config.yaml` 中的 `metrics_3d` 部分添加 `distance_ranges`：

```yaml
metrics_3d:
  enabled: true
  distance_ranges:
    - [0, 30]      # 0-30米
    - [30, 60]     # 30-60米
    - [60, 100]    # 60-100米
    - [100, 999]   # 100米以上
```

## 距离定义

- 使用GT目标的**z坐标**（纵向距离）作为距离值
- 单位：米（meter）
- 区间为左闭右开：`[min, max)`

## 评测结果

### 控制台输出示例

```
3D Metrics:
  vehicle [overall]: Lat=0.647m, Long=1.680m, Head=0.258rad (n=2407)
    [0-30m]: Lat=0.500m, Long=1.203m, Head=0.177rad (n=2142)
    [30-60m]: Lat=1.149m, Long=5.074m, Head=0.607rad (n=194)
    [60-100m]: Lat=0.897m, Long=5.624m, Head=1.036rad (n=37)
```

### 文本报告示例

```
VEHICLE:

  [0-30m]:
    Samples: 2142
    Lateral Error (m):
      Mean:   0.4995
      Median: 0.2247
      Std:    0.8574
      90%:    1.2385
    Longitudinal Error (m):
      Mean:   1.2026
      Median: 0.5173
      Std:    1.8009
      90%:    3.1931
    Heading Error (rad):
      Mean:   0.1768
      Median: 0.0526
      Std:    0.5410
      90%:    0.2019

  [30-60m]:
    Samples: 194
    ...

  [OVERALL]:
    Samples: 2407
    ...
```

## 使用示例

### 1. 使用配置文件

```bash
python eval_tools/eval.py \
    --config eval_tools/configs/eval_config.yaml \
    --roi 0 120 1920 1080 \
    --roi-input-size 704 352
```

### 2. 快速测试

```bash
bash eval_tools/test_distance_ranges.sh
```

## 性能分析

从测试结果可以看出：

### Vehicle类别（2407个样本）
- **0-30m**（近距离，2142样本）：
  - 横向误差：0.50m
  - 纵向误差：1.20m
  - 朝向误差：0.18rad
  - **性能最好**

- **30-60m**（中距离，194样本）：
  - 横向误差：1.15m（↑2.3倍）
  - 纵向误差：5.07m（↑4.2倍）
  - 朝向误差：0.61rad（↑3.4倍）
  - **误差明显增大**

- **60-100m**（远距离，37样本）：
  - 横向误差：0.90m
  - 纵向误差：5.62m
  - 朝向误差：1.04rad（↑5.9倍）
  - **朝向估计最困难**

### Rider类别（65个样本）
- **0-30m**（44样本）：误差较小
- **30-60m**（21样本）：纵向误差显著增加（0.96m → 2.33m）

## 关键发现

1. **距离越远，误差越大**：符合预期，远距离目标分辨率低
2. **纵向误差增长最快**：距离估计是3D检测的主要挑战
3. **朝向误差对距离敏感**：远距离目标的朝向估计困难
4. **样本分布不均**：89%的vehicle样本在30米内

## 向后兼容

- 如果不配置 `distance_ranges`，评测脚本将只输出整体统计（兼容旧版本）
- 现有评测脚本无需修改即可继续使用

## 实现细节

- **匹配方式**：仍使用2D IoU匹配，距离区间只用于统计分组
- **数据结构**：`errors[class_id][range_key]` 存储分组误差
- **统计指标**：每个区间独立计算mean/median/std/90%分位数
- **JSON输出**：完整保存所有区间数据，便于后续分析

## 相关文件

- `eval_tools/evaluator/metrics_3d.py` - 核心实现
- `eval_tools/evaluator/evaluator.py` - 配置传递和报告生成
- `eval_tools/configs/eval_config.yaml` - 配置示例
- `eval_tools/test_distance_ranges.sh` - 测试脚本
