news 2026/6/2 9:27:57

保姆级教程:用Labelme标注交通灯数据集,并一键转成YOLOv5训练格式(附完整脚本)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
保姆级教程:用Labelme标注交通灯数据集,并一键转成YOLOv5训练格式(附完整脚本)

从零构建交通信号灯检测模型:Labelme标注与YOLOv5格式转换全流程实战

在计算机视觉领域,目标检测一直是热门研究方向,而交通信号灯的识别更是自动驾驶和智能交通系统中的关键环节。本文将手把手带你完成从原始图像标注到YOLOv5模型训练准备的全过程,重点解决两个核心痛点:如何用Labelme进行高精度多边形标注,以及如何将标注结果高效转换为YOLOv5所需的训练格式。

1. 环境配置与工具准备

工欲善其事,必先利其器。在开始标注前,我们需要搭建稳定可靠的工作环境。推荐使用Anaconda创建独立的Python环境,避免与系统环境产生冲突:

conda create -n labelme python=3.8 -y conda activate labelme conda install pyqt=5.15.7 -y pip install labelme==5.1.1

安装完成后,通过终端输入labelme命令即可启动标注工具。为方便后续管理,建议按以下结构创建项目目录:

yolov5_traffic_light/ ├── images/ # 存放原始图像 ├── annotations/ # 保存Labelme生成的JSON文件 ├── labels/ # 存放转换后的YOLO格式标签 ├── scripts/ # 存放转换脚本 └── dataset/ # 最终训练数据集

2. 高质量数据标注技巧

2.1 Labelme标注实操细节

