滴滴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_interval10): 从视频中按间隔抽帧保存 参数: 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(totaltotal_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, fframe_{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}张图像)实际应用中我们发现了几个常见问题及解决方案内存不足处理大视频时使用生成器逐帧读取而非一次性加载时间戳对齐保留原始时间信息以便后续分析重复帧检测添加简单的哈希比较避免存储重复内容3. 数据标注策略与技巧标注质量直接影响模型性能。针对斑马线、行人和交通灯这三类目标我们制定了专门的标注规范。3.1 标注类别定义我们采用两套标注方案供不同需求选择基础版3类别行人person斑马线crosswalk交通灯traffic_light进阶版6类别行人person斑马线crosswalk红灯red_light绿灯green_light黄灯yellow_light故障灯broken_light3.2 标注边界框原则对于不同类别遵循以下标注规范行人包含全身保留少量周围空间斑马线标注完整可见部分不考虑遮挡区域交通灯仅标注灯箱部分不包括支撑杆交通灯细分标注时的注意事项只标注亮起的灯色闪烁状态归类为故障灯多个灯组需分别标注3.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_okTrue) os.makedirs(os.path.join(output_dir, split, labels), exist_okTrue) # 获取所有图像文件不带扩展名 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.pt5.2 性能优化技巧根据我们的实践经验以下调整可以显著提升模型在交通场景下的表现输入分辨率交通灯等小目标需要较高分辨率建议至少640x640锚框聚类针对特定数据集重新计算锚框尺寸类别权重对样本较少的类别如黄灯适当增加权重损失函数调整分类和定位损失的权重比例使用以下命令进行锚框聚类import numpy as np from sklearn.cluster import KMeans def cluster_anchors(label_files, n_anchors9): 基于现有标注框计算优化的锚框尺寸 参数: 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_clustersn_anchors, random_state42).fit(boxes) anchors kmeans.cluster_centers_ # 按面积排序 anchors anchors[np.argsort(anchors.prod(1))] return anchors5.3 模型评估指标解读训练完成后需要关注以下关键指标mAP0.5IoU阈值为0.5时的平均精度mAP0.5:0.95IoU阈值从0.5到0.95的平均精度各类别精度特别是小目标交通灯的检测性能在测试集上的典型性能表现模型版本输入尺寸mAP0.5mAP0.5:0.95参数量(M)YOLOv5n6400.8920.6211.9YOLOv5s6400.9270.6837.2YOLOv5m6400.9410.71221.26. 实际应用与部署建议训练好的模型需要部署到实际应用场景中。以下是几种常见的部署方案比较部署平台延迟吞吐量适用场景本地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}, dtypetorch.qint8 ) torch.jit.save(torch.jit.script(quantized_model), yolov5_custom_quantized.pt)在实际项目中我们发现几个关键点夜间场景需要特殊的白平衡处理雨天条件下的检测性能会下降15-20%对于远距离小交通灯增加测试时增强(TTA)可提升5-8%的召回率
滴滴D²-City数据集二次标注实战:手把手教你构建斑马线+行人+交通灯YOLO训练集
发布时间:2026/5/30 11:34:14
滴滴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_interval10): 从视频中按间隔抽帧保存 参数: 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(totaltotal_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, fframe_{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}张图像)实际应用中我们发现了几个常见问题及解决方案内存不足处理大视频时使用生成器逐帧读取而非一次性加载时间戳对齐保留原始时间信息以便后续分析重复帧检测添加简单的哈希比较避免存储重复内容3. 数据标注策略与技巧标注质量直接影响模型性能。针对斑马线、行人和交通灯这三类目标我们制定了专门的标注规范。3.1 标注类别定义我们采用两套标注方案供不同需求选择基础版3类别行人person斑马线crosswalk交通灯traffic_light进阶版6类别行人person斑马线crosswalk红灯red_light绿灯green_light黄灯yellow_light故障灯broken_light3.2 标注边界框原则对于不同类别遵循以下标注规范行人包含全身保留少量周围空间斑马线标注完整可见部分不考虑遮挡区域交通灯仅标注灯箱部分不包括支撑杆交通灯细分标注时的注意事项只标注亮起的灯色闪烁状态归类为故障灯多个灯组需分别标注3.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_okTrue) os.makedirs(os.path.join(output_dir, split, labels), exist_okTrue) # 获取所有图像文件不带扩展名 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.pt5.2 性能优化技巧根据我们的实践经验以下调整可以显著提升模型在交通场景下的表现输入分辨率交通灯等小目标需要较高分辨率建议至少640x640锚框聚类针对特定数据集重新计算锚框尺寸类别权重对样本较少的类别如黄灯适当增加权重损失函数调整分类和定位损失的权重比例使用以下命令进行锚框聚类import numpy as np from sklearn.cluster import KMeans def cluster_anchors(label_files, n_anchors9): 基于现有标注框计算优化的锚框尺寸 参数: 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_clustersn_anchors, random_state42).fit(boxes) anchors kmeans.cluster_centers_ # 按面积排序 anchors anchors[np.argsort(anchors.prod(1))] return anchors5.3 模型评估指标解读训练完成后需要关注以下关键指标mAP0.5IoU阈值为0.5时的平均精度mAP0.5:0.95IoU阈值从0.5到0.95的平均精度各类别精度特别是小目标交通灯的检测性能在测试集上的典型性能表现模型版本输入尺寸mAP0.5mAP0.5:0.95参数量(M)YOLOv5n6400.8920.6211.9YOLOv5s6400.9270.6837.2YOLOv5m6400.9410.71221.26. 实际应用与部署建议训练好的模型需要部署到实际应用场景中。以下是几种常见的部署方案比较部署平台延迟吞吐量适用场景本地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}, dtypetorch.qint8 ) torch.jit.save(torch.jit.script(quantized_model), yolov5_custom_quantized.pt)在实际项目中我们发现几个关键点夜间场景需要特殊的白平衡处理雨天条件下的检测性能会下降15-20%对于远距离小交通灯增加测试时增强(TTA)可提升5-8%的召回率