17 KiB
Executable File
评测集构建方案
适用模型:YOLOv5-3D 单目3D检测模型 评测框架:
eval_tools/core/eval.py文档日期:2026-03-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)
{
"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)
{
"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