本文详细地讲解了如何去训练yolov5 模型的神经网络,首先讲解了如何在本地训练神经网络,接着又讲解了如何利用云端的GPU训练神经网络。
文章目录
一、在本地上训练yolov5
1 打开train.py文件
2 参数设置
3 锚点和锚框是什么
二、利用云端GPU 训练yolov5
1 登录google calab 网站
2 上传模型
3 环境配置
4 添加tensorboard插件
5 查看训练数据
6 运行python程序
7 查看训练的模型效果
可以先点击运行看看
parser.add_argument('--workers', type=int, default=8, help='maximum number of dataloader workers')
这里在运行前可以修改一个参数,将main函数底下worker参数的default=8改为default=0, 这样可以节省时间,
如果运行电脑没有报错的话,我们可以将这个default值增加。
parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
模型初始化参数,default可以给它一个我们训练好的模型,作为参数初始化,也可以为空,
我们在训练的过程中,一般都是从头开始训练,所以经常设置default = ' ' ,
除此之外,‘ ’经常也会填yolov5s.pt,yolov5m.pt,yolov5l.pt,yolov5x.pt,这些训练好的模型。
我们一般采用程序自己根据权重进行初始化,不采用训练好的模型来进行参数初始化
parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
采用的模型结构,模型的配置,default='', ‘ ’里可以把模型的路径放进去,像yolov5s.yaml , yolov5l.yaml, yolov5m.yaml yolov5x.yaml
parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')
指定数据训练集,default= 'data/coco128.yaml' ,‘ ’里放的就是数据集的地址
parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')
hyp是超参数的意思,default=ROOT / 'data/hyps/hyp.scratch-low.yaml',它这里面写入就是一个超参数的地址,
hyp.scratch-low.yaml,它其实就是Hyperparameters for low-augmentation COCO training from scratch,
意思是:它是一个从头开始增强coco 训练的超参数
parser.add_argument('--epochs', type=int, default=300)
训练多少轮,默认default=300, 会训练300轮
parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs, -1 for autobatch')
数量,将多少数据打包成一个batch,然后送入网络当中进行运算
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')
分别设定训练集和测试集图片的一个大小
parser.add_argument('--rect', action='store_true', help='rectangular training')
矩阵的一个训练方式,我们训练的图片如果不是一个正方形,它训练完成后会是一个正方形,对其他空白的地方进行填充,
rect参数的作用就是将填充的地方减少,比如说一个长方形的图片,处理后是一个正方形,这个正方形中除了图片本身,还自动填充了很多空白部分
使用rect后,我们就会得到一个长方形图片。
parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
恢复最近的训练,我们如果使用这个参数,需要将 default=False,设置成 default=“上次模型训练的地址”
设置好后,它会接着你上次程序运行的结果接着运行下去。
parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
一个模型通常在一个数据上会训练很多次,每次训练的结果都会保存,nosave如果设置为true,那么运行程序,它最后保留最后一个模型训练的一些权重,数据
parser.add_argument('--noval', action='store_true', help='only validate final epoch')
我们通常会在每轮训练结束都进行测试,如果noval=true,那么它只会在最后一轮训练结束进行测试
parser.add_argument('--noautoanchor', action='store_true', help='disable AutoAnchor')
如果noautoanchor设置为true的话,它就会禁用自动锚点,正常情况我们都是开启的,锚点也很重要,我们会在3中进行简单阐述。
parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')
对超参数的x代进行进化,说简单点,就是优化超参数,选择最优参数的一种方式。
parser.add_argument('--cache', type=str, nargs='?', const='ram', help='--cache images in "ram" (default) or "disk"')
在ram或者disk中对图片进行缓存,默认default是在ram中保存
parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
对上一轮的训练中,对于哪些图片的训练效果不太好,在下一轮的训练中,对这些图片加一下相关的权重。这个效果并不理想,我们一般不使用。
parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
改变图像大小,对图像进行一个变换
parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
将多类别数据训练为单类,像类别多的时候,一般都是false
parser.add_argument('--optimizer', type=str, choices=['SGD', 'Adam', 'AdamW'], default='SGD', help='optimizer')
这是一个优化器选项,我们可以选择指定的优化器,
如果为不设置,则模型就会默认使用SGD(stochastic gradient descent)随机梯度下降模型
parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
如果电脑又多个cpu那就可以使用这,就可与采用ddp的模型进行多步数训练
parser.add_argument('--workers', type=int, default=8, help='max dataloader workers (per RANK in DDP mode)')
最大数据加载的线程,默认default=8, 我们在训练时一般改为0, 可以按照需要增加
parser.add_argument('--quad', action='store_true', help='quad dataloader')
数据加载,理解的并不是很好。
这里科普一下什么是锚点,锚框?
先说说什么是锚框,锚框是用于对于目标检测任务中,
对目标检测我们以前是:遍历输入图像上所有可能的像素框,然后选出正确的目标框,
并对位置和大小进行调整就可以完成目标检测任务。这些进行预测的像素框就叫锚框。这些锚框通常都是方形的。
也可以这样理解
锚框,就是目标检测算法中,以锚点为中心,由算法预定义的多个不同长宽比的先验框。
为了增加任务成功的几率,通常会在同一位置设置不同宽高比的锚框(本文的方式在改变宽高比的同时维持面积不变)。
首先登录google calab 的网站,创建一个项目
因为google calab这个网站,只能上传一个一个的文件夹,所以我们需要将整个模型进行打包,然后在网站上上传打包好的模型
上传打包好的模型后,然后输入代码:
解压我们上传的文件夹,并指定保存路径
! unzip /content/yolov5-6.1.zip -d /content/yolov5
进入解压后的文件,yolov5-6.1这个目录中
%cd /content/yolov5/yolov5-6.1
安装程序运行需要的一些package
!pip install -r requirements.txt
自此,环境已经配置好了
在命令行输入:
%load_ext tensorboard
其中,%load_ext 就是安装插件的意思,后面直接加你想安装的插件就行了
打开tensorboard, 来查看我们的训练数据,输入代码:
%tensorboard --logdir=runs/train
要先打开这个,在运行程序
在命令行输入:
!python train.py --rect
注:程序运行默认的数据集就是coco128,也就是coco数据集的前128张图片,
如果我们要使用完整的coco数据集进行训练,也是可以的
在命令行输入 !python train.py --rect --data=data/coco.yaml 即可
如果要设置其他参数,方法类似
程序运行完成后,weights底下有两个文件,best.py, last.py, 一个是效果最好的模型,后一个是最后运行的模型
除此之外,我们也可以在别人训练的基础上进行训练