Windows10+YOLOv5训练自己的数据集
一 、环境和配置
系统:window10
CUDA:10.1
CUDNN:7.4
python:3.7
opencv-python>=4.1.2
pytorch>=1.7.0
本文介绍使用anaconda搭建环境 。
1.1 安装anaconda
anaconda的安装教程之前已经写过一篇文章,还没安装的请自行参考安装 ,这里不再赘述 ,参考链接:anaconda安装教程
1.2 在anaconda中安装pytorch虚拟环境
这一步不是必须的,但是建议建立虚拟环境安装pytorch,免得中途出错把别的环境也破坏了 ,到时候就得不偿失了 。
在anaconda中安装虚拟环境的教程之前也已经写过了,这里就不写了,自行参考链接:anaconda中创建虚拟环境
1.3 安装CUDA和cudnn
若要使用GPU训练 ,则需要安装CUDA和cudnn,具体的安装方法可以参考我的另一篇文章:CUDA和cudnn的安装
1.4 安装pytorch GPU版
yolov5最新版本需要pytorch1.7(以前要求是1.6)版本以上,因此我们安装pytorch1.7版本。
第一步:打开命令提示符:
第二步:激活torch环境(我装的虚拟环境取名为torch) ,输入命令:
activate torch
第三步:安装pytorch。由于先安装好了CUDA10.1,因此在环境中输入:
pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio===0.7.0 -f https://download.pytorch.org/whl/torch_stable.html
然后就是等待pytorch的安装完成,可能需要一定的时间 。
如果你想装其他版本 ,可以先进入pytorch官网,然后选择相应的版本,下面有相应的安装命令 ,复制下来 ,在torch环境下输入该命令即可。
第四步:安装好之后,可能需要将numpy进行升级,输入命令:
pip install --upgrade numpy
第五步:测试torch是否安装成功
先打开python编译环境 ,输入:
python
然后输入下面的命令查看torch的版本:
import torch as t
t.__version__
若输出为下面的结果,则说明pytorch安装成功:
另外也可以输入另一个命令:
import torch as t
t.cuda.is_available
若输出的结果为“True”,则说明安装成功
补充:导入pytorch使用的命令是“torch ” ,而非“pytorch ”,若在导入torch的时候出现错误:“OSError:[WinError 126]找不到指定的模块。”这里根据提示在路径中去找这个模块,会发现这个“asmjit.dll”是存在于该路径下的 ,并没有丢失 。
解决办法:根据出错的提示,上面有一个网址,把它复制下来 ,用任意一个浏览器打开,下载这个应用程序,然后双击安装。安装完毕后重启一下电脑 ,就会发现可以正确的导入torch模块了 。
二 源码测试
2.1 下载源码
在GitHub上下载源码:YOLOv5源码下载地址
2.2 安装依赖项
下载源码并解压后 ,源码根目录下有一个requirements.txt,这里面就是需要安装的各种依赖项了,安装方法是 ,从根目录打开命令提示符:在文件夹上方的框里输入“cmd ”,然后按回车:
之后就会跳出来一个命令提示符框,并且是在该根目录下:
输入命令:
pip install -r requirements.txt
然后等待安装完成就行了 。
2.3 测试
2.3.1 下载权重文件
作者在GitHub中给出了他们训练出来的权重文件:权重文件下载地址
并给出了各种权重文件的检测效果 ,我们可以随意下载。
将下载的权重文件放在./weight文件夹下。
2.3.2 测试
还是在源码的根目录下打开命令提示符,然后激活torch环境
图片测试:
输入命令:
python detect.py --source ./data/images/ --weights ./weights/yolov5s.pt --conf 0.4
运行之后输出:
这时候根目录文件夹中,多了一个runs文件夹 ,这里面就是测试的结果:
打开runs文件夹,一路打开里面所有的文件夹,里面有两张检测后的图片:
打开其中一个看一下:
视频测试
输入命令:
python detect.py --source 0 --weights ./weights/yolov5s.pt --conf 0.4
三、训练自己的数据集
3.1 数据集制作
数据集制作的前半部分可以参考我的另一篇文章VOC数据集制作
这里我就接着VOC数据集制作这篇文章来讲接下来对数据集的操作 。
第一步:将制作好的数据集放到yolov5-master根目录下。我的数据集文件夹结构为:
第二步:将数据集转换到yolo数据集格式。在VOCdata中新建一个voc_label.py文件 ,输入如下代码:
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
sets=[('TrainVal', 'train'), ('TrainVal', 'val'), ('Test', 'test')] # 根据自己文件夹的路径结构进行修改
classes = ['类别1', '类别2', '类别3', '类别4'] #修改为自己的类别
def convert(size, box):
dw = 1./size[0]
dh = 1./size[1]
x = (box[0] + box[1])/2.0
y = (box[2] + box[3])/2.0
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(year, image_id):
in_file = open('VOC%s/Annotations/%s.xml'%(year, image_id))
out_file = open('VOC%s/labels/%s.txt'%(year, 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
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))
bb = convert((w,h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
wd = getcwd()
for year, image_set in sets:
if not os.path.exists('VOC%s/labels/'%(year)):
os.makedirs('VOC%s/labels/'%(year))
image_ids = open('VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
list_file = open('%s_%s.txt'%(year, image_set), 'w')
for image_id in image_ids:
list_file.write('%s/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
convert_annotation(year, image_id)
list_file.close()
转换后可以看到VOCData/…/labels下生成了每个图的txt文件:
另外,在VOCdata文件夹下还生成如下三个包含数据集的txt文件,训练代码就是通过txt中的路径去读取图片
3.2 修改配置文件
3.2.1 修改数据集方面的yaml文件
在准备完数据后 ,v5创新性的省略了.data和.names文件的配置 ,而是将二者合二为一到yaml中,在data文件夹下创建myvoc.yaml文件,输入以下信息
# 上面那三个文件的位置
train: ./VOCdata/TrainVal_train.txt
val: ./VOCdata/TrainVal_val.txt
test: ./VOCdata/Test_test.txt
# number of classes
nc: 4 # 修改为自己的类别数量
# class names
names: ["类别1", "类别2", "类别3", "类别4"] # 自己来的类别名称
3.2.2 修改网络参数方面的yaml文件
这个相当于以前版本的.cfg文件 ,在models/yolov5s.yaml【当然,你想用哪个模型就去修改对应的yaml文件】,就修改一下类别数量:
3.2.3 修改train.py中的一些参数
在train.py中修改一下训练参数 ,也可以直接在训练语句中重写,修改的话只是修改默认值 。
parser.add_argument('--epochs', type=int, default=200) # 根据需要自行调节训练的epoch
parser.add_argument('--batch-size', type=int, default=16) # 根据自己的显卡调节,显卡不好的话 ,就调小点
parser.add_argument('--cfg', type=str, default='models/yolov5s.yaml', help='*.cfg path') # 根据需要,自行选择模型
parser.add_argument('--data', type=str, default='data/myvoc.yaml', help='*.data path') # data设置为前两步中我们新建的myvoc.yaml
parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='train,test sizes') # 可调可不调
3.3 训练
3.3.1 在预训练模型的基础上训练
在yolov5-master目录中打开命令提示符,再激活torch环境 ,然后输入下列命令:
python train.py --img 640 --batch 4 --epoch 300 --data ./data/myvoc.yaml --cfg ./models/yolov5s.yaml --weights weights/yolov5s.pt --workers 0
参数解释:
–img:输入图片尺寸
–batch:batch_size大小
–epoch:训练周期
–data:上面修改过的数据集方面的信息文件
–cfg:模型的配置文件,自行选择模型,当然这里选的是哪个模型 ,就要在3.2.2中修改相应的配置文件中的类别数
–weights:预训练模型 ,之前下载好的,这里选择的预训练模型需要跟–cfg中相同
–workers:暂时还没搞明白是什么
当然这些参数可以直接在train.py文件中直接修改默认值,然后直接运行train.py文件 。
3.3.2 从头开始训练
将train.py中的第458行–weights的默认参数删掉
在上面命令的基础上 ,去掉–weight,在yolov5-master目录中打开命令提示符,再激活torch环境 ,然后输入下列命令:
python train.py --img 640 --batch 4 --epoch 300 --data ./data/myvoc.yaml --cfg ./models/yolov5s.yaml --workers 0
当然如果其他参数也修改为适合自己训练的参数了,也可以直接运行train.py文件。
3.3.3 训练结果
待更新!!!
本文版权归QU快排Www.seoGurubLog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ▲61910465