# 评测集构建方案

> 适用模型：YOLOv5-3D 单目3D检测模型
> 评测框架：`eval_tools/core/eval.py`
> 文档日期：2026-03-10

---

## 目录

1. [构建目标与原则](#1-构建目标与原则)
2. [类别体系与评测维度](#2-类别体系与评测维度)
3. [场景覆盖设计](#3-场景覆盖设计)
4. [2D 类别评测集构建](#4-2d-类别评测集构建)
5. [3D 类别评测集构建](#5-3d-类别评测集构建)
6. [样本量估算](#6-样本量估算)
7. [标注要求](#7-标注要求)
8. [数据集组织结构](#8-数据集组织结构)
9. [质量验证流程](#9-质量验证流程)
10. [已有数据利用建议](#10-已有数据利用建议)

---

## 1. 构建目标与原则

### 1.1 核心目标

评测集的作用是**客观衡量模型在真实场景中的性能，并定位模型的薄弱环节**。需达到：

- **代表性**：覆盖部署场景的主要驾驶条件（城市/高速/路口）
- **诊断性**：能区分距离远近、遮挡程度、heading 朝向等子条件下的性能差异
- **稳定性**：同一模型多次评测结果误差 < 0.5%（样本量足够）
- **公平性**：与训练集严格不重叠；跨版本模型在同一评测集上可横向对比

### 1.2 构建原则

| 原则 | 说明 |
|------|------|
| **不重叠** | 评测集视频/序列与训练集完全隔离 |
| **场景多样** | 按场景类型、时段、天气分层采样，避免单一场景主导指标 |
| **数量门控** | 每个子评测维度 GT 实例数 ≥ 200（否则指标置信区间过大）|
| **标注一致** | 标注规范与训练数据一致（47 维格式，坐标系相同）|
| **固定不变** | 评测集发布后不修改，模型迭代复用同一评测集 |

---

## 2. 类别体系与评测维度

### 2.1 14 类别分组

```
┌─ 3D 类别（同时参与 2D + 3D 评测）────────────────────────────────────────┐
│  ID 0  vehicle      - 车辆（含四面 3D 标注）                              │
│  ID 1  pedestrian   - 行人                                               │
│  ID 2  bicycle      - 自行车（无人骑行）                                  │
│  ID 3  rider        - 骑行者（人+车整体）                                 │
│  ID 13 tricycle     - 三轮车（标注同 vehicle，但评测框架归入 2D-only）     │
└───────────────────────────────────────────────────────────────────────────┘
┌─ 2D-only 类别（仅参与 2D 评测）──────────────────────────────────────────┐
│  ID 4  roadblock    - 路障/锥桶                                           │
│  ID 5  head         - 人头（行人头部）                                    │
│  ID 6  tsr          - 交通标志（Traffic Sign Recognition）                │
│  ID 7  guideboard   - 导向标牌                                            │
│  ID 8  plate        - 车牌                                                │
│  ID 9  wheel        - 车轮                                                │
│  ID 10 tl_border    - 信号灯外框                                          │
│  ID 11 tl_wick      - 信号灯灯芯                                          │
│  ID 12 tl_num       - 信号灯数字/倒计时                                   │
└───────────────────────────────────────────────────────────────────────────┘
```

> **注意**：tricycle(13) 虽有 3D 标注能力，但当前评测框架 `3d_classes: [0,1,2,3]` 未纳入 3D 评测。
> 评测集构建时仍需为 tricycle 提供完整 3D 标注，以便未来扩展。

### 2.2 评测维度矩阵

| 评测维度 | 适用类别 | 关键子维度 |
|----------|----------|------------|
| 2D 检测（P/R/AP/mAP） | 全部 14 类 | 场景类型、目标大小、遮挡程度 |
| 3D 横向误差（Lateral） | vehicle, pedestrian, bicycle, rider | 纵向距离区间、横向位置区间 |
| 3D 纵向误差（Longitudinal） | 同上 | 纵向距离区间（近/中/远/极远）|
| 3D 朝向误差（Heading） | 同上 | heading 朝向、strict vs relaxed |
| Cut-in/Cut-out | vehicle | 变道类型（正常/切入/切出）|
| 时序稳定性 | vehicle, pedestrian | 帧间误差方差、跟踪连续性 |

---

## 3. 场景覆盖设计

### 3.1 场景分类

评测集按场景类型分层，确保每类场景都有足够的 GT 实例：

```
评测集场景分层
├── A. 城市道路（Urban）
│   ├── A1. 主干道直行（高密度车辆，低速）
│   ├── A2. 路口（交叉行驶、遮挡多）
│   └── A3. 人行道/自行车道（行人、骑手密集）
│
├── B. 高速/快速路（Highway）
│   ├── B1. 直线段（高速车辆，大距离）
│   ├── B2. 匝道（cut-in/cut-out 频繁）
│   └── B3. 跟车场景（近距离前车，heading 接近 0）
│
├── C. 园区/停车场（Parking/Campus）
│   ├── C1. 低速场景（行人横穿，自行车）
│   └── C2. 密集停车（遮挡车辆，heading 多样）
│
├── D. 光照/天气专项
│   ├── D1. 夜间（路灯/车灯为主要光源）
│   ├── D2. 黄昏/逆光（日落逆光，曝光过渡）
│   └── D3. 雨天（反光路面，视线模糊）
│
└── E. 长尾场景专项
    ├── E1. 极远距离目标（z > 80m）
    ├── E2. 极侧向目标（|x| > 20m）
    ├── E3. 大遮挡目标（2D box 被遮 > 50%）
    └── E4. 非常规朝向（侧面、斜向）
```

### 3.2 场景比例建议

| 场景类型 | 帧数占比 | 说明 |
|----------|---------|------|
| A. 城市道路 | 40% | 最常见部署场景 |
| B. 高速/快速路 | 30% | 大距离 3D 精度关键场景 |
| C. 园区/停车场 | 10% | heading 多样性 |
| D. 光照/天气专项 | 15% | 鲁棒性测试 |
| E. 长尾专项 | 5% | 边界性能测试 |

---

## 4. 2D 类别评测集构建

### 4.1 各类别覆盖要求

#### 高频核心类别（> 2000 GT 实例）

| 类别 | 最低 GT 实例数 | 关键覆盖点 |
|------|--------------|------------|
| vehicle(0) | 5000+ | 近/中/远距离各 1/3；正面/侧面/背面均衡 |
| pedestrian(1) | 3000+ | 单人/群体；站立/行走/奔跑；正面/背面 |
| bicycle(2) | 1000+ | 有人骑行与无人停放；不同角度 |
| rider(3) | 1000+ | 自行车骑手、摩托骑手；不同速度 |
| head(5) | 2000+ | 与 pedestrian 同帧（头部检测辅助）|

#### 中频类别（> 500 GT 实例）

| 类别 | 最低 GT 实例数 | 关键覆盖点 |
|------|--------------|------------|
| roadblock(4) | 500+ | 锥桶、水马、隔离墩；单个与成排 |
| tsr(6) | 800+ | 限速牌、禁止牌、指示牌；远近各半 |
| plate(8) | 1000+ | 前牌/后牌；清晰/模糊/遮挡；不同距离 |
| wheel(9) | 1000+ | 与 vehicle 强关联；不同视角 |
| tricycle(13) | 300+ | 电动三轮、货运三轮；正面/侧面 |

#### 低频类别（> 200 GT 实例）

| 类别 | 最低 GT 实例数 | 关键覆盖点 |
|------|--------------|------------|
| guideboard(7) | 200+ | 高速路导向牌；城市路名牌 |
| tl_border(10) | 300+ | 路口信号灯；不同距离 |
| tl_wick(11) | 300+ | 红/绿/黄灯芯；清晰/模糊 |
| tl_num(12) | 200+ | 倒计时数字；不同亮度 |

### 4.2 2D 类别质量控制指标

每个类别评测集应覆盖如下目标尺寸分布（在 ROI 裁剪后的坐标系中）：

| 尺寸分级 | 框边长范围（像素） | 占比建议 |
|----------|-------------------|---------|
| 小目标 | 8 ~ 32 px | 20% |
| 中目标 | 32 ~ 96 px | 50% |
| 大目标 | > 96 px | 30% |

**遮挡程度分布**：

| 遮挡等级 | 定义 | 占比建议 |
|----------|------|---------|
| 无遮挡 | 目标全部可见 | 50% |
| 轻度遮挡 | 20%~50% 被遮挡 | 35% |
| 重度遮挡 | > 50% 被遮挡 | 15% |

---

## 5. 3D 类别评测集构建

3D 类别评测集在 2D 要求基础上，需额外覆盖以下维度。

### 5.1 纵向距离分布要求

按评测框架的距离区间（z 轴，单位米）：

| 区间 | 最低 GT 实例数 | 说明 |
|------|--------------|------|
| 0 ~ 10 m | 300+ | 近距离精度（纵向误差应 < 0.5m）|
| 10 ~ 20 m | 500+ | 城市最常用区间 |
| 20 ~ 30 m | 500+ | — |
| 30 ~ 40 m | 400+ | 中距离 |
| 40 ~ 50 m | 300+ | — |
| 50 ~ 60 m | 200+ | — |
| 60 ~ 80 m | 200+ | 远距离（高速场景）|
| 80 ~ 100 m | 100+ | — |
| > 100 m | 100+ | 极远（vehicle 为主）|

> 行人、自行车、骑手在 > 60m 处往往分辨率不足，**60m 以内为核心评测区间**。

### 5.2 横向位置分布要求

按 x3d 轴（正右为正）：

| 区间 | 最低 GT 实例数 | 说明 |
|------|--------------|------|
| -20 ~ -10 m | 200+ | 对向车道 |
| -10 ~ 0 m | 400+ | 本车左侧 |
| 0 ~ 10 m | 400+ | 本车右侧 |
| 10 ~ 20 m | 200+ | 相邻车道 |
| \|x\| > 20 m | 100+ | 极侧向（长尾）|

> **已知问题**：U 坐标误差在 |x3d| > 10m 时显著增大（见 CALIBRATION_ADJUSTMENT_VERIFICATION.md）。
> 评测集需确保极侧向样本数 ≥ 100，专门监控该区间的 3D 精度退化。

### 5.3 Heading 朝向分布要求

车辆朝向（rot_y）编码规则：`rot_y = -π/2` 表示正向行驶。
评测集需覆盖各朝向区间：

| 朝向区间 | 描述 | 最低 GT 实例数 |
|----------|------|--------------|
| [-π/2 ± π/8] | 正向行驶（同向）| 1000+ |
| [π/2 ± π/8]  | 反向行驶（对向）| 500+ |
| [0 ± π/8]    | 正侧向（左侧停车/侧向行驶）| 200+ |
| [π ± π/8]    | 负侧向（右侧停车/侧向行驶）| 200+ |
| 其他（斜向）   | 45° 斜向行驶/泊车 | 300+ |

### 5.4 Cut-in/Cut-out 场景（vehicle 专项）

| Cut 类型 | 描述 | 最低帧序列数 | 最低 GT 实例数 |
|----------|------|------------|--------------|
| 正常（label=0） | 直线行驶 | — | 2000+ |
| Cut-in（label=1） | 从侧面切入本车道 | 30+ 序列 | 500+ |
| Cut-out（label=2） | 从本车道切出 | 30+ 序列 | 300+ |

> **Cut-in/Cut-out 标注要求**：连续视频片段，切变过程完整，含后面+左右面的可见性标注。

### 5.5 各 3D 类别专项要求

#### vehicle（ID=0）—— 最重要的 3D 类别

| 子场景 | 最低样本 |
|--------|---------|
| 近距正向跟车（z < 20m，前面可见）| 500+ |
| 中距侧向超车（20m < z < 60m，侧面可见）| 400+ |
| 远距正向（z > 60m，整体预测为主）| 300+ |
| 对向来车（rot_y ≈ π/2，后面可见）| 300+ |
| 停放车辆（低速/静止，heading 多样）| 200+ |

**四面可见性分布**（面向 vehicle 的 facecls 评测）：

| 面类型 | 最低可见实例数 |
|--------|--------------|
| 前面（front） | 800+ |
| 后面（rear/back） | 600+ |
| 左侧面（left） | 400+ |
| 右侧面（right） | 400+ |

#### pedestrian（ID=1）

| 子场景 | 最低样本 |
|--------|---------|
| 路边站立/行走（z < 30m）| 600+ |
| 横穿马路（侧向 heading）| 300+ |
| 群体行人（遮挡严重）| 200+ |
| 夜间行人 | 200+ |

#### bicycle（ID=2）& rider（ID=3）

| 子场景 | 最低样本（bicycle/rider 合计）|
|--------|------------------------------|
| 单独骑行（z < 30m）| 400+ |
| 多辆并排 | 200+ |
| 侧向穿越 | 150+ |
| 夜间（有灯/无灯）| 150+ |

---

## 6. 样本量估算

### 6.1 总体规模建议

| 评测类型 | 推荐帧数 | 估算 GT 总实例数 |
|----------|---------|----------------|
| **轻量评测集**（快速迭代）| 2,000 帧 | ~15,000 GT |
| **标准评测集**（版本发布）| 8,000 帧 | ~60,000 GT |
| **全量评测集**（深度分析）| 20,000 帧 | ~150,000 GT |

> 建议维护**标准评测集**作为日常基准，**轻量评测集**作为开发快速验证（从标准集均匀抽样）。

### 6.2 帧采样策略

```
原始视频序列
    │
    ▼ 按场景类型分层采样
按 1~3 fps 稀疏采样（避免相邻帧过度相关）
    │
    ▼ 剔除：
    ├── 图像模糊（运动模糊、对焦失败）
    ├── 无目标帧（全图无任何 GT 实例）
    └── 极端曝光（过曝/欠曝）
    │
    ▼ 确保：
    ├── 每个 case（视频片段）≥ 50 帧（保证时序分析可用）
    └── 每个 case ≤ 500 帧（单 case 不主导总体指标）
```

---

## 7. 标注要求

### 7.1 标注格式

完全遵循训练数据格式（见 CLAUDE.md 3D Label Format 章节）：

| 类别 | 标注维度 | 说明 |
|------|---------|------|
| vehicle, tricycle | **50 维**（含 4 面） | 类别 + 2D + 3D整体 + 前/后/左/右面 |
| pedestrian, bicycle, rider | **18 维** | 类别 + 2D + 3D整体（无面信息）|
| 2D-only 类别 | **6 维** | 类别 + 2D bbox + 占位 -1 |

### 7.2 3D 标注质量要求

#### 精度要求（针对 vehicle）

| 标注项 | 精度要求 |
|--------|---------|
| z3d（纵向深度）| ±0.5 m（z < 50m），±2 m（50m < z < 100m）|
| x3d（横向位置）| ±0.3 m |
| y3d（垂直位置）| ±0.2 m |
| l/h/w（尺寸）| ±0.1 m |
| rot_y（朝向）| ±0.1 rad（约 6°）|
| xc/yc（投影中心）| ±3 px |

#### 面可见性标注规则

`is_visible_from_camera`（dim 22/30/38/46）标注规则：

```
面可见性 = 1：面的法向量朝向摄像机一侧（面可被相机正面看到）
面可见性 = 0：面的法向量背向摄像机（背面，被遮蔽）

经验规则：
- 同向行驶车辆：后面=1，前面=0，左右面视横向位置定
- 对向来车：前面=1，后面=0
- 侧向行驶（|rot_y - 0| < π/4）：左面或右面=1，视具体朝向
```

#### Cut-in/Cut-out 标注规则

`cut_class`（dim38~40 的索引）：

| 标注值 | 含义 | 标注判断依据 |
|--------|------|------------|
| 0 | 正常行驶 | 纵向位移 >> 横向位移 |
| 1 | Cut-in | 目标从侧方向进入本车道，且与本车道有重叠趋势 |
| 2 | Cut-out | 目标从本车道移出，向侧方变道 |

> Cut-in/Cut-out 需**逐帧**标注，连续过程中按实际状态确定每帧的标签。

### 7.3 2D 标注质量要求

- bbox 与目标视觉边界误差 ≤ 3 px（在原图 1920×1080 坐标系）
- 遮挡边界：标注**可见部分**的完整边界框（不推断遮挡物体的完整框）
- 截断处理：目标超出图像边界时，标注图像内可见部分，框至图像边缘

### 7.4 不标注情况（需剔除或标记为 ignore）

- 目标在 ROI 裁剪后边长 < 8 px（模型输入分辨率下）
- 严重模糊、无法辨认类别的目标
- 距离 > 150m 的车辆（标注误差过大）

---

## 8. 数据集组织结构

### 8.1 目录结构

评测集需兼容现有评测框架（`eval_tools/core/eval.py`）的目录规范：

```
evalset/
├── case_001/                    # 场景片段（≥ 50 帧连续视频）
│   ├── images/                  # 原始图像（1920×1080 JPEG/PNG）
│   │   ├── 000000.jpg
│   │   ├── 000001.jpg
│   │   └── ...
│   ├── labels_json/             # GT 标注（JSON 格式，与框架 gt_format 对应）
│   │   ├── 000000.json
│   │   └── ...
│   ├── camera4.json             # 相机标定文件（ROI 处理必需）
│   └── meta.json                # 场景元数据（见 8.2）
│
├── case_002/
│   └── ...
│
└── evalset_meta.json            # 整体评测集元数据
```

> **兼容性说明**：`gt_format: "json"` 对应 `labels_json/` 目录；`gt_format: "txt"` 对应 `labels_0211/` 目录。

### 8.2 场景元数据格式（meta.json）

```json
{
  "case_id": "case_001",
  "scene_type": "urban_intersection",    // 见场景分类 3.1
  "lighting": "day",                     // day / night / dusk / backlight
  "weather": "clear",                    // clear / rain / fog
  "location": "city_A",
  "camera_model": "G1M3",
  "has_3d_annotation": true,
  "frame_range": [0, 299],
  "frame_count": 300,
  "gt_class_distribution": {
    "vehicle": 1200,
    "pedestrian": 340,
    "bicycle": 80
  },
  "special_scenarios": ["cut_in", "night_pedestrian"]
}
```

### 8.3 评测集总元数据（evalset_meta.json）

```json
{
  "version": "v1.0",
  "created": "2026-03-10",
  "total_frames": 8000,
  "total_cases": 80,
  "roi_mode": "ROI1",              // 对应训练时的 ROI 配置
  "roi_config": [704, 320],
  "class_distribution": {
    "vehicle": {"total": 45000, "has_3d": 45000},
    "pedestrian": {"total": 12000, "has_3d": 12000},
    "bicycle": {"total": 4000, "has_3d": 4000},
    "rider": {"total": 3500, "has_3d": 3500},
    "roadblock": {"total": 2000, "has_3d": 0}
  },
  "scene_distribution": {
    "urban": 42,
    "highway": 22,
    "parking": 8,
    "night": 5,
    "rain": 3
  }
}
```

---

*文档生成日期：2026-03-10*
