news 2026/5/30 11:34:12

滴滴D²-City数据集二次标注实战:手把手教你构建斑马线+行人+交通灯YOLO训练集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
滴滴D²-City数据集二次标注实战:手把手教你构建斑马线+行人+交通灯YOLO训练集

滴滴D²-City数据集二次标注实战:从原始视频到YOLO训练集的完整构建指南

在计算机视觉领域,高质量的数据集是目标检测模型成功的关键。本文将带您深入探索如何利用滴滴D²-City原始视频数据,通过抽帧、标注和数据处理等步骤,构建一个包含斑马线、行人和交通灯(细分灯色)的定制化YOLO训练集。不同于简单的数据集使用教程,我们将重点关注从零开始的完整构建流程,分享实际项目中积累的经验技巧。

1. 准备工作与环境搭建

在开始数据处理前,需要做好充分的准备工作。首先确保您的开发环境满足以下要求:

  • 硬件配置:建议使用至少16GB内存的工作站,配备NVIDIA GPU(如RTX 3060及以上)以加速视频处理
  • 存储空间:原始视频和抽帧后的图像将占用大量空间,准备至少50GB可用存储
  • Python环境:推荐使用Python 3.8+,并创建独立的虚拟环境

安装必要的Python包:

pip install opencv-python numpy tqdm pillow

对于标注工具的选择,我们对比了几种常见方案:

工具名称优点缺点适用场景
LabelImg简单易用,支持多种格式功能较基础小规模标注
CVAT支持团队协作,功能全面部署复杂大型项目
Roboflow云端服务,内置增强功能需要网络连接快速迭代

提示:对于交通灯细分灯色标注,建议使用支持快捷键操作的标注工具以提高效率

2. 视频抽帧与数据提取

滴滴D²-City数据集提供了丰富的行车记录仪视频素材。我们从原始MP4文件开始,使用OpenCV进行高效的帧提取。

关键考量因素

  • 抽帧频率:根据应用场景决定每秒抽取多少帧
  • 图像质量:检查每帧是否清晰可用
  • 存储格式:平衡质量与存储空间的格式选择

以下是优化后的抽帧脚本,增加了进度显示和错误处理:

import cv2 import os from tqdm import tqdm def extract_frames(video_path, output_dir, frame_interval=10): """ 从视频中按间隔抽帧保存 参数: video_path: 输入视频路径 output_dir: 输出目录 frame_interval: 抽帧间隔(帧数) """ if not os.path.exists(output_dir): os.makedirs(output_dir) cap = cv2.VideoCapture(video_path) if not cap.isOpened(): raise ValueError(f"无法打开视频文件: {video_path}") total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) saved_count = 0 with tqdm(total=total_frames, desc="处理进度") as pbar: for frame_idx in range(total_frames): ret, frame = cap.read() if not ret: break if frame_idx % frame_interval == 0: output_path = os.path.join(output_dir, f"frame_{frame_idx:06d}.jpg") cv2.imwrite(output_path, frame, [cv2.IMWRITE_JPEG_QUALITY, 90]) saved_count += 1 pbar.update(1) cap.release() print(f"抽帧完成,共保存{saved_count}张图像")

实际应用中,我们发现了几个常见问题及解决方案:

  1. 内存不足:处理大视频时,使用生成器逐帧读取而非一次性加载
  2. 时间戳对齐:保留原始时间信息以便后续分析
  3. 重复帧检测:添加简单的哈希比较避免存储重复内容

3. 数据标注策略与技巧

标注质量直接影响模型性能。针对斑马线、行人和交通灯这三类目标,我们制定了专门的标注规范。

3.1 标注类别定义

我们采用两套标注方案供不同需求选择:

基础版(3类别)

  • 行人(person)
  • 斑马线(crosswalk)
  • 交通灯(traffic_light)

进阶版(6类别)

  • 行人(person)
  • 斑马线(crosswalk)
  • 红灯(red_light)
  • 绿灯(green_light)
  • 黄灯(yellow_light)
  • 故障灯(broken_light)

3.2 标注边界框原则

对于不同类别,遵循以下标注规范:

  • 行人:包含全身,保留少量周围空间
  • 斑马线:标注完整可见部分,不考虑遮挡区域
  • 交通灯:仅标注灯箱部分,不包括支撑杆

