当前位置: 首页 > news >正文

保姆级教程:用Python脚本将TT100K交通标志数据集转为YOLOv8格式(附完整源码与数据集)

从TT100K到YOLOv8:交通标志数据集转换实战指南

当你第一次拿到TT100K数据集时,可能会被它复杂的JSON标注结构弄得一头雾水。作为国内最大的交通标志数据集之一,TT100K包含了10万张图像和3万多个标注框,涵盖221类交通标志。但要将它用于YOLOv8训练,我们需要经历从JSON到YOLO格式的转换过程。本文将手把手带你完成这个转换,并提供完整的Python脚本和优化技巧。

1. 环境准备与数据理解

在开始转换前,我们需要先搭建好开发环境。推荐使用Python 3.8+和以下依赖库:

pip install opencv-python tqdm numpy

TT100K数据集通常包含以下目录结构:

tt100k/ ├── annotations_all.json # 全部标注数据 ├── data/ # 原始图像 │ ├── 1.jpg │ ├── 2.jpg │ └── ... └── types.json # 类别定义

关键数据结构解析:

  • annotations_all.json:包含所有图像的标注信息
  • imgs字段:存储每张图片的路径和对应的标注对象
  • objects数组:每个元素代表一个交通标志的边界框和类别

提示:原始数据集包含221个类别,但实际应用中我们通常只需要关注出现频率较高的标志类型。

2. 数据预处理与类别筛选

首先我们需要筛选出出现频率较高的交通标志类别。以下代码统计各类别出现的图片数量:

def class_statistics(self): parent_path = 'your_dataset_path' # 修改为你的数据集路径 with open(os.path.join(parent_path, 'annotations_all.json')) as f: origin_dict = json.load(f) classes = origin_dict['types'] sta = {i: [] for i in classes} for img_id, img_info in origin_dict['imgs'].items(): for obj in img_info['objects']: label = obj['category'] if img_info['path'] not in sta[label]: sta[label].append(img_info['path']) # 筛选出现次数≥100的类别 filtered = {k: v for k, v in sta.items() if len(v) >= 100} print(f"保留{len(filtered)}个类别")

执行后会生成statistics.json文件,记录筛选后的类别信息。这个阈值(100)可以根据你的需求调整:

阈值类别数量数据量
504512K
100329K
150257K

3. 数据集划分与格式转换

接下来我们将数据集按7:2:1的比例划分为训练集、验证集和测试集:

def split_dataset(self): with open('statistics.json') as f: selected = json.load(f) # 初始化COCO格式数据集 datasets = { 'train': {'images': [], 'annotations': []}, 'val': {'images': [], 'annotations': []}, 'test': {'images': [], 'annotations': []} } # 为每个类别分配ID class_ids = {cls: idx for idx, cls in enumerate(selected['type'])} for img_id, img_info in origin_dict['imgs'].items(): img_name = img_info['path'].split('/')[-1] if img_name not in selected['images']: continue # 确定数据划分(7:2:1) rand = random.random() phase = 'train' if rand < 0.7 else 'val' if rand < 0.9 else 'test' # 添加图像信息 img_data = { 'file_name': img_name, 'id': img_id, 'width': img_info['width'], 'height': img_info['height'] } datasets[phase]['images'].append(img_data) # 添加标注信息 for obj in img_info['objects']: if obj['category'] not in selected['type']: continue bbox = obj['bbox'] datasets[phase]['annotations'].append({ 'bbox': [bbox['xmin'], bbox['ymin'], bbox['xmax']-bbox['xmin'], bbox['ymax']-bbox['ymin']], 'category_id': class_ids[obj['category']], 'image_id': img_id, 'id': len(datasets[phase]['annotations'])+1 })

4. COCO转YOLO格式的核心算法

YOLO格式要求每个图像对应一个.txt文件,每行表示一个对象,格式为:

class_id center_x center_y width height

转换函数的关键部分:

def coco2yolo(self, json_file, output_dir): os.makedirs(output_dir, exist_ok=True) with open(json_file) as f: data = json.load(f) # 生成类别映射文件 with open(os.path.join(output_dir, 'classes.txt'), 'w') as f: for cat in sorted(data['categories'], key=lambda x: x['id']): f.write(f"{cat['name']}\n") # 处理每张图像 for img in data['images']: img_id = img['id'] anns = [a for a in data['annotations'] if a['image_id'] == img_id] txt_path = os.path.join(output_dir, os.path.splitext(img['file_name'])[0] + '.txt') with open(txt_path, 'w') as f: for ann in anns: # 转换坐标到YOLO格式 x, y, w, h = ann['bbox'] x_center = (x + w/2) / img['width'] y_center = (y + h/2) / img['height'] w_norm = w / img['width'] h_norm = h / img['height'] f.write(f"{ann['category_id']} {x_center:.6f} {y_center:.6f} " f"{w_norm:.6f} {h_norm:.6f}\n")

