# ROI坐标转换问题解决方案

## 问题描述

评测结果中precision和recall都为0，经过诊断发现是**ROI坐标转换问题**。

## 根本原因

1. **检测结果使用ROI坐标系**：保存在`txt_results`中的检测框坐标是在ROI裁剪区域的坐标系中（尺寸: 704x352）
2. **Ground Truth使用原图坐标系**：GT标注使用的是归一化的原图坐标（尺寸: 1920x1080）
3. **坐标不匹配导致IoU=0**：两个坐标系不一致，所有框的IoU都是0，无法匹配

## ROI参数

针对`evalset_roi0`数据集：
- **ROI区域**: [0, 120, 1920, 1080] (xyxy格式)
- **ROI输入尺寸**: 704 x 352 (模型输入尺寸)
- **原图尺寸**: 1920 x 1080

### 坐标转换公式

检测框从ROI坐标转换到原图坐标：

```python
# 1. 缩放
scale_x = (1920 - 0) / 704 = 2.7273
scale_y = (1080 - 120) / 352 = 2.7273

x1_scaled = x1 * scale_x
x2_scaled = x2 * scale_x  
y1_scaled = y1 * scale_y
y2_scaled = y2 * scale_y

# 2. 偏移
x1_final = x1_scaled + 0
x2_final = x2_scaled + 0
y1_final = y1_scaled + 120
y2_final = y2_scaled + 120
```

## 解决方案

### 1. 修改DetectionParser

在`parser.py`中添加ROI缩放和偏移支持：

```python
def __init__(self, roi_offset=None, roi_scale=None):
    self.roi_offset = roi_offset or (0, 0)
    self.roi_scale = roi_scale or (1.0, 1.0)
```

在解析2D框时应用转换：

```python
# 先缩放
x1 *= self.roi_scale[0]
x2 *= self.roi_scale[0]
y1 *= self.roi_scale[1]
y2 *= self.roi_scale[1]

# 再偏移
x1 += self.roi_offset[0]
y1 += self.roi_offset[1]
x2 += self.roi_offset[0]
y2 += self.roi_offset[1]
```

### 2. 更新Evaluator和eval.py

添加`roi_offset`和`roi_scale`参数传递。

### 3. 更新命令行参数

```bash
--roi 0 120 1920 1080           # ROI区域
--roi-input-size 704 352        # ROI输入尺寸
```

## 验证结果

### 修复前
```
GT bbox range: x=[18.0, 1919.0], y=[465.0, 751.0]
Det bbox range: x=[9.5, 704.6], y=[126.1, 236.8]
IoU: 0.0000
Matches: 0
```

### 修复后
```
GT bbox range: x=[18.0, 1919.0], y=[465.0, 751.0]
Det bbox range (scaled): x=[25.9, 1921.6], y=[463.9, 765.8]
Matches: 16/20
First match IoU: 0.8397
```

### 评测结果（100帧测试）
```
2D Metrics:
  Precision: 0.9141
  Recall:    0.6105
  mAP:       0.2066

3D Metrics:
  pedestrian: Lat=0.795m, Long=1.726m, Head=1.140rad (n=8)
  vehicle: Lat=0.987m, Long=1.731m, Head=0.247rad (n=995)
```

## 使用方法

### 完整评测（81443帧）
```bash
bash eval_tools/run_evaluation_example.sh
```

### 快速测试（100帧）
```bash
bash eval_tools/run_evaluation_quick_test.sh
```

### 手动运行
```bash
python eval_tools/eval.py \
    --det-path /path/to/detections \
    --gt-path /path/to/gt \
    --output-dir results \
    --img-width 1920 \
    --img-height 1080 \
    --roi 0 120 1920 1080 \
    --roi-input-size 704 352
```

## 注意事项

1. **ROI1的参数不同**：如果评测ROI1的结果，需要修改ROI参数
2. **不同模型的输入尺寸可能不同**：根据实际模型调整`--roi-input-size`
3. **大数据集评测耗时**：81443帧约需10-20分钟，建议先用quick test验证

## 相关文件

- `eval_tools/evaluator/parser.py` - 添加ROI转换逻辑
- `eval_tools/evaluator/evaluator.py` - 传递ROI参数
- `eval_tools/eval.py` - 命令行参数处理
- `eval_tools/run_evaluation_example.sh` - 完整评测脚本
- `eval_tools/run_evaluation_quick_test.sh` - 快速测试脚本