交通灯细分标注时的注意事项:

  1. 只标注亮起的灯色
  2. 闪烁状态归类为故障灯
  3. 多个灯组需分别标注

3.3 标注效率提升技巧

通过实践总结,我们推荐以下工作流程:

  1. 预筛选阶段

    • 删除模糊、过暗或无效的帧
    • 对相似场景的帧进行分组批处理
  2. 标注阶段

    • 先标注大目标(斑马线),再处理小目标(交通灯)
    • 使用标注工具的快捷键功能
    • 对连续帧采用复制/微调策略
  3. 质检阶段

    • 检查边界框是否贴合目标
    • 验证类别标签是否正确
    • 确保无遗漏目标

注意:标注过程中定期保存进度,避免意外丢失工作成果

4. 数据集构建与YOLO格式转换

完成标注后,需要将数据转换为YOLO训练所需的格式。YOLO格式的标注文件为.txt文本,每行表示一个目标:

<类别索引> <中心x> <中心y> <宽度> <高度>

4.1 数据集划分

合理的训练集/验证集/测试集划分对模型评估至关重要。推荐比例:

  • 训练集:70%
  • 验证集:15%
  • 测试集:15%

使用以下Python代码实现随机划分:

import os import random from shutil import copyfile def split_dataset(image_dir, label_dir, output_dir, ratios=(0.7, 0.15, 0.15)): """ 划分数据集为训练集、验证集和测试集 参数: image_dir: 图像目录 label_dir: 标签目录 output_dir: 输出根目录 ratios: 划分比例(训练,验证,测试) """ # 创建输出目录结构 splits = ['train', 'val', 'test'] for split in splits: os.makedirs(os.path.join(output_dir, split, 'images'), exist_ok=True) os.makedirs(os.path.join(output_dir, split, 'labels'), exist_ok=True) # 获取所有图像文件(不带扩展名) image_files = [f.split('.')[0] for f in os.listdir(image_dir) if f.endswith('.jpg')] random.shuffle(image_files) # 计算各集数量 total = len(image_files) train_count = int(total * ratios[0]) val_count = int(total * ratios[1]) # 分配文件到各集 for i, base_name in enumerate(image_files): if i < train_count: split = 'train' elif i < train_count + val_count: split = 'val' else: split = 'test' # 复制图像和标签文件 src_img = os.path.join(image_dir, f"{base_name}.jpg") dst_img = os.path.join(output_dir, split, 'images', f"{base_name}.jpg") copyfile(src_img, dst_img) src_label = os.path.join(label_dir, f"{base_name}.txt") dst_label = os.path.join(output_dir, split, 'labels', f"{base_name}.txt") if os.path.exists(src_label): copyfile(src_label, dst_label)

4.2 数据增强策略

为提高模型泛化能力,建议在训练前应用数据增强。常见增强方式包括:

  • 色彩变换:亮度、对比度、饱和度调整
  • 几何变换:旋转、缩放、裁剪
  • 混合增强:Mosaic、MixUp等复合增强

在YOLOv5中,可以通过修改data.yaml文件配置增强参数:

# YOLOv5数据配置文件示例 train: ../train/images val: ../val/images nc: 6 # 类别数量 names: ['person', 'crosswalk', 'red_light', 'green_light', 'yellow_light', 'broken_light'] # 数据增强参数 augment: hsv_h: 0.015 # 色调增强 hsv_s: 0.7 # 饱和度增强 hsv_v: 0.4 # 亮度增强 degrees: 10.0 # 旋转角度范围 translate: 0.1 # 平移比例 scale: 0.5 # 缩放比例 shear: 0.0 # 剪切强度 perspective: 0.0 # 透视变换 flipud: 0.0 # 上下翻转概率 fliplr: 0.5 # 左右翻转概率 mosaic: 1.0 # mosaic增强概率 mixup: 0.0 # mixup增强概率

5. 模型训练与性能优化

完成数据集构建后,我们可以开始训练YOLO模型。以YOLOv5为例,介绍关键训练步骤和调优技巧。

5.1 基础训练配置

首先下载YOLOv5代码和预训练权重:

git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt

创建自定义数据集配置文件data/custom.yaml:

# 训练和验证图像路径 train: ../dataset/train/images val: ../dataset/val/images # 类别数量 nc: 6 # 类别名称 names: ['person', 'crosswalk', 'red_light', 'green_light', 'yellow_light', 'broken_light']