启动Labelme后,点击"Open Dir"选择images文件夹加载待标注图像。标注交通信号灯时需特别注意:

  1. 多边形标注技巧

    • 使用滚轮放大图像至能清晰辨识信号灯边缘
    • 首尾点必须严格重合形成闭合区域
    • 对于圆形信号灯,至少标注12个点以保证轮廓精度
  2. 标签命名规范

    • 保持一致性(如全部小写)
    • 建议采用color_state格式(如red_on,green_off
    • 避免使用空格和特殊字符

标注示例
对同一场景中的多个信号灯,应分别标注并赋予正确标签。夜间场景需特别注意区分信号灯是否处于点亮状态。

2.2 标注质量控制

为提高模型训练效果,标注时应注意:

  • 完整性:确保标注覆盖整个信号灯区域,包括边缘光晕
  • 一致性:相同类别的标注方式保持一致
  • 排除干扰:不标注被遮挡超过30%的信号灯

完成标注后,系统会为每张图像生成对应的JSON文件,包含以下关键信息:

{ "version": "5.1.1", "flags": {}, "shapes": [ { "label": "red_on", "points": [[302, 205], [310, 198], ...], "shape_type": "polygon" } ], "imagePath": "IMG_001.jpg", "imageData": null }

3. 格式转换核心技术

3.1 Labelme转YOLOv5格式原理

YOLOv5要求标签文件为TXT格式,每行表示一个对象,包含:

<class_id> <x_center> <y_center> <width> <height>

而Labelme生成的是多边形顶点坐标,需要进行以下转换:

  1. 将多边形转换为最小外接矩形
  2. 将绝对坐标归一化为相对坐标(0-1范围)
  3. 计算中心点和宽高

转换脚本核心逻辑:

def polygon_to_yolo(points, img_width, img_height): x_coords = [p[0] for p in points] y_coords = [p[1] for p in points] x_min, x_max = min(x_coords), max(x_coords) y_min, y_max = min(y_coords), max(y_coords) x_center = (x_min + x_max) / 2 / img_width y_center = (y_min + y_max) / 2 / img_height width = (x_max - x_min) / img_width height = (y_max - y_min) / img_height return [x_center, y_center, width, height]

3.2 完整转换脚本实现

创建json2yolo.py脚本,实现批量转换:

import os import json from tqdm import tqdm def convert(json_dir, output_dir, class_list): os.makedirs(output_dir, exist_ok=True) for json_file in tqdm(os.listdir(json_dir)): if not json_file.endswith('.json'): continue with open(os.path.join(json_dir, json_file)) as f: data = json.load(f) txt_path = os.path.join(output_dir, json_file.replace('.json', '.txt')) with open(txt_path, 'w') as f: for shape in data['shapes']: class_id = class_list.index(shape['label']) points = shape['points'] bbox = polygon_to_yolo(points, data['imageWidth'], data['imageHeight']) line = f"{class_id} {' '.join(map(str, bbox))}\n" f.write(line) if __name__ == '__main__': convert('annotations', 'labels', ['red_on', 'yellow_on', 'green_on'])

4. 数据集划分与验证

4.1 科学划分数据集

合理的数据集划分对模型评估至关重要,推荐比例:

数据集比例用途
训练集70%模型训练
验证集20%超参数调优
测试集10%最终评估

实现代码片段:

def split_dataset(image_dir, label_dir, output_dir, ratios=(0.7, 0.2, 0.1)): files = [f for f in os.listdir(image_dir) if f.endswith('.jpg')] random.shuffle(files) train_idx = int(len(files) * ratios[0]) val_idx = train_idx + int(len(files) * ratios[1]) splits = { 'train': files[:train_idx], 'val': files[train_idx:val_idx], 'test': files[val_idx:] } for split, files in splits.items(): os.makedirs(os.path.join(output_dir, split, 'images'), exist_ok=True) os.makedirs(os.path.join(output_dir, split, 'labels'), exist_ok=True) for file in files: # 复制图像和标签文件到对应目录 ...

4.2 数据一致性检查

转换完成后必须验证数据质量:

  1. 图像-标签匹配检查

    # 检查文件数量是否一致 ls images/*.jpg | wc -l ls labels/*.txt | wc -l
  2. 标注可视化验证: 使用以下脚本将YOLO格式标注绘制到图像上:

    import cv2 def visualize(image_path, label_path, class_names): image = cv2.imread(image_path) height, width = image.shape[:2] with open(label_path) as f: for line in f: class_id, xc, yc, w, h = map(float, line.strip().split()) x1 = int((xc - w/2) * width) y1 = int((yc - h/2) * height) x2 = int((xc + w/2) * width) y2 = int((yc + h/2) * height) cv2.rectangle(image, (x1, y1), (x2, y2), (0,255,0), 2) cv2.putText(image, class_names[int(class_id)], (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0,255,0), 2) cv2.imshow('Preview', image) cv2.waitKey(0)

5. 高效标注的工程实践

5.1 标注效率提升技巧

  • 快捷键记忆

    • Ctrl+O打开目录
    • Ctrl+S保存当前标注
    • Ctrl+鼠标滚轮快速缩放
  • 批量处理技巧

    # 批量检查JSON文件完整性 find annotations/ -name "*.json" -exec jq '.' {} > /dev/null \;

5.2 常见问题解决方案

问题现象可能原因解决方案
转换后坐标超出[0,1]范围标注点超出图像边界检查标注时是否误点在图像外
转换后bbox宽高为0首尾点未重合确保多边形闭合
类别ID错误class_list顺序不匹配保持转换和训练使用相同class_list

在实际项目中,建议建立标注规范文档,包含:

  1. 标签命名规则
  2. 标注质量要求
  3. 特殊情况处理指南
  4. 验收标准

经过完整流程处理后的数据集,可直接用于YOLOv5模型的���练。将数据集按照YOLOv5要求的目录结构组织后,创建对应的YAML配置文件即可开始训练。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/2 9:27:56

如何利用MiniCPM-V-4.6-gguf实现高效图像理解:完整教程指南

如何利用MiniCPM-V-4.6-gguf实现高效图像理解&#xff1a;完整教程指南 【免费下载链接】MiniCPM-V-4.6-gguf 项目地址: https://ai.gitcode.com/OpenBMB/MiniCPM-V-4.6-gguf MiniCPM-V-4.6-gguf是OpenBMB开源社区推出的轻量级多模态模型&#xff0c;专为高效图像理解任…

作者头像 李华
网站建设 2026/6/2 9:25:04

Chem4Word插件:在Word中实现化学结构式的语义化编辑与数据交换

1. 项目概述与核心价值如果你是一名化学专业的学生、研究员&#xff0c;或者是在制药、材料科学领域工作的从业者&#xff0c;那么你一定对在文档中绘制化学结构式这件事深有体会。在Word里画一个苯环&#xff0c;可能需要你费劲地组合各种线条和文本框&#xff1b;想标注一个复…

作者头像 李华
网站建设 2026/6/2 9:17:53

端云协同架构实践:将AI与弹性计算能力注入移动应用

1. 项目概述&#xff1a;当“云”触手可及“把云带到你身边的智能手机上”——这个标题听起来像是一个宏大的愿景&#xff0c;但在我过去十多年的移动开发与云计算交叉领域的实践中&#xff0c;它早已不是一个概念&#xff0c;而是每天都在发生的现实。我们早已习惯了在手机上刷…

作者头像 李华
网站建设 2026/6/2 9:17:33

Naiad on Azure:基于增量计算与时间戳的实时交互式大数据分析平台

1. 项目概述&#xff1a;当Naiad遇见Azure&#xff0c;为大数据分析师打开一扇新窗今天在硅谷的TechFair上&#xff0c;除了炫酷的Holograph大数据可视化&#xff0c;另一个让我这个老码农眼前一亮的&#xff0c;是微软研究院展示的Naiad on Azure项目。简单来说&#xff0c;这…

作者头像 李华