文章目录
- YOLOv5训练自定义模型
- 环境的适配与安装
- pytorch和tensorflow与cuda的适配
- 安装pytorch
- 安装YOLO v5
- YOLO v5训练自定义数据
- 准备数据集
- 选择合适的预训练模型
- 训练
- 可视化
- 评估测试模型
- 如何得到最好的训练结果
- 数据
- 模型选择
- 训练
YOLOv5训练自定义模型
首先先把环境搭建起来,训练的过程往往需要好的gpu,使用英伟达的gpu和必要的cuda环境,需要驱动和cuda适配,然后深度学习框架与环境适配,我们就先来配置环境。训练我们使用pytorch深度学习框架。
环境的适配与安装
深度学习框架常用的有2个,pytorch和Tensorflow,一般深度学习都是依赖英伟达的gpu的,所以cuda,cudnn,显卡驱动的适配就很重要了,深度学习框架是适配cuda的所以有一系列的适配链条。
技巧提示:一般pytorch和Tensorflow会混用,所以适配pytorch的时候,最好也把Tensorflow适配了。
pytorch和tensorflow与cuda的适配
先去pytorch官网(https://pytorch.org/get-started/locally/)查看支持的CUDA版本。建议配合TensorFlow官网一起参考,以便两个库都可以使用。以cuda10.2为例在最新版已经不支持了win的配置了,但是找历史版本是可以找到的。
pytorch的最新版:https://pytorch.org/get-started/locally/
pytorch的历史版:https://pytorch.org/get-started/previous-versions/
查看Tensorflow支持cuda的列表–>GPU支持CUDA列表:https://www.tensorflow.org/install/source_windows?hl=zh-cn
注意,下面这个图可以作为cuda和cudnn的匹配参考,一般tensorflow是要求的比较严格的。
注意:需要科学上网才能看到这些网站。
深度学习框架跟cuda适配完了,再查看所需CUDA版本对应的显卡驱动版本,进行cuda与显卡驱动的适配。
参考信息:
https://docs.nvidia.com/deploy/cuda-compatibility/index.html#abstract https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
https://tech.amikelive.com/node-930/cuda-compatibility-of-nvidia-display-gpu-drivers/
注意,适配驱动的时候,官网说明只要大于某个版本就可以,实际使用的过程中,用高版本会出现不匹配的情况,所以驱动的选择不应该太高。比最小值高一点为宜,或者干脆选择最小版本。 不要使用beta版本。
下载最新版的英伟达驱动:https://www.nvidia.com/download/index.aspx
下载历史版本的英伟达驱动:https://www.nvidia.com/Download/Find.aspx
注意,驱动不要使用beta版本!尤其是一些主打游戏的显卡,会有DCH和游戏版本,用标准版就可以了。
然后下载对应版本的cuda:https://developer.nvidia.com/cuda-toolkit-archive
– 下载cuda对应版本的cudnn –
参考TensorFlow GPU支持CUDA列表:https://www.tensorflow.org/install/source_windows?hl=zh-cn
cudnn官网:https://developer.nvidia.com/zh-cn/cudnn
下载VS studio:https://visualstudio.microsoft.com/zh-hans/
安装顺序:
1.VS studio:安装社区版即可
2.显卡驱动:安装完重启电脑可以使用nvidia-smi查看显卡信息
3.CUDA:按流程安装即可
4.cudnn:
解压cudnn压缩文件:
进入cuda目录,将cudnn所有文件复制并替换,如我的cuda目录位置为:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1
更改环境变量,增加path下的环境变量,新建2个路径(cuda bin、libnvvp)如我的路径为:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin和C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\libnvvp。 一般这俩装了cuda都会自己安装,此处大部分只是确认一下。
重启电脑,让安装的环境全部生效。
备注2个命令 :
nvidia-smi,查看驱动的版本,以及驱动最高支持的版本。
nvcc --version :查看安装cuda的真正的版本
安装pytorch
创建conda虚拟环境,参考你选择的版本安装即可。注意python的版本要参考框架的需求。不备注就是最新版的python。
最新版:https://pytorch.org/get-started/locally/
历史版本:https://pytorch.org/get-started/previous-versions/
视频是:pip install torch1.8.1+cu101 torchvision0.9.1+cu101 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
我的是:pip install torch1.10.1+cu102 torchvision0.11.2+cu102 torchaudio==0.10.1 -f https://download.pytorch.org/whl/torch_stable.html
安装YOLO v5
- 安装
yolov5的安装是有前提的:install requirements.txt in a Python>=3.7.0 environment, including PyTorch>=1.7.
- 下载预训练权重文件
下载地址:https://github.com/ultralytics/yolov5/releases,附件位置:Windows软件/yolov5s.pt,将权重文件放到weights目录下(默认没有weights目录,需要自己新建):
测试安装:
YOLO v5训练自定义数据
准备数据集
- 创建 dataset.yaml
复制yolov5/data/coco128.yaml一份,比如为coco_chv.yaml。yolov5是一个目标检测的模型,在这个文件中说明了你要检测什么东西,有几类,分别是什么标签,以及你的训练集,测试集,验证集在磁盘上的位置。
- 数据打标
使用LabelImg等标注工具(需要支持YOLO格式,使用的时候记得切换一下)标注图片:
LabelImg可以通过github下载:https://github.com/tzutalin/labelImg
YOLO格式标签:
需要理解好,xywh相对于图像的意义。
- 一个图一个txt标注文件(如果图中无所要物体,则无需txt文件);
- 每行一个物体; 每行数据格式:类别id、x_center y_center width height;
- xywh必须归一化(0-1),其中x_center、width除以图片宽度,y_center、height除以画面高度;
- 类别id必须从0开始计数。
组织目录结构:
datasets与yolov5同级目录;
YOLO会自动将…/datasets/CHV_dataset/images/train/ppe_1106.jpg中的/images/替换成/labels/以寻找它的标签,如…/datasets/CHV_dataset/labels/train/ppe_1106.txt,所以根据这个原则,我们一般可以:
- images文件夹下有train和val文件夹,分别放置训练集和验证集图片;
- labels文件夹有train和val文件夹,分别放置训练集和验证集标签(yolo格式);
这里采用的是一种约定大于配置的思想,标签和图片必须同级,然后内部的目录结构必须一致。然后标签信息和图片信息需要同名,然后文件类型不同,jpg与txt,是严格对应的。
选择合适的预训练模型
为什么需要预训练模型?减少训练时间,提升训练效果。
根据神经网络的规模,我们把预训练模型分为了以下几种大小,规模越大的模型推理速度越慢,但是准确度越高。
根据你的设备,选择合适的预训练模型,具体模型比对如下:
复制yolov5文件夹下的models下对应模型的yaml文件,重命名。
并修改其中:
这个文件是声明模型的相关参数的。一般模型越大,深度和高度的复杂度会越高,可以看一下几个文件对比一下。
训练
下载对应的预训练模型权重文件,可以放到weights目录下,设置本机最好性能的各个参数,即可开始训练,课程中训练了以下参数:
data:数据集的说明文件
cfg:模型的参数,可以设置网络的规模
weights:预训练模型
batch-size:批处理的大小,越大越好,太大的话显存内存可能不够
epochs:训练多少代
name:给训练起个名字,会在项目文件夹下,新建name文件夹。
project:项目名,一个项目可以有多个训练。会在根目录下创建这个项目名对应的文件夹。
更多参数见train.py;
训练结果在runs/train/中可见,一般训练时间在几个小时以上。
可视化
- wandb
YOLO官网推荐使用: https://wandb.ai/。
- 使用pip install wandb安装扩展包;
- 去官网注册账号;
- 训练的时候填写key秘钥,地址:https://wandb.ai/authorize
- 打开网站即可查看训练进展。
- Tensorboard
tensorboard --logdir=./runs runs 代表项目名 不填的话,默认去找runs 找根目录下正在运行的训练。
评估测试模型
- 测试
训练的模型,在实际的图片中识别效果如何,需要测试一下。
- 评估
如何判定训练出的模型是不是准确呢?就需要用到模型评估了,一般会产出一个报表。
P:精度
R:召回率
基本可以得出结论:模型越大,检测精度越好,但是需要的算力越高,推理速度越慢。
常见GPU卡的算力(几乎都是以T为单位的)如下,理论上,一张T4可以运行几百个模型,实际上不可以。
需要思考,如果自己做web界面的可视化,需要如何打通?
如何得到最好的训练结果github地址:https://github.com/ultralytics/yolov5/wiki/Tips-for-Best-Training-Results
数据
- 每类图片:建议>=1500张;
- 每类实例(标注的物体):建议>=10000个;
- 图片采样:真实图片建议在一天中不同时间、不同季节、不同天气、不同光照、不同角度、不同来源(爬虫抓取、手动采集、不同相机源)等场景下采集;
- 标注:所有图片上所有类别的对应物体都需要标注上,不可以只标注部分;
- 标注:标注尽量闭合物体,边界框与物体无空隙,所有类别对应物体不能缺少标签;
- 背景图:背景图用于减少假阳性预测(False Positive),建议提供0~10%样本总量的背景图,背景图无需标注;
模型选择
模型越大一般预测结果越好,但相应的计算量越大,训练和运行起来都会慢一点,建议:
- 在移动端(手机、嵌入式)选择:YOLOv5n/s/m
- 云端(服务器)选择:YOLOv5l/x
训练
- 对于小样本、中样本,建议试用预训练模型开始训练:
- 对于大样本,建议从0开始训练(无需预训练模型):
- Epochs:初始设定为300,如果很早就过拟合,减少epoch,如果到300还没过拟合,设置更大的数值,如600, 1200等;
- 图像尺寸:训练时默认为–img 640,如果希望检测出画面中的小目标,可以设为–img 1280(检测时也需要设为–img 1280才能起到一样的效果)
- Batch size:选择你硬件能承受的最大–batch-size;
- 超参数(Hyperparameters):初次训练暂时不要改,具体参见https://github.com/ultralytics/yolov5/issues/607
- 更多:官网建议 查看http://karpathy.github.io/2019/04/25/recipe/