保姆级教程:用MMLab的yolo2coco.py脚本,5分钟把你的YOLOv5/v8数据集变成COCO格式
5分钟极速转换YOLOv5/v8数据集到COCO格式的实战指南当你从YOLOv5/v8的训练环境中走出来准备将模型迁移到MMDetection等框架时数据格式的转换往往成为第一道门槛。COCO格式作为目标检测领域的通用标准其结构化标注方式与YOLO的简洁风格存在显著差异。本文将带你用MMLab官方工具实现零门槛转换无需理解复杂的数据结构差异只需5分钟即可完成整个流程。1. 准备工作理解YOLO与COCO的核心差异在开始转换前了解两种格式的本质区别能帮助你在后续步骤中规避常见错误YOLO格式特点每个图像对应一个.txt标注文件标注内容为归一化坐标[class_id, x_center, y_center, width, height]不包含图像尺寸信息类别定义通过独立的classes.txt文件管理COCO格式特点所有标注集中存储在一个JSON文件中使用绝对像素坐标[x_min, y_min, width, height]包含完整的图像元数据宽高、文件名等类别信息内嵌在JSON结构中关键差异对比表特性YOLO格式COCO格式坐标系统归一化中心坐标绝对像素坐标存储方式分散的txt文件集中式JSON文件图像信息不包含包含宽高等元数据类别定义外部classes.txt内嵌在JSON结构中2. 环境配置与目录结构准备确保你的Python环境已安装以下依赖推荐使用conda创建独立环境pip install mmcv mmengine必须的目录结构假设根目录为/data/yolo_dataset/data/yolo_dataset ├── classes.txt # 类别定义文件 ├── labels # YOLO标注文件夹 │ ├── image1.txt # 与图像同名的标注文件 │ └── image2.txt └── images # 图像文件夹 ├── image1.jpg └── image2.png注意图像与标注文件必须严格同名仅扩展名不同这是脚本正常工作的前提条件。如果你的数据集已划分训练集/验证集/测试集还需准备对应的划分文件/data/yolo_dataset ├── train.txt # 每行是images文件夹中的文件名 ├── val.txt # 例如image1.jpg └── test.txt # 注意使用相对路径而非绝对路径3. 一键执行转换脚本下载MMLab官方提供的yolo2coco.py脚本后只需单条命令即可完成转换python yolo2coco.py /data/yolo_dataset脚本执行过程详解目录结构验证自动检查images、labels和classes.txt是否存在数据划分检测查找train.txt/val.txt/test.txt决定输出结构坐标转换核心逻辑# YOLO归一化坐标 → COCO绝对坐标 x1 (x - w / 2) * image_width y1 (y - h / 2) * image_height x2 (x w / 2) * image_width y2 (y h / 2) * image_height结果输出在annotations文件夹生成JSON文件典型输出结构/data/yolo_dataset └── annotations ├── result.json # 未划分时的统一输出 ├── train.json # 存在划分文件时的输出 ├── val.json └── test.json4. 结果验证与可视化转换完成后强烈建议使用MMDetection提供的可视化工具检查结果python tools/analysis_tools/browse_coco_json.py \ --img-dir /data/yolo_dataset/images \ --ann-file /data/yolo_dataset/annotations/result.json常见问题排查指南标注错位检查classes.txt是否与原始训练时一致漏转换图像确认labels中的.txt文件与images中的文件严格对应坐标溢出查看可视化结果中边界框是否超出图像范围类别ID混乱验证JSON文件中categories字段的id与name对应关系5. 高级技巧与性能优化对于大规模数据集可以考虑以下优化策略并行处理加速# 修改脚本中的单线程处理部分 with mmengine.TrackParallelProgress(enumerate(indices), nproc4) as pbar: for idx, image in pbar: # 处理逻辑保持不变内存优化方案对于超过10万张图像的数据集建议按划分文件分批处理使用ijson库流式处理超大JSON文件自定义扩展 如果需要添加额外字段如拍摄设备信息可修改get_image_info函数def get_image_info(yolo_image_dir, idx, file_name): img_info_dict { file_name: file_name, id: idx, width: width, height: height, custom_field: your_data # 添加自定义字段 } return img_info_dict, height, width转换后的COCO数据集可直接用于MMDetection训练其标准的格式也兼容PyTorch等主流框架。实际项目中这种转换过程往往只需在数据准备阶段执行一次但正确的转换结果对后续模型性能有决定性影响。