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

(四)机器学习小白入门YOLOv :图片标注实操手册

(1)机器学习小白入门YOLOv :从概念到实践
(2)机器学习小白入门 YOLOv:从模块优化到工程部署
(3)机器学习小白入门 YOLOv: 解锁图片分类新技能
(4)机器学习小白入门YOLOv :图片标注实操手册
(5)机器学习小白入门 YOLOv:数据需求与图像不足应对策略

对于熟悉 Python 和 YOLOv 的资深程序员而言,图片标注是模型训练前至关重要的环节,其质量直接影响模型的检测精度。以下是详细的标注过程、步骤及相关实例代码:

一、标注前的准备工作

(一)数据集整理

首先要对收集到的图片进行筛选和整理。去除模糊、光照异常、目标不清晰的图片,保证数据集的有效性。同时,按照一定的比例划分训练集、验证集和测试集,一般可采用 8:1:1 的比例,也可根据实际需求调整。另外,为了让模型更好地学习,需要确保数据集中包含各种场景、角度、尺寸的目标对象。

以下是使用 Python 划分数据集的示例代码:

import os
import shutil
import randomdef split_dataset(image_dir, train_ratio=0.8, val_ratio=0.1, test_ratio=0.1):# 创建训练集、验证集、测试集文件夹train_dir = os.path.join(image_dir, 'train')val_dir = os.path.join(image_dir, 'val')test_dir = os.path.join(image_dir, 'test')for dir in [train_dir, val_dir, test_dir]:if not os.path.exists(dir):os.makedirs(dir)# 获取所有图片路径image_files = [f for f in os.listdir(image_dir) if f.endswith(('.jpg', '.jpeg', '.png'))]random.shuffle(image_files)# 计算各数据集数量total = len(image_files)train_num = int(total * train_ratio)val_num = int(total * val_ratio)# 复制图片到对应文件夹for i, file in enumerate(image_files):src = os.path.join(image_dir, file)if i < train_num:dst = os.path.join(train_dir, file)elif i < train_num + val_num:dst = os.path.join(val_dir, file)else:dst = os.path.join(test_dir, file)shutil.copy(src, dst)# 使用示例
image_directory = 'path/to/your/images'
split_dataset(image_directory)

(二)确定标注目标和类别

明确需要标注的目标对象,比如在目标检测任务中,可能需要标注行人、车辆、交通信号灯等。然后对这些目标进行类别定义,每个类别给予唯一的标识符,方便后续的标注和模型训练。

(三)选择合适的标注工具

根据实际需求选择标注工具,常用的标注工具有 LabelImg、LabelMe、VGG Image Annotator(VIA)等。对于 YOLOv 模型,通常需要输出特定格式的标注文件(如 txt 格式),部分工具可以直接生成该格式,能减少后续格式转换的工作。比如 LabelImg 就支持 YOLO 格式的标注,使用起来较为便捷。

二、标注实施步骤(以 LabelImg 为例)

(一)导入图片到标注工具

  1. 打开 LabelImg 软件,点击左上角的 “Open Dir” 按钮,在弹出的窗口中选择整理好的图片文件夹,即可将该文件夹下的所有图片导入到工具中。
    在这里插入图片描述

  2. 若需要批量处理图片,可点击 “Change Save Dir” 设置标注文件的保存路径,确保标注文件与图片对应存放。

(二)进行目标框标注

  1. 在工具栏中选择 “Create RectBox” 工具。
    在这里插入图片描述

  2. 对于当前显示的图片,找到目标对象,按住鼠标左键拖动,绘制一个能够准确包围目标的矩形边界框。例如,标注一辆汽车时,边界框应从汽车的左上角边缘到右下角边缘,尽量不包含过多背景,也不遗漏汽车的任何部分。
    在这里插入图片描述

  3. 绘制完成后,松开鼠标,会弹出一个类别选择窗口。
    在这里插入图片描述

(三)填写类别信息

  1. 在弹出的类别选择窗口中,从预设的类别列表中选择该目标对应的类别,如 “dog”。
    在这里插入图片描述

  2. 若该类别未在列表中,可直接输入类别名称并点击 “OK”,该类别会被添加到列表中供后续使用。
    在这里插入图片描述

  3. 完成一个目标的标注后,可点击 “Next Image”(快捷键 “D”)切换到下一张图片,重复上述标注操作。

实例过程:假设要标注一批包含行人、自行车和摩托车的图片。导入图片文件夹后,第一张图片中有一位行人和一辆自行车。使用 “Create RectBox” 工具分别为行人和自行车绘制边界框,在类别选择窗口中分别选择 “person” 和 “bicycle”,完成标注后切换到下一张图片继续标注。

三、标注后的检查与处理

(一)标注质量检查

对标注好的图片进行逐一检查,查看边界框是否准确、类别标注是否正确。可以通过随机抽查、交叉检查等方式提高检查的准确性。对于发现的错误标注,要及时进行修正。

