Yolov8_使用自定义数据集训练模型1

前面几篇文章介绍了如何搭建Yolov8环境、使用默认的模型训练和推理图片及视频的效果、并使用GPU版本的torch加速推理、导出.engine格式的模型进一步利用GPU加速,本篇介绍如何自定义数据集,这样就可以训练出识别特定物体的模型。

《Yolov8_使用自定义数据集训练模型1》——主要是怎么创建自定义数据集,测试demo;

《Yolov8_使用自定义数据集训练模型2》——搜集更多的图片去标注、训练,重点关注训练后的实际效果;

1、创建自定义数据集

1.1、创建自定义数据集——总体流程

  • 收集图片:收集一批带有目标物体的图片【images文件夹下.png图片】
  • 标注目标物体:使用标注工具对图片中的目标物体进行标注【xml_labels文件夹下.xml文件】
  • 划分数据集:将整个数据集按一定比例分为训练集、验证集、测试集【使用split_dataset.py脚本生成split_dataset_txt文件夹中的.txt文件,.txt文件内容是不含后缀.xml的文件名】
  • 生成Yolo标注文件及各数据集使用的图片路径:使用xml_to_txt.py脚本将xml标注文件转成Yolo需要的.txt标注文件【labels文件夹下.txt标注文件】,同时脚本生成训练集、验证集、测试集所使用图片的绝对路径【当前目录下test.txt、train.txt、val.txt】

最终的效果就是下面这个文件夹:

farmland.yaml是进行yolo训练时配置文件,不属于创建数据集,后面再说明;

图片是截图来的命名比较乱,batch_rename.py用于批量重命名,下面会附代码;

1.2、收集图片

收集一批带有目标物体的图片,图片的多少和质量关乎训练出模型的效果,这里只找了几张图片是为了跑一下自定义数据集的流程。

图片是截图来的,自动保存的文件名与内容无关,相信你也不想一个一个rename,下面是对图片批量重命名的batch_rename.py代码:

import osclass BatchRename():def __init__(self):self.path = './images'  def rename(self):filelist = os.listdir(self.path)    total_num = len(filelist)          i = 1 for item in filelist:if 1:  src = os.path.join(os.path.abspath(self.path), item)  dst = os.path.join(os.path.abspath(self.path), 'farmland' + format(str(i), '0>4s') + '.png')    try:os.rename(src, dst)   print('converting %s to %s ...' % (src, dst))i = i + 1except:continueprint ('total rename %d files.' % (total_num))if __name__ == '__main__':demo = BatchRename()demo.rename()

1.3、标注目标物体

1.3.1、标注工具_没有使用labelimg

大部分人使用的标注工具是labelimg,但是安装labelimg需要安装pyqt5等依赖,pyqt5等不支持python3.10,不至于为了这个标注工具去修改现在Linux的Python环境。虽然labelimg也支持Windows,但是看教程又需要Anaconda环境,没必要这么麻烦,所以不想使用labelimg。

1.3.2、标注工具_使用Colabeler

发现Colabeler的界面还算好看,支持计算机视觉、NLP、语音三大领域的标注,功能强大且免费,所以试试看。

Colabeler官网:Colabeler - Best annotation tool for AI dataset labeling

Windows安装Colabeler,标注后的.xml文件传给Linux

标注的目的是得到.xml文件,所以完全可以在Windows安装该软件并标注,然后使用SSH传给Linux,使用该方式是因为图片本身也要传给Linux,这样等于是把搜集图片和标注这两步合一起在自己的Windows上先做好。

Windows安装Colabeler没必要说了,直接下一步下一步就能安装成功,然后打开界面左上角创建项目,然后选择Localization、填入项目名称、图片路径、分类名称(多个分类用逗号隔开,这里只写了一个farmland,就是想根据图片判断是否是农田)。

使用“Rectangle”工具标注出目标物体,右侧LabelList选择目标所属类别,一张图片所有的目标物体标注完成后单击下方对号确认,使用“Next”进入下一张图片标注,所有图片标注完成单击“Export”导出XML文件。

1.4、划分数据集

目的是将整个数据集按一定比例分为训练集、验证集、测试集。

使用split_dataset.py脚本随机划分数据集,生成split_dataset_txt文件夹中的.txt文件,.txt文件内容是不含后缀.xml的文件名,下面是split_dataset.py以及各文件内容:

import os
import randomtrainval_percent = 0.9
train_percent = 0.9
xmlfilepath = './xml_labels'
txtsavepath = './split_dataset_txt'
total_xml = os.listdir(xmlfilepath)num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)ftrainval = open('./split_dataset_txt/trainval.txt', 'w')
ftest = open('./split_dataset_txt/test.txt', 'w')
ftrain = open('./split_dataset_txt/train.txt', 'w')
fval = open('./split_dataset_txt/val.txt', 'w')for i in list:name = total_xml[i][:-4] + '\n'if i in trainval:ftrainval.write(name)if i in train:ftrain.write(name)else:fval.write(name)else:ftest.write(name)ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

