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

17 KiB
Executable File
Raw Permalink Blame History

评测集构建方案

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


目录

  1. 构建目标与原则
  2. 类别体系与评测维度
  3. 场景覆盖设计
  4. 2D 类别评测集构建
  5. 3D 类别评测集构建
  6. 样本量估算
  7. 标注要求
  8. 数据集组织结构
  9. 质量验证流程
  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_cameradim 22/30/38/46标注规则

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

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

Cut-in/Cut-out 标注规则

cut_classdim38~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