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

(1)机器学习小白入门YOLOv :从概念到实践
(2)机器学习小白入门 YOLOv:从模块优化到工程部署
(3)机器学习小白入门 YOLOv: 解锁图片分类新技能
(4)机器学习小白入门YOLOv :图片标注实操手册
(5)机器学习小白入门 YOLOv:数据需求与图像不足应对策略
(6)机器学习小白入门 YOLOv:图片的数据预处理
(7)机器学习小白入门 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.pswp.cn/bicheng/88778.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JMeter】调试方法

文章目录取样器&#xff1a;发送请求、接收响应>>察看结果树断言&#xff1a;验证响应>>察看结果树提取器&#xff1a;创建变量>>调试取样器自定义断言&#xff1a;代码>>日志了解JMeter的内部细节&#xff0c;排查错误的原因。取样器&#xff1a;发送…

Vue框架之钩子函数详解

Vue框架之生命周期主要钩子函数详解一、Vue生命周期的整体流程二、创建阶段&#xff1a;初始化组件实例2.1 beforeCreate&#xff1a;实例创建前2.2 created&#xff1a;实例创建后三、挂载阶段&#xff1a;组件与DOM结合3.1 beforeMount&#xff1a;挂载前3.2 mounted&#xf…

Syntax Error: TypeError: Cannot set properties of undefined (setting ‘parent‘)

Date: 2025-07-12 19:21:24 author: lijianzhan使用npm run dev运行前端项目时报错&#xff0c;具体报错信息如下&#xff1a; ERROR Failed to compile with 1 error …

JAVA后端开发——类命名规范

引言良好的命名规范是软件工程的基石。它不仅能提升代码的可读性&#xff0c;还能降低团队协作的沟通成本&#xff0c;使项目在长期迭代中更易于维护。本规范结合了业界主流实践&#xff08;如阿里巴巴Java开发手册&#xff09;以及现代Web应用分层架构的特点&#xff0c;旨在提…

Ubuntu2404修改国内镜像

文章目录1 备份原文件2 修改文件内容Ubuntu2404修改国内镜像 2404和2204修改镜像的方式不一致 且镜像保存的位置也不一致&#xff0c;位置在/etc/apt/source.list.d/ubuntu.sources 参考&#xff1a;https://blog.csdn.net/Kiffy_Yam/article/details/145876447 1 备份原文件…

Chrome拓展 Video Speed Controller 等内嵌恶意后门

【高危】Chrome拓展 Video Speed Controller 等内嵌恶意后门 漏洞描述 当用户安装受影响版本的 Video Speed Controller 等Chrome拓展会窃取用户的浏览链接&#xff0c;并与攻击者可控的C2地址建立持久化连接&#xff0c;攻击者可将用户浏览器重定向到恶意网站。 MPS编号MPS…

Spring Ai Alibaba Gateway 实现存量应用转 MCP 工具

作者简介&#xff1a;你好&#xff0c;我是影子&#xff0c;Spring Ai Alibaba开源社区 Committer&#xff0c;持续分享Spring Ai Alibaba最新进展 业界各类AI工程相关的方案 最近有断时间没更了&#xff0c;熟悉我的朋友知道我刚结束完毕业旅行&#xff0c;最近也因为入职&a…

HTTP和HTTPS部分知识点

HTTP基本概念 超文本-传输-协议 协议 HTTP是一个用在计算机世界里的协议。它使用计算机可以理解的语言确立了一种计算机之间交流通信的规范(两个以上的参与者)&#xff0c;以及相关的各种控制和错误处理方式(行为约定和规范)。传输 HTTP协议是一个双向协议。是一个在计算机世界…

第10讲——一元函数积分学的几何应用

文章目录定积分计算平面图形的面积直角坐标系下参数方程下极坐标系下定积分计算旋转体的体积曲边梯形绕x轴旋转一周所得到的旋转体的体积曲边梯形绕y轴旋转一周所得到的旋转体的体积平面曲线绕定直线旋转定积分计算函数的平均值定积分计算平面光滑曲线的弧长曲线L绕x轴旋转一周…

Go从入门到精通(20)-一个简单web项目-服务搭建

