一 、环境和配置

系统: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