当前位置: 首页 > 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.dtcms.com/a/270321.html

相关文章:

  • 深度学习环境配置:PyTorch、CUDA和Python版本选择
  • 工作中的思考
  • 推荐系统中的相似度
  • 【计算机网络】第三章:数据链路层(上)
  • Redis常用数据结构以及多并发场景下的使用分析:Sorted List类型
  • (电机03)分享FOC控制中SVPWM的输出关联硬件
  • 【6G新技术探索】A2A协议介绍
  • 数据出海的隐形冰山:企业如何避开跨境传输的“合规漩涡”?
  • BM10 两个链表的第一个公共结点
  • main(int argc,char **agrv)的含义
  • Kubernetes配置管理
  • Vue3组合式API应用:状态共享与逻辑复用最佳实践
  • 说说SpringBoot常用的注解?
  • [Datawhale AI夏令营]大模型技术-基于带货视频评论的用户洞察挑战赛上分分享
  • React Native 一些API详解
  • 【ElasticSearch实用篇-02】基本增删改查
  • LoRaWAN 有几种入网方式?
  • 4. 那在详细说一下 http 2.0 的特点
  • WinUI3入门16:Order自定义排序
  • ACE-Step:AI音乐生成基础模型
  • 代码详细注释:基于log.h的自定义日志库实现
  • 探索下一代云存储技术:对象存储、文件存储与块存储的区别与选择
  • Splunk练习 Boss of the SOC V1
  • 短视频矩阵系统的崛起:批量发布功能与多平台矩阵的未来
  • LeetCode 21. 合并两个有序链表
  • C#Halcon从零开发_Day18_OCR识别
  • 4. isaac sim4.2 教程-Core API-Hello robot
  • 【计算机组成原理】-CPU章节学习篇—笔记随笔
  • Linux 第一个系统程序 - 进度条
  • (C++)list列表相关基础用法(C++教程)(STL库基础教程)