5. 完整流程与常见问题解决

完整的转换流程如下:

  1. 数据准备

    • 下载TT100K数据集
    • 解压并检查annotations_all.json文件
  2. 执行转换

    converter = TT100K2YOLO() converter.class_statistics() # 步骤1:类别筛选 converter.split_dataset() # 步骤2:数据集划分 converter.coco2yolo('train.json', 'labels/train') # 步骤3:格式转换 converter.coco2yolo('val.json', 'labels/val') converter.coco2yolo('test.json', 'labels/test')

常见问题及解决方案:

  • 路径问题:确保所有文件路径正确,特别是在Windows系统中注意反斜杠转义
  • 内存不足:对于大文件可分批次处理
  • 类别不匹配:检查statistics.json中的类别是否与转换一致

最终得到的YOLO格式数据集结构:

yolo_tt100k/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ ├── test/ └── classes.txt

6. YOLOv8训练配置

转换完成后,创建data.yaml文件配置训练:

# data.yaml train: ../yolo_tt100k/images/train val: ../yolo_tt100k/images/val test: ../yolo_tt100k/images/test nc: 32 # 类别数量 names: ['i2', 'i4', 'i5', 'il100', ...] # 你的类别列表

然后使用YOLOv8命令行开始训练:

yolo train model=yolov8n.pt data=data.yaml epochs=100 imgsz=640

在实际项目中,我发现以下几个技巧能显著提升模型性能:

  • 对小型交通标志适当增加图像分辨率
  • 使用--augment参数启用数据增强
  • 对类别不平衡问题使用--weighted参数
http://www.jsqmd.com/news/941958/

相关文章:

  • 从KITTI原始数据到OpenPCDet可用的.pkl:一份完整的自定义数据预处理指南
  • 3步搞定:抖音视频批量下载,支持直播回放永久保存
  • 5分钟搞定Linux无线网络:RTL8852BE驱动终极安装指南
  • 告别Keil:用J-Link和Ozone免费调试任意编译器生成的ELF文件(附波形分析)
  • 从标注到训练:手把手教你用EISeg+PaddleSeg打造自己的图像分割模型(附避坑指南)
  • Apex Legends智能压枪助手:免费开源工具实现精准射击控制
  • Beyond Compare 5激活终极指南:3种方法获取永久授权密钥
  • 2026广州包包回收香奈儿/迪奥/古驰变现,收的顶占据榜首 - 奢侈品回收测评
  • HRNet多卡训练配置教程:8卡并行训练实现210FPS的完整方案
  • 专升本汉语言文学资料|2026古代文学现代文学真题PDF电子版
  • 如何优化Distilbert-base-uncased-emotion推理速度:3个实用技巧 [特殊字符]
  • 别再手动排班了!用Python的linear_sum_assignment函数5分钟搞定最优任务分配
  • OneMore插件终极指南:如何让OneNote效率提升300%
  • 2026年成都企业定制酱酒怎么选?茅台镇源头坤沙酒厂直营品牌与高端商务接待完全避坑指南 - 企业名录优选推荐
  • 微信小程序一键接入高德/腾讯/百度三地图定位与路线导航的完整代码包
  • 手把手教你白嫖Llama3-70B的API:用Python代码5分钟搞定免费集成
  • 从日线到Tick:手把手教你用迅投QMT获取全周期历史行情数据(含北向资金等特殊数据)
  • BMFont避坑指南:为什么你导出的艺术字体在Unity里显示不全或变糊?
  • 额济纳旗26年最新专业手表包包回收权威店铺推荐,TOP排行榜 - 莘州文化
  • WzComparerR2终极指南:冒险岛WZ文件提取器完全使用教程
  • 专升本医学综合资料|2026解剖生理病理药理真题PDF电子版
  • 突破城通网盘限速瓶颈:客户端直解析架构的深度优化实践
  • PADS老鸟的Gerber输出效率秘籍:巧用无模指令与CAM模板批量处理
  • Beyond Compare 5密钥生成指南:3种方法免费获取永久授权
  • 核心
  • 除了Excel,律所还有什么更好的案件管理方式?三种方案的深度对比
  • 科学数据管理:构建可持续生态系统的四大支柱与实战框架
  • HarmonyOS 应用国际化和主题适配:ResUtil 综合运用实战指南
  • SMUDebugTool终极指南:如何深度掌控AMD Ryzen处理器硬件参数
  • Mac窗口置顶终极指南:用Topit三步打造高效多任务工作流