怎样做好企业文化建设,长沙网站优化seo,广州app开发服务,建设部网站材料价格上涨规定yolov8已经出来好几个月了#xff0c;并且yolov8从刚开始出来之后的小版本也升级好几次#xff0c;总体变化不大#xff0c;个别文件存放位置发生了变化#xff0c;以下以最新版本的YOLOv8来详细学习和使用YOLOv8完成一次目标检测。
一、环境按照
深度学习环境搭建就不再…yolov8已经出来好几个月了并且yolov8从刚开始出来之后的小版本也升级好几次总体变化不大个别文件存放位置发生了变化以下以最新版本的YOLOv8来详细学习和使用YOLOv8完成一次目标检测。
一、环境按照
深度学习环境搭建就不再重复了可以查看上篇文章如何安装 Anaconda安装好之后使用conda命令创建一个新的环境此环境还需包含PyTorch1.8命令如下
-- 创建环境
conda create -n yolov8 python3.8-- 激活环境
conda activate yolov8安装依赖
pip install ultralytics--验证环境是否安装成功
yolo predict modelyolov8n.pt sourcehttps://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_pathD:\git\ultralytics\data\images\newdef 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), 03s) .jpg) #这种情况下的命名格式为0000000.jpg形式可以自主定义想要的格式try:os.rename(src, dst) #src – 要修改的目录名 dst – 修改后的目录名print(converting %s to %s ... % (src, dst))i i 1except:continueprint (total %d to rename converted %d jpgs % (total_num, i))if __name__ __main__:demo BatchRename()demo.rename()2.3 使用labelimg进行标注
labelimg的安装很简单直接使用pip命令安装就可以
安装labelimgpip install labelimg启动
labelimg
Labelimg是一个图像标注工具软件使用非常简单安装成功后直接输入labelimg就可以直接启动 使用说明
1Open就是打开图片我们不需要一张一张的打开太麻烦了使用下面的Open Dir
2Open Dir就是打开需要标注的图片的文件夹这里就选择images文件夹
3change save dir就是标注后保存标记文件的位置选择需要保存标注信息的文件夹这里就选择Annotations文件夹
4特别注意需要选择好所需要的标注文件的类型。有yolo(txt) pascalVOC (xml)两种类型。yolo需要txt文件格式的标注文件但是这里我们选择pascalVOC后面再将xml格式的标注文件转化为所需的txt格式。
5按W键或点击Create\nRectBox开始创建矩形框把要进行识别训练的区域标记出来就行选好框后我们选是什么类别predefined_classes文件在里面提前写好要训练的类型的原因整张图片的所有目标都标记好了之后按CtrlS或点击Save保存 然后切换下一张继续快捷键为按D键每一张图片标记后都要保存这个过程是一个比较繁琐的过程 整张图片的所有目标都标记好了之后按CtrlS或点击Save保存 然后切换下一张继续快捷键为按D键每一张图片标记后都要保存这个过程是一个比较繁琐的过程.
标注之后的效果如下图所示会在目标目录生成对应的xml文件
2.4 4.数据集的划分
在ultralytics的根目录下创建一个脚本创建一个split_train_val.py文件运行文件之后会在imageSets文件夹下将数据集划分为训练集、验证集、测试集里面存放的就是用于训练、验证、测试的图片名称。代码内容如下
import os
import randomtrainval_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] \nif 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.txtes.txtval.txt这3个txt文件为划分后图像所在位置的绝对路径如train.txt就含有所有训练集图像的绝对路径。 import xml.etree.ElementTree as ET
import os
from os import getcwdsets [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 - 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(data/Annotations/%s.xml % (image_id), encodingUTF-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).textdifficult obj.find(difficult).textcls obj.find(name).textif cls not in classes or int(difficult) 1: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 b# 标注越界修正if 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(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.txtnc: 7
names:0: Powdery Mildew # 白粉病1: Scab # 赤霉病2: Leaf Rust # 叶锈病3: Stripe Rust # 条锈病4: Glume Blotch # 颖枯病5: Wheat Ear # 正常麦穗6: Wheat Leaf # 正常麦叶到这一步数据集就算制作好了下一步就开始训练吧
三、训练自己的数据集
1yolo提供自己的指令模式在调参方面十分方便可以直接用命令来完成
yolo train data你的配置文件xx.yaml的绝对路径 modelyolov8n.pt epochs300 imgsz640 batch8 workers0 device0
(3)训练过程首先会显示你所使用的训练的硬件设备信息然后下一段话则是你的参数配置紧接着是backbone信息最后是加载信息并告知你训练的结果会保存在runs\detect\trainxx。如图所示如果正常的话就会输出下面的信息 然后就能开始训练了
下面的改进方法有时间再接着写先吃饭去~