Python自动化实战:CrowdHuman数据集高效转YOLOv5格式全流程解析
每次面对新数据集时,最头疼的就是格式转换问题。上周我接手一个行人检测项目,需要用到CrowdHuman数据集,但它的ODGT标注格式和YOLOv5不兼容。经过两天折腾,终于总结出一套完整的自动化处理方案,今天就把这个保姆级教程分享给大家,包含完整的代码实现和原理讲解。
1. 环境准备与数据获取
在开始之前,我们需要准备好基础环境。建议使用Python 3.8+版本,并安装以下依赖库:
bash复制pip install pandas numpy tqdm opencv-python
CrowdHuman数据集可以从官网下载,主要包含以下文件:
-
图像文件(ZIP压缩包):
- CrowdHuman_train01.zip
- CrowdHuman_train02.zip
- CrowdHuman_train03.zip
- CrowdHuman_val.zip
-
标注文件:
- annotation_train.odgt
- annotation_val.odgt
提示:下载完成后,建议先校验文件完整性,避免后续处理出错。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据集结构解析与预处理
CrowdHuman的标注格式比较特殊,采用ODGT(Open Dataset Ground Truth)格式,这是一种基于JSON Lines的文本格式。每个标注文件包含多行,每行是一个JSON对象,对应一张图片的标注信息。
典型的标注结构如下:
json复制{
"ID": "273271,1017c000ac1360b7",
"gtboxes": [
{
"tag": "person",
"vbox": [x,y,w,h],
"fbox": [x,y,w,h],
"hbox": [x,y,w,h],
"extra": {...}
},
...
]
}
其中关键字段说明:
vbox: 可见框 (visible box)fbox: 全框 (full box)hbox: 头部框 (head box)
对于行人检测任务,我们通常使用fbox作为检测目标。
3. ODGT转YOLOv5格式的核心代码实现
下面是我编写的转换脚本核心部分,包含详细注释:
python复制import json
import os
from pathlib import Path
import cv2
from tqdm import tqdm
def convert_odgt_to_yolo(odgt_path, images_dir, output_dir, class_filter=None):
"""
将CrowdHuman ODGT格式转换为YOLOv5格式
参数:
odgt_path: ODGT标注文件路径
images_dir: 图像文件目录
output_dir: 输出目录
class_filter: 需要保留的类别列表
"""
os.makedirs(output_dir, exist_ok=True)
with open(odgt_path, 'r') as f:
lines = f.readlines()
for line in tqdm(lines, desc=f"Processing {odgt_path}"):
data = json.loads(line)
img_id = data['ID'