Go从入门到精通&#xff08;15&#xff09;-包&#xff08;package&#xff09; Go从入门到精通&#xff08;9&#xff09;-函数 文章目录Go从入门到精通&#xff08;15&#xff09;-包&#xff08;package&#xff09;Go从入门到精通&#xff08;9&#xff09;-函数前言gogin…

Python爬虫实战:研究python-docx库相关技术

1. 引言 1.1 研究背景与意义 随着学术资源数字化程度的提高,科研工作者面临海量文献数据的筛选与分析挑战。传统人工调研方式效率低下,难以全面捕捉研究领域的动态趋势。自动化文献分析系统能够通过爬虫技术快速采集多源数据,并通过文本挖掘提取关键信息,为研究方向选择、…

Django中序列化与反序列化

1&#xff1a;序列化&#xff1a;将数据结构或对象状态转换为可以存储或传输的格式&#xff08;如JSON、XML&#xff09;的过程。在Web开发中&#xff0c;通常是将模型实例&#xff08;或查询集&#xff09;转换为JSON格式&#xff0c;以便通过HTTP响应发送给客户端。序列化&am…

【离线数仓项目】——电商域DWD层开发实战

摘要本文主要介绍了离线数仓项目中电商域DWD层的开发实战。DWD层是数据仓库架构中的明细数据层&#xff0c;对ODS层的原始数据进行清洗、规范、整合与业务建模。它具有数据清洗、标准化、业务建模、整合、维度挂载等作用&#xff0c;常见设计特征包括一致性、明细级建模、保留历…

爬虫-正则使用

1.模块选择用re模块导入&#xff0c;&#xff0c;最前面加个r&#xff0c;就不用怕转义了2.模块使用re.findall使用结果是数组方式呈现re.finditer把结果变成迭代器&#xff0c;从迭代器类中间取数re.searchre.search 只能匹配到第一个识别到的内容re.match3.推荐写法先预加载完…

python-range函数

文章目录基本用法重要特性与列表转换注意事项遍历回去列表的元素索引range()是Python中用于生成数字序列的内置函数&#xff0c;常用于循环和序列生成。基本用法 range(stop) # 生成0到stop-1的整数序列 range(start, stop) # 生成start到stop-1的整数序列 r…

汽车功能安全-软件集成和验证(Software Integration Verification)【目的、验证输入、集成验证要求】9

文章目录1 目的2 验证输入3 软件集成要求3.1 要求和建议3.2 汽车行业示例&#xff08;混合动力控制器软件&#xff09;4 验证要求1 目的 软件集成和验证阶段的核心目标是证明集成后的软件单元&#xff08;模块、组件&#xff09;已经正确地开发出来&#xff0c;满足了所有的功…

每天一个前端小知识 Day 27 - WebGL / WebGPU 数据可视化引擎设计与实践

WebGL / WebGPU 数据可视化引擎设计与实践&#x1f3af; 一、为什么前端需要 WebGL / WebGPU&#xff1f; 传统的图表库如 ECharts、Highcharts 基于 Canvas 或 SVG&#xff0c;适合 2D 渲染&#xff0c;但&#xff1a; 当数据量 > 1 万时&#xff0c;SVG 性能瓶颈明显&…

JavaScript代码段注入:动态抓取DOM元素的原理与实践

1.F12打开网页说明&#xff1a;以百度网站为例。通过插入代码块抓取当前网页dom元素。2.新代码段说明&#xff1a;点击源代码/来源菜单项下面的代码段。点击新代码段新增代码段。下面以脚本代码段#6为例。3.编写代码块说明&#xff1a;编写javascript代码&#xff0c;点击下面的…

Spring Easy

Spring Easy 用途 通过自动配置&#xff0c;实现了一些国内 Spring Boot 开发时需要在 Spring Boot 框架基础上完成的一些配置工作&#xff0c;可以提升基于 Spring Boot 开发 Web 应用的效率。 安装 使用 Maven 进行包管理&#xff0c;可以从中央仓库安装依赖&#xff1a;…

【Node.js】文本与 pdf 的相互转换

pdf 转文本 主要使用 pdf-parse 这个库&#xff0c;直接识别提取我们 pdf 文件中的文字。 const express require("express"); const fs require("fs"); const PDFParser require("pdf-parse"); const cors require("cors");const…