YOLOv8训练自己的数据集+常用传参说明

简介: YOLOv8训练自己的数据集+常用传参说明

yolov8已经出来好几个月了,并且yolov8从刚开始出来之后的小版本也升级好几次,总体变化不大,个别文件存放位置发生了变化,以下以最新版本的YOLOv8来详细学习和使用YOLOv8完成一次目标检测

一、环境按照

深度学习环境搭建就不再重复了,可以查看上篇文章:如何安装 Anaconda安装好之后使用conda命令创建一个新的环境,此环境还需包含PyTorch>=1.8,命令如下:

-- 创建环境 conda create -n yolov8 python=3.8 -- 激活环境 conda activate yolov8

安装依赖:

pip install ultralytics --验证环境是否安装成功 yolo predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'

安装完ultralytics之后就可以通过命令使用yolov8进行目标检测了,使用命令可以参考YOLO官网的快速开始教程:YOLO官网快速开始教程,但我们并不只是想用官方的模型权重,而是要训练和改进为自己的数据集,所以要下载下来源码进行运行改进

Yolov8 的源代码下载:

https://github.com/ultralytics/ultralytics

可见我这里环境已配置好,运行结果正常,并且运行结果保存在D:\git\ai\yolov8\ultralytics\runs\detect\predict

二、制作自己的数据集

2.1 准备工作

在ultralytics目录下新建data文件夹,下再新建四个文件夹,先说明这四个文件夹分别是用来干什么的,后面会往里面一一加入需要添加的内容。

  • Annotations文件夹:用来存放使用labelimg给每张图片标注后的xml文件,后面会讲解如何使用labelimg进行标注。
  • Images文件夹:用来存放原始的需要训练的数据集图片,图片格式为jpg格式。
  • ImageSets文件夹:用来存放将数据集划分后的用于训练、验证、测试的文件。
  • Labels文件夹:用来存放将xml格式的标注文件转换后的txt格式的标注文件。

先在根目录下创建好对应的文件夹,最终效果如图所示:

2.2 准备数据集

我做的是关于小麦病害的检测,根据采集的数据集将小麦病害划分为7个种类,分别为白粉病、赤霉病、叶锈病、条锈病、颖枯病、正常麦穗、正常麦叶。下图为数据集的一部分,共准备了四千多张原始图片,大约每个种类600张。此处会用到一个非常高效的重命名方式,就不用一张一张图片的进行重命名。批量重命名的代码如下。4000张图片准备好后就放在images文件夹中即可。

python批量重命名:

import os class BatchRename():  '''  批量重命名文件夹中的图片文件  '''  def __init__(self):  self.path = 'D:\git\ultralytics\data\images' #表示需要命名处理的文件夹  self.new_path='D:\git\ultralytics\data\images\new'  def rename(self):  filelist = os.listdir(self.path) #获取文件夹中文件的所有的文件  total_num = len(filelist) #获取文件长度(个数)  i = 1 #表示文件的命名是从1开始的  for item in filelist:  if 1: #初始的图片的格式为jpg格式的(或者源文件是png格式及其他格式,后面的转换格式就可以调整为自己需要的格式即可)  src = os.path.join(os.path.abspath(self.path), item) #连接两个或更多的路径名组件  # dst = os.path.join(os.path.abspath(self.new_path), ''+str(i) + '.jpg')#处理后的格式也为jpg格式的,当然这里可以改成png格式  dst = os.path.join(os.path.abspath(self.path), 'wheat' + format(str(i), '0>3s') + '.jpg') #这种情况下的命名格式为0000000.jpg形式,可以自主定义想要的格式  try:  os.rename(src, dst) #src – 要修改的目录名 dst – 修改后的目录名  print('converting %s to %s ...' % (src, dst))  i = i + 1  except:  continue  print ('total %d to rename & converted %d jpgs' % (total_num, i)) if __name__ == '__main__':  demo = BatchRename()  demo.rename()

2.3 使用labelimg进行标注

labelimg的安装很简单,直接使用pip命令安装就可以

安装labelimg pip install labelimg 启动 labelimg

Labelimg是一个图像标注工具,软件使用非常简单,安装成功后直接输入labelimg就可以直接启动