1.5、生成Yolo标注文件及各数据集使用的图片路径

使用xml_to_txt.py脚本将xml标注文件转成Yolo需要的.txt标注文件【labels文件夹下.txt标注文件】,同时脚本生成训练集、验证集、测试集所使用图片的绝对路径【当前目录下test.txt、train.txt、val.txt】,下面是xml_to_txt.py以及各文件内容:

如果使用的标注工具不同,解析xml过程可能会报错,此时任意可以打开一个.xml文件根据实际结构修改。

 
import xml.etree.ElementTree as ET
import os
from os import getcwdsets = ['train', 'val', 'test']
classes = ['farmland']
abs_path = os.getcwd()
print(abs_path)def convert(size, box):dw = 1. / (size[0])dh = 1. / (size[1])x = (box[0] + box[1]) / 2.0 - 1y = (box[2] + box[3]) / 2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn x, y, w, hdef convert_annotation(image_id):in_file = open('./xml_labels/%s.xml' % (image_id), encoding='UTF-8')out_file = open('./labels/%s.txt' % (image_id), 'w')tree = ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)objects = root.find('outputs').find('object')for obj in objects.iter('item'):      cls = obj.find('name').textif cls not in classes :continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))b1, b2, b3, b4 = bif b2 > w:b2 = wif b4 > h:b4 = hb = (b1, b2, b3, b4)bb = convert((w, h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')wd = getcwd()
for image_set in sets:if not os.path.exists('./labels/'):os.makedirs('./labels/')image_ids = open('./split_dataset_txt/%s.txt' % (image_set)).read().strip().split()list_file = open('./%s.txt' % (image_set), 'w')for image_id in image_ids:list_file.write(abs_path + '/images/%s.png\n' % (image_id))convert_annotation(image_id)list_file.close()

2、使用数据集进行yolo训练

2.1、编写.yaml配置文件

给出训练集、验证集、测试集的路径,训练的目标总数,具体的序号和目标名称列表。

train: /home/lgzn/datasets/farmland_dataset/train.txt
val: /home/lgzn/datasets/farmland_dataset/val.txt
test: /home/lgzn/datasets/farmland_dataset/test.txtnc: 1
names:0: farmland

2.2、使用自定义数据集训练

修改.yaml配置文件的路径,测试能否使用刚才制作的这个数据集进行训练。

yolo train data='/home/lgzn/datasets/farmland_dataset/farmland.yaml' model=yolov8n.pt epochs=2 lr0=0.01

如果和之前文章中使用coco128数据集的训练输出日志流程差不多,没有报错,这一步就完成了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/633013.shtml

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

相关文章

innoDB存储引擎

1.逻辑存储结构 行数据->行->页->区->段->表空间 表空间(ibd文件),一个mysql实例可以对应多个表空间,来存储记录,索引等数据。 段:分为数据段和索引段,回滚段,数据段就是B树的叶子节点&am…

HR3D+HRAuido+HRUI+HR3D_Plugins(游戏引擎源码)

国内知名游戏公司开发的游戏引擎,简洁高效,代码值得参考。包含了这几部分:HR3DHRAuidoHRUIHR3D_Plugins HR3DHRAuidoHRUIHR3D_Plugins(游戏引擎源码) 下载地址: 链接:https://pan.baidu.com/s/1…

使用Apache Spark处理Excel文件的简易指南

前言 在日常的工作中,表格内的工具是非常方便的x,但是当表格变得非常多的时候,就需要一些特定的处理。Excel作为功能强大的数据处理软件,广泛应用于各行各业,从企业管理到数据分析,可谓无处不在。然而&…

使用xbindkeys设置鼠标侧键

1.安装如下包 sudo apt install xbindkeys xautomation 2.生成配置文件 xbindkeys --defaults > $HOME/.xbindkeysrc 3.确定侧键键号 在终端执行下面的代码: xev | grep button 此时会出现如下窗口,将鼠标指针移动到这个窗口上: 单…

如何应对利用加密隧道发起的网络攻击?

日前,网络安全公司Zscaler的 ThreatLabz研究团队编写发布了《2023年加密攻击态势调查报告》,报告数据显示,目前85.9%的网络威胁是通过加密通道发起的,包括恶意软件、数据窃取和网络钓鱼攻击。更重要的是,许多加密攻击使…

【机器学习】调配师:咖啡的完美预测

有一天,小明带着一脸期待找到了你这位数据分析大师。他掏出手机,屏幕上展示着一份详尽的Excel表格。“看,这是我咖啡店过去一年的数据。”他滑动着屏幕,“每个月的销售量、广告投入,还有当月的气温,我都记录…

【MYSQL】事务隔离级别

脏读、幻读、不可重复读 脏读 一个事务正在对一条记录做修改,在这个事务完成并提交前,另一个事务也来读取同一条记录,读取了这些未提交的“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形…

APP跳转系统相机拍照和拍摄

拍照和拍摄功能&#xff0c;我们项目用得不多。最近在做&#xff0c;记录哈。 都是调用的手机自带的。 具体代码如下&#xff0c;可以结合《vue<input>标签调用 Android的获取文件》一起理解哈&#xff1b; private static Uri imageUri; private static Uri VedioUri;…

User电脑中睡眠和休眠的区别,及对不同环境下模式设置建议

睡眠模式&#xff08;Sleep&#xff09;&#xff1a; 特点&#xff1a; 电脑进入睡眠模式时&#xff0c;系统的状态会保存在RAM中&#xff0c;电脑的大部分组件都会被关闭&#xff0c;但RAM仍然得到电源供应以保持数据。这使得电脑能够快速唤醒&#xff0c;因为数据保持在内存中…

【控制篇 / 分流】(7.4) ❀ 01. 对指定IP网段访问进行分流 ❀ FortiGate 防火墙

【简介】公司有两条宽带&#xff0c;一条ADSL拨号用来上网&#xff0c;一条移动SDWAN&#xff0c;已经连通总部内网服务器&#xff0c;领导要求&#xff0c;只有访问公司服务器IP时走移动SDWAN&#xff0c;其它访问都走ADSL拨号&#xff0c;如果你是管理员&#xff0c;你知道有…

自定义 React Hooks:编写高效、整洁和可重用代码的秘密武器

欢迎来到神奇的 React 世界 大家好!在 React 的世界中,有一个强大的秘密武器,它往往隐藏在显而易见的地方,由于缺乏理解或熟悉而没有得到充分利用。 这个强大的工具,被称为自定义 React hooks,可以彻底改变我们编写 React 应用程序代码的方式。通过提取组件中的有状态逻辑,自…

查找局域网树莓派raspberry的mac地址和ip

依赖python库&#xff1a; pip install socket pip install scapy运行代码&#xff1a; import socket from scapy.layers.l2 import ARP, Ether, srpdef get_hostname(ip_address):try:return socket.gethostbyaddr(ip_address)[0]except socket.herror:# 未能解析主机名ret…

Electron Apple SignIn 登录

本人写博客&#xff0c;向来主张&#xff1a;代码要完整&#xff0c;代码可运行&#xff0c;文中不留下任何疑惑。 最讨厌写博客&#xff0c;代码只留下片段&#xff0c;文中关键的东西没写清楚。之前看了那么多文章&#xff0c;就是不告诉我clientId从哪来的。 官方资料地址&…

《Python数据分析技术栈》第02章 01 容器(Containers)

01 容器&#xff08;Containers&#xff09; 《Python数据分析技术栈》第02章 01 容器&#xff08;Containers&#xff09; In the previous chapter, we saw that a variable could have a data type like int, float, str, and so on, but holds only a single value. Cont…

【Emgu CV教程】5.5、几何变换之Remap()重映射

重映射的意思就是把原始图像中某位置的像素放置到目标图像指定位置的过程&#xff0c;在Emgu CV中&#xff0c;Remap()重映射函数可以实现图像的缩放、翻转等操作&#xff0c;函数定义如下&#xff1a; public static void Remap(IInputArray src, // 输入图像IOutputArray d…

WordPress后台底部版权信息“感谢使用 WordPress 进行创作”和版本号怎么修改或删除?

不知道各位WordPress站长在后台操作时&#xff0c;是否有注意到每一个页面底部左侧都有一个“感谢使用 WordPress 进行创作。”&#xff0c;其中WordPress还是带有nofollow标签的链接&#xff1b;而页面底部右侧都有一个WordPress版本号&#xff0c;如下图中的“6.4.2 版本”。…

Python 3 列表数据类型基本用法

介绍 列表 是 Python 中的一种数据结构&#xff0c;是一个可变、有序的元素序列。列表中的每个元素或值被称为一个项。就像字符串是在引号之间定义的字符一样&#xff0c;列表是通过在方括号 [ ] 之间放置值来定义的。 列表非常适合在需要处理许多相关值时使用。它们使您能够…

chisel入门初步1——基4的booth编码的单周期有符号乘法器实现

基4的booth编码乘法器原理说明 基2的booth编码 本质来说就是一个裂项重组&#xff0c;乘法器最重要的设计是改变部分积的数量&#xff0c;另外在考虑有符号数的情况下&#xff0c;最高位符号位有特别的意义。 &#xff08;注&#xff1a;部分积是指需要最后一起加和的所有部分…

js实例继承的例子和优缺点

构造继承是一种继承方式&#xff0c;通过使用构造函数来实现继承。在JavaScript中&#xff0c;构造继承是最早的继承方式之一&#xff0c;但随着ES6引入了类和基于类的继承方式&#xff0c;构造继承的应用逐渐减少。 构造继承的优点&#xff1a; 简单易用&#xff1a;构造继承…

使用的uview 微信高版本 头像昵称填写能力

<template><view><button class"cu-btn block bg-blue margin-tb-sm lg" tap"wxGetUserInfo">一键登录</button><view><!-- 提示窗示例 --><u-popup :show"show" background-color"#fff">&…