import osdef check_annotations(image_dir, label_dir, class_names):class_ids = {name: i for i, name in enumerate(class_names)}error_log = []for image_file in os.listdir(image_dir):if not image_file.endswith(('.jpg', '.jpeg', '.png')):continueimage_name = os.path.splitext(image_file)[0]label_file = os.path.join(label_dir, f'{image_name}.txt')# 检查标注文件是否存在if not os.path.exists(label_file):error_log.append(f'标注文件不存在:{label_file}')continue# 检查标注内容with open(label_file, 'r') as f:lines = f.readlines()for line_num, line in enumerate(lines, 1):parts = line.strip().split()if len(parts) != 5:error_log.append(f'{label_file}{line_num}行格式错误,应为5个字段')continueclass_id, x_center, y_center, width, height = partstry:class_id = int(class_id)x_center = float(x_center)y_center = float(y_center)width = float(width)height = float(height)except ValueError:error_log.append(f'{label_file}{line_num}行字段类型错误')continueif class_id not in class_ids.values():error_log.append(f'{label_file}{line_num}行类别ID无效:{class_id}')if not (0 <= x_center <= 1 and 0 <= y_center <= 1 and 0 <= width <= 1 and 0 <= height <= 1):error_log.append(f'{label_file}{line_num}行坐标值超出范围')return error_log# 使用示例
class_names = ['person', 'car', 'traffic_light']
image_dir = 'path/to/train/images'
label_dir = 'path/to/train/labels'
errors = check_annotations(image_dir, label_dir, class_names)
if errors:with open('annotation_errors.txt', 'w') as f:f.write('\n'.join(errors))print(f'发现{len(errors)}个错误,已保存到annotation_errors.txt')
else:print('标注检查通过')

(二)格式转换(如需要)

虽然部分标注工具可以直接生成 YOLOv 所需的 txt 格式标注文件,但如果使用的工具生成的是其他格式(如 XML 格式),则需要进行格式转换。可以利用 Python 编写脚本实现格式转换,将标注信息转换为 YOLOv 要求的格式,即每个图片对应一个 txt 文件,文件中每行包含类别索引、目标中心 x 坐标、目标中心 y 坐标、目标宽度、目标高度(均为相对于图片宽度和高度的归一化值)。

以下是将 XML 格式标注文件转换为 YOLOv 所需 txt 格式的示例代码:

<annotation><folder>img</folder><filename>1-0002.png</filename><path>E:\BaiduNetdiskDownload\data\img\1-0002.png</path><source><database>Unknown</database></source><size><width>386</width><height>386</height><depth>3</depth></size><segmented>0</segmented><object><name>dog</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>2</xmin><ymin>2</ymin><xmax>383</xmax><ymax>385</ymax></bndbox></object>
</annotation>

(三)数据集打包与存储

将检查和处理好的图片和对应的标注文件按照训练集、验证集、测试集的划分进行打包存储。可以建立相应的文件夹结构,如 “train/images”“train/labels”“val/images”“val/labels”“test/images”“test/labels”,分别存放对应数据集的图片和标注文件,方便后续模型训练时调用。

http://www.lryc.cn/news/582855.html

相关文章:

  • C#中封装halcon函数的报错
  • 用基础模型构建应用(第七章)AI Engineering: Building Applications with Foundation Models学习笔记
  • Google AI 刚刚开源 MCP 数据库工具箱,让 AI 代理安全高效地查询数据库
  • 推荐系统中的相似度
  • JAVAEE 代理
  • 短视频电商APP源码开发技术栈解析:音视频、商品链路与互动设计
  • 怪物机制分析(有限状态机、编辑器可视化、巡逻机制)
  • DCL学习
  • SpringAI学习笔记-MCP客户端简单示例
  • C#Halcon从零开发_Day18_OCR识别
  • SpringAI系列 - 基于Spring AI 1.0.0 的AI助手实现示例
  • 图像梯度处理与边缘检测:OpenCV 实战指南
  • Apache Atlas编译打包,可运行包下载地址
  • VM上创建虚拟机以及安装RHEL9操作系统并ssh远程连接
  • 7月8日星期二今日早报简报微语报早读
  • XSLT注入与安全修复方法
  • 人工智能与人工智障———仙盟创梦IDE
  • 【Note】《Kafka: The Definitive Guide》第11章:Stream Processing
  • 【Bluedroid】BLE 地址解析列表的初始化与清除机制(btm_ble_resolving_list_init)
  • MySQL 8.0 OCP 1Z0-908 题目解析(23)
  • Kafka消息倾斜
  • 编码器(Encoder)和解码器(Decoder)
  • Spring注解驱动开发
  • window wsl 环境下编译openharmony,HarmonyOS 三方库 FFmpeg
  • Flutter基础(前端教程④-组件拼接)
  • Ansible 介绍及安装
  • ffmpeg 中config 文件一些理解
  • OSPFv3和v2区别(续)
  • 客户频繁变更需求,如何保障项目进度稳定
  • Spring AI:ETL Pipeline