使用说明:

(1)Open就是打开图片,我们不需要一张一张的打开,太麻烦了,使用下面的Open Dir

(2)Open Dir就是打开需要标注的图片的文件夹,这里就选择images文件夹

(3)change save dir就是标注后保存标记文件的位置,选择需要保存标注信息的文件夹,这里就选择Annotations文件夹

(4)特别注意需要选择好所需要的标注文件的类型。有yolo(txt), pascalVOC (xml)两种类型。yolo需要txt文件格式的标注文件,但是这里我们选择pascalVOC,后面再将xml格式的标注文件转化为所需的txt格式。

(5)按W键或点击Create\nRectBox开始创建矩形框,把要进行识别训练的区域标记出来就行,选好框后我们选是什么类别(predefined_classes文件,在里面提前写好要训练的类型的原因),整张图片的所有目标都标记好了之后按Ctrl+S或点击Save保存 ,然后切换下一张继续,快捷键为按D键,每一张图片标记后都要保存,这个过程是一个比较繁琐的过程

整张图片的所有目标都标记好了之后按Ctrl+S或点击Save保存 ,然后切换下一张继续,快捷键为按D键,每一张图片标记后都要保存,这个过程是一个比较繁琐的过程.

标注之后的效果如下图所示,会在目标目录生成对应的xml文件

2.4 4.数据集的划分

在ultralytics的根目录下创建一个脚本,创建一个split_train_val.py文件,运行文件之后会在imageSets文件夹下将数据集划分为训练集、验证集、测试集,里面存放的就是用于训练、验证、测试的图片名称。代码内容如下:

