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

(四)机器学习小白入门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.xdnf.cn/news/14975.html

相关文章:

  • 插板式步进伺服模组:化工行业如何控制流量
  • Tensor数据转换
  • 华为eNSP防火墙实验(包含详细步骤)
  • 单稳态触发器Multisim电路仿真——硬件工程师笔记
  • Vue3组合式API应用:状态共享与逻辑复用最佳实践
  • 音频被动降噪技术
  • C++异步编程入门
  • ESP32-使用VSCODE 各种问题总结汇总
  • 【踩坑实录】RabbitMQ 高并发异常“爆仓”事故还原与配置优化实战指南
  • (生活比喻-图文并茂)http2.0和http3.0的队头阻塞,http2.0应用层解决,TCP层存在,3.0就是彻底解决,到底怎么理解区别???
  • Redis7.X部署全指南
  • 【GIT】GIT 的基本应用
  • 应用系统打印功能模块常见方案
  • 常见的网络攻击方式及防御措施
  • 模型训练篇 | 如何用YOLOv13训练自己的数据集(以明火烟雾检测举例)
  • C#Halcon从零开发_Day18_OCR识别
  • EXCEL(带图)转html
  • 第8章:应用层协议HTTP、SDN软件定义网络、组播技术、QoS
  • window wsl 环境下编译openharmony,HarmonyOS 三方库 FFmpeg
  • Spring自动装配(xml)
  • VR法庭相比传统法庭有哪些优势​
  • Day07_C语言IO进程线程(重难点)
  • 向量数据库是什么?技术体系:从理论到实践的深度解析(HNSW算法、Milvus、Weaviate、Qdrant、 Chroma)
  • Spring Security架构与实战全解析
  • 网络--初级
  • [Datawhale AI夏令营]大模型技术-基于带货视频评论的用户洞察挑战赛上分分享
  • 避免 Java double 科学计数法
  • [附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+vue实现的供电公司安全生产考试管理系统,推荐!
  • django-ckeditor配置html5video实现视频上传与播放
  • MySQL数据库访问(C/C++)