Files
yolov26_3d/eval_tools/docs/EVALSET_CONSTRUCTION_GUIDE.md
2026-06-24 09:35:46 +08:00

464 lines
17 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 评测集构建方案
> 适用模型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-inlabel=1 | 从侧面切入本车道 | 30+ 序列 | 500+ |
| Cut-outlabel=2 | 从本车道切出 | 30+ 序列 | 300+ |
> **Cut-in/Cut-out 标注要求**:连续视频片段,切变过程完整,含后面+左右面的可见性标注。
### 5.5 各 3D 类别专项要求
#### vehicleID=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+ |
#### pedestrianID=1
| 子场景 | 最低样本 |
|--------|---------|
| 路边站立/行走z < 30m| 600+ |
| 横穿马路(侧向 heading| 300+ |
| 群体行人(遮挡严重)| 200+ |
| 夜间行人 | 200+ |
#### bicycleID=2& riderID=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 mz < 50m±2 m50m < 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*