import os import random trainval_percent = 0.9 train_percent = 0.9 xmlfilepath = 'data/Annotations' txtsavepath = 'data/ImageSets' 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('data/ImageSets/trainval.txt', 'w') ftest = open('data/ImageSets/test.txt', 'w') ftrain = open('data/ImageSets/train.txt', 'w') fval = open('data/ImageSets/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()

2.5 5.转换数据集格式

创建voc_label.py文件,他的作用:(1)就是把Annoctions里面的xml格式的标注文件转换为txt格式的标注文件,每个图像对应一个txt文件,文件每一行为一个目标的信息,包括class, x_center, y_center, width, height。

(2)就是运行后除了会生成转换后labels文件夹下的60张图片的txt文件,还会在data文件夹下得到三个包含数据集路径的txt文件,train.tx,tes.txt,val.txt这3个txt文件为划分后图像所在位置的绝对路径,如train.txt就含有所有训练集图像的绝对路径。

import xml.etree.ElementTree as ET import os from os import getcwd sets = ['train', 'val', 'test'] classes = ['High Ripeness','Low Ripeness','Medium Ripeness'] 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 - 1  y = (box[2] + box[3]) / 2.0 - 1  w = box[1] - box[0]  h = box[3] - box[2]  x = x * dw  w = w * dw  y = y * dh  h = h * dh  return x, y, w, h def convert_annotation(image_id):  in_file = open('data/Annotations/%s.xml' % (image_id), encoding='UTF-8')  out_file = open('data/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)  for obj in root.iter('object'):  # difficult = obj.find('difficult').text  difficult = obj.find('difficult').text  cls = obj.find('name').text  if cls not in classes or int(difficult) == 1:  continue  cls_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 = b  # 标注越界修正  if b2 > w:  b2 = w  if b4 > h:  b4 = h  b = (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('data/labels/'):  os.makedirs('data/labels/')  image_ids = open('data/ImageSets/%s.txt' % (image_set)).read().strip().split()  list_file = open('data/%s.txt' % (image_set), 'w')  for image_id in image_ids:  list_file.write(abs_path + 'data/images/%s.jpg\n' % (image_id))  convert_annotation(image_id)  list_file.close()

2.6 编写数据集配置文件

创建 wheat.yaml

内容如下,其文件路径正是上文生成的划分配置集文件

nc代表类别数量,比如我这里是7个分类

names是每个分类名称

train: D:\git\ai\yolov8\data\train.txt val: D:\git\ai\yolov8\data\val.txt test: D:\git\ai\yolov8\data\test.txt nc: 7 names:  0: Powdery Mildew # 白粉病  1: Scab # 赤霉病  2: Leaf Rust # 叶锈病  3: Stripe Rust # 条锈病  4: Glume Blotch # 颖枯病  5: Wheat Ear # 正常麦穗  6: Wheat Leaf # 正常麦叶

到这一步,数据集就算制作好了!下一步就开始训练吧

三、训练自己的数据集

3.1 命令行运行

(1)yolo提供自己的指令模式,在调参方面十分方便,可以直接用命令来完成

yolo train data=你的配置文件(xx.yaml)的绝对路径 model=yolov8n.pt epochs=300 imgsz=640 batch=8 workers=0 device=0 

(3)训练过程首先会显示你所使用的训练的硬件设备信息,然后下一段话则是你的参数配置,紧接着是backbone信息,最后是加载信息,并告知你训练的结果会保存在runs\detect\trainxx。如图所示,如果正常的话就会输出下面的信息

然后就能开始训练了!

3.2 文件运行

在项目跟目录创建train.py文件

from ultralytics import YOLO if __name__ == '__main__':  # 加载模型  model = YOLO("D:/git/ultralytics/ultralytics/cfg/models/v8/yolov8.yaml")  # 训练模型  results = model.train(data="D:/git/ultralytics/data/wheat.yaml",  resume=True,  epochs=100,  project='wheat',  patience=30,  name='wheat-yolov8n-100',  amp=False) 

然后直接运行就可以开始训练, 这种和使用命令行运行是一样的,只是这样更清晰,参数更明了。具体参数说明如下表所示:

首先罗列一下官网提供的全部参数:https://docs.ultralytics.com/modes/train/

一些比较常用的传参:

key 解释
model 传入的model.yaml文件或者model.pt文件,用于构建网络和初始化,不同点在于只传入yaml文件的话参数会随机初始化
data 训练数据集的配置yaml文件
epochs 训练轮次,默认100
patience 早停训练观察的轮次,默认50,如果50轮没有精度提升,模型会直接停止训练
batch 训练批次,默认16
imgsz 训练图片大小,默认640
save 保存训练过程和训练权重,默认开启
save_period 训练过程中每x个轮次保存一次训练模型,默认-1(不开启)
cache 是否采用ram进行数据载入,设置True会加快训练速度,但是这个参数非常吃内存,一般服务器才会设置
device 要运行的设备,即cuda device =0或Device =0,1,2,3或device = cpu
workers 载入数据的线程数。windows一般为4,服务器可以大点,windows上这个参数可能会导致线程报错,发现有关线程报错,可以尝试减少这个参数,这个参数默认为8,大部分都是需要减少的
project 项目文件夹的名,默认为runs
name 用于保存训练文件夹名,默认exp,依次累加
exist_ok 是否覆盖现有保存文件夹,默认Flase
pretrained 是否加载预训练权重,默认Flase
optimizer 优化器选择,默认SGD,可选[SGD、Adam、AdamW、RMSProP]
verbose 是否打印详细输出
seed 随机种子,用于复现模型,默认0
deterministic 设置为True,保证实验的可复现性
single_cls 将多类数据训练为单类,把所有数据当作单类训练,默认Flase
image_weights 使用加权图像选择进行训练,默认Flase
rect 使用矩形训练,和矩形推理同理,默认False
cos_lr 使用余弦学习率调度,默认Flase
close_mosaic 最后x个轮次禁用马赛克增强,默认10
resume 断点训练,默认Flase
lr0 初始化学习率,默认0.01
lrf 最终学习率,默认0.01
label_smoothing 标签平滑参数,默认0.0
dropout 使用dropout正则化(仅对训练进行分类),默认0.0
目录
相关文章
|
并行计算
最新YOLOv8(2023年8月版本)安装配置!一条龙傻瓜式安装,遇到问题评论区提问
最近需要使用YOLOv8,百度了一下现在网上大多数教程都是比较早期的教程,很多文件已经大不相同,于是我根据官方readme文档,总结了一套安装方法,只需要按照本教程,复制每一段代码,按照教程配置好相应文件即可直接使用。
9008 2
|
机器学习/深度学习 JSON 算法
如何在自定义数据集上训练 YOLOv8 实例分割模型
在本文中,我们将介绍微调 YOLOv8-seg 预训练模型的过程,以提高其在特定目标类别上的准确性。Ikomia API简化了计算机视觉工作流的开发过程,允许轻松尝试不同的参数以达到最佳结果。
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
20321 59
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
算法 数据库 计算机视觉
Dataset之COCO数据集:COCO数据集的简介、下载、使用方法之详细攻略
Dataset之COCO数据集:COCO数据集的简介、下载、使用方法之详细攻略
|
6月前
|
机器学习/深度学习 人工智能 算法
Python+YOLO v8 实战:手把手教你打造专属 AI 视觉目标检测模型
本文介绍了如何使用 Python 和 YOLO v8 开发专属的 AI 视觉目标检测模型。首先讲解了 YOLO 的基本概念及其高效精准的特点,接着详细说明了环境搭建步骤,包括安装 Python、PyCharm 和 Ultralytics 库。随后引导读者加载预训练模型进行图片验证,并准备数据集以训练自定义模型。最后,展示了如何验证训练好的模型并提供示例代码。通过本文,你将学会从零开始打造自己的目标检测系统,满足实际场景需求。
5275 0
Python+YOLO v8 实战:手把手教你打造专属 AI 视觉目标检测模型
|
JSON 人工智能 数据格式
AI计算机视觉笔记二十六:YOLOV8自训练关键点检测
本文档详细记录了使用YOLOv8训练关键点检测模型的过程。首先通过清华源安装YOLOv8,并验证安装。接着通过示例权重文件与测试图片`bus.jpg`演示预测流程。为准备训练数据,文档介绍了如何使用`labelme`标注工具进行关键点标注,并提供了一个Python脚本`labelme2yolo.py`将标注结果从JSON格式转换为YOLO所需的TXT格式。随后,通过Jupyter Notebook可视化标注结果确保准确性。最后,文档展示了如何组织数据集目录结构,并提供了训练与测试代码示例,包括配置文件`smoke.yaml`及训练脚本`train.py`,帮助读者完成自定义模型的训练与评估。
3493 2
|
XML JSON 数据可视化
数据集学习笔记(六):目标检测和图像分割标注软件介绍和使用,并转换成YOLO系列可使用的数据集格式
本文介绍了labelImg和labelme两款图像标注工具的安装、使用、数据转换和验证方法,适用于目标检测和图像分割任务,支持YOLO等数据集格式。
3354 2
数据集学习笔记(六):目标检测和图像分割标注软件介绍和使用,并转换成YOLO系列可使用的数据集格式
|
机器学习/深度学习 人工智能 文字识别
ultralytics YOLO11 全新发布!(原理介绍+代码详见+结构框图)
本文详细介绍YOLO11,包括其全新特性、代码实现及结构框图,并提供如何使用NEU-DET数据集进行训练的指南。YOLO11在前代基础上引入了新功能和改进,如C3k2、C2PSA模块和更轻量级的分类检测头,显著提升了模型的性能和灵活性。文中还对比了YOLO11与YOLOv8的区别,并展示了训练过程和结果的可视化
19463 0
|
XML 数据格式 Python
将xml标签转换为txt(voc格式转换为yolo方便进行训练)
该文章提供了一个Python脚本,用于将VOC格式的XML标签文件转换为YOLO训练所需的TXT格式,包括修改数据集类别、输入图像与标注文件夹地址、转换过程和结果展示。
将xml标签转换为txt(voc格式转换为yolo方便进行训练)
|
机器学习/深度学习 算法 PyTorch
目标检测实战(五): 使用YOLOv5-7.0版本对图像进行目标检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-7.0版本进行目标检测的完整流程,包括算法介绍、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。YOLOv5以其高精度、快速度和模型小尺寸在计算机视觉领域受到广泛应用。
5626 0
目标检测实战(五): 使用YOLOv5-7.0版本对图像进行目标检测完整版(从自定义数据集到测试验证的完整流程)
下一篇