启动基础训练命令:

python train.py --img 640 --batch 16 --epochs 100 --data data/custom.yaml --weights yolov5s.pt

5.2 性能优化技巧

根据我们的实践经验,以下调整可以显著提升模型在交通场景下的表现:

  1. 输入分辨率:交通灯等小目标需要较高分辨率,建议至少640x640
  2. 锚框聚类:针对特定数据集重新计算锚框尺寸
  3. 类别权重:对样本较少的类别(如黄灯)适当增加权重
  4. 损失函数:调整分类和定位损失的权重比例

使用以下命令进行锚框聚类:

import numpy as np from sklearn.cluster import KMeans def cluster_anchors(label_files, n_anchors=9): """ 基于现有标注框计算优化的锚框尺寸 参数: label_files: 标签文件路径列表 n_anchors: 需要生成的锚框数量 """ boxes = [] for file in label_files: with open(file) as f: for line in f: _, x, y, w, h = map(float, line.split()) boxes.append([w, h]) boxes = np.array(boxes) kmeans = KMeans(n_clusters=n_anchors, random_state=42).fit(boxes) anchors = kmeans.cluster_centers_ # 按面积排序 anchors = anchors[np.argsort(anchors.prod(1))] return anchors

5.3 模型评估指标解读

训练完成后,需要关注以下关键指标:

  • mAP@0.5:IoU阈值为0.5时的平均精度
  • mAP@0.5:0.95:IoU阈值从0.5到0.95的平均精度
  • 各类别精度:特别是小目标(交通灯)的检测性能

在测试集上的典型性能表现:

模型版本输入尺寸mAP@0.5mAP@0.5:0.95参数量(M)
YOLOv5n6400.8920.6211.9
YOLOv5s6400.9270.6837.2
YOLOv5m6400.9410.71221.2

6. 实际应用与部署建议

训练好的模型需要部署到实际应用场景中。以下是几种常见的部署方案比较:

部署平台延迟吞吐量适用场景
本地GPU实时视频分析
边缘设备车载系统
云端API批量处理

对于行车记录仪等边缘设备,建议进行模型量化以提升效率:

import torch from yolov5.models.experimental import attempt_load # 加载训练好的模型 model = attempt_load('best.pt') model.eval() # 转换为TorchScript格式 example = torch.rand(1, 3, 640, 640) traced_model = torch.jit.trace(model, example) traced_model.save('yolov5_custom.pt') # 进行动态量化 quantized_model = torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtype=torch.qint8 ) torch.jit.save(torch.jit.script(quantized_model), 'yolov5_custom_quantized.pt')

在实际项目中,我们发现几个关键点:

  1. 夜间场景需要特殊的白平衡处理
  2. 雨天条件下的检测性能会下降15-20%
  3. 对于远距离小交通灯,增加测试时增强(TTA)可提升5-8%的召回率
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 11:32:46

Unity游戏马赛克移除终极指南:5分钟快速配置完整教程

Unity游戏马赛克移除终极指南&#xff1a;5分钟快速配置完整教程 【免费下载链接】UniversalUnityDemosaics A collection of universal demosaic BepInEx plugins for games made in Unity3D engine 项目地址: https://gitcode.com/gh_mirrors/un/UniversalUnityDemosaics …

作者头像 李华
网站建设 2026/5/30 11:27:03

揭秘:为什么Windows用户需要一款专属的AirPods桌面伴侣?

揭秘&#xff1a;为什么Windows用户需要一款专属的AirPods桌面伴侣&#xff1f; 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDesktop …

作者头像 李华
网站建设 2026/5/30 11:22:57

Python小红书数据采集终极指南:xhs库完整使用教程与实战应用

Python小红书数据采集终极指南&#xff1a;xhs库完整使用教程与实战应用 【免费下载链接】xhs 基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/ 项目地址: https://gitcode.com/gh_mirrors/xh/xhs 小红书作为国内领先的生活方式分享平台&#xff0c;…

作者头像 李华
网站建设 2026/5/30 11:18:20

3步掌握AMD Ryzen调试神器:从新手到高手的完整实战指南

3步掌握AMD Ryzen调试神器&#xff1a;从新手到高手的完整实战指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://g…

作者头像 李华