安装YOLO
Win10+3080
,主要参考原repo
,先拉下来:
git clone https://github.com/ultralytics/yolov5
cd yolov5
安装conda
,不赘述,然后建个环境比如yolov5
。
conda create -n yolov5 python=3.9
conda activate yolov5
别急着pip
,这里有坑,先自己安装Pytorch
吧,去官网选择,怎么看cuda
版本之前文章说过。
然后:
# -c后面的不需要
conda install pytorch torchvision torchaudio cudatoolkit=11.6
把requirements.txt
里的注释掉。
一开始因为没这么做,导致训练根本不使用
GPU
。
再安装一个
wandb
,这是个实时可视化的插件,YOLO
已经集成了,需要联网,不过还挺流行。
pip install wandb
需要去wandb.ai
注册账号并去wandb.ai/authorize
复制一个API key
,然后运行并输入登陆一下:
import wandb
wandb.login
然后当前电脑就不需要再登录了,永远记住。然后只要项目跑了,就可以在网页上进行监测管理,可自行探索研究。
如果需要每5个
epoch
保存模型,运行的时候加入参数--save-period 5
,不过什么都传到网上,总感觉不太好。--project mywandbname
可以修改项目名称。
另外可以通过这命令进行关闭开启:
wandb disabled
wandb online
当然了还有其它可视化方案,如tensorboard
,本地集成了,也还行。
准备数据
图片和标注自己弄,可以去kaggle
下载。有一些教程推荐在线数据集管理工具Roboflow
,看起来功能是不错,但是网页上传下载国内真的慢,并且好功能是收费的,一个月上千刀呢。
所以还是用labelme
吧,怎么使用以后再补,假设已经标注好了,并且转换成了YOLO
的中心点格式。这时候开始组织目录并编写mydatasetname.yaml
,放在如下yolov5/data
目录下。然后看下图,datasets
是与yolov5
同一层的目录,作为图片和标注文件的根目录。识别种类务必从0开始编号。
train/val/test
也可以是包含图片列表的txt
文件,可参考自带的其它yaml
文件。再看下,目录组织如图:
记住任何时候都把
images
和labels
并列,图片和标注的文件名也必须相同,系统会自动去替换寻找。
另外还可以使用自带的
train/val/test
分拆函数autosplit
,指定到图片目录,然后会自动分拆图片和标签文件,如下:
>>> from utils.dataloaders import *;
>>> autosplit('datasets/images')
会生成txt
文件,把路径写到之前的yaml
里就行。
最后,最好别读取云盘数据来训练,慢。
训练
其实就可以了,选择模型,丰俭由人,不如mobile
可以选择s/m
。
开始运行:
python train.py --img 640 --batch 16 --epochs 3 --data mydatasetname.yaml --weights yolov5s.pt
按照官方建议,训练中小数据集,建议采用预训练的权重;训练大的,建议从头开始,这时候的参数要改下,使用空权重,但得通过--cfg
使用模型架构参数:
python train.py --img 640 --batch 16 --epochs 3 --data mydatasetname.yaml --weights '' --cfg yolov5s.yaml
使用随机权重,可能会出现val loss
为NaN
的情况,当时折腾了很久,搜到一个方法,修改classify/train.py
,然后就正常出数了。
# 43.135.153.188/ultralytics/yolov5/issues/6907
# www.johngo689.com/20424/
如果模型修改了,与预训练权重不完全匹配,程序也会自动读取匹配到的权重,挺智能的,只不过不一定管用,毕竟权重参数是集体发力的。在日志里可以看到迁移了多少参数,如Transferred 306/311 items from yolov5s.pt
。另外,如果mydatasetname.yaml
的预测种类数与yolov5s.yaml
不相同,会自动覆盖,日志显示:Overriding model.yaml nc=80 with nc=XX
。
--cache ram
可以使用内存加速训练,但测试时32G
内存居然出错了。
--epochs
可以选择300,观察是否过拟合了,如果没有,可以增加。
--batch
尽可能大,发挥批量归一化的效果,不过对显存也提出高要求了。有个疑问,看代码,这个参数格式应该是--batch-size
,反正都管用。
img
参数,一般640就够了,但是如果图片里有很多小物体,可以选择1280。记住推理的时候也得改成1280。
--freeze 10
参数,可以用来冻结预训练模型的一些层,具体模型有哪些层,可以想办法打印,或者去models
目录查看,从backbone
到head
都可以冻结。
--name myexpname
可以修改结果目录,默认为exp
并自增编号。
--upload_data val
会上传验证数据到wandb
,方便查看。不过看代码是--upload_dataset
,已经好几个参数与源代码对不上的情况了。
问题
- 报错什么页面错误,忘了截图,去掉
--cache ram
就好了,哎,32GB的内存都不能打了。 -
冒出这个错误:
根据提示可以:
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE
但是好像不好,猜测是文件冲突,于是这样解决:
说到这个,
mac
在安装环境时,如果import torch
发生这个错误:
from torch._C import * # noqa: F403
ImportError: dlopen blabla...
可以brew install libomp
下。
- 报错
RuntimeError: no valid convolution algorithms available in CuDNN
好像是batch size
过大,从32改成16试试就行了,哎,3080
真的提不动刀了。 - 如果各种连接错误,是不是梯子导致的?关掉试试。
跑起来了
终于GPU的风扇起来了。
推理
去wandb
查看训练结果:
可以看看各种指标,如果训练到最后几乎没什么改进了,训练也会自动停止。
在
wandb
和本地都能看到tensorboard
的输出结果。
再看训练好的模型:
这个
best.pt
可以用来推理。
可以先验证一下:
python val.py --weights runs\train\5m-bs32-ep53\weights\best.pt --data mydatasetname.yaml --img 640
然后用来测试:
python detect.py --weights runs\train\5m-bs32-ep53\weights\best.pt --source ..\datasets\mydatasetname\images\test
--weights
参数可以是多个模型,这样就进行集成了,挺方便。推理结果会保存到runs\detect\
,可以加上--save-txt
以导出文本结果到labels
目录。--conf 0.25
修改置信度阈值,筛除低置信度的框子,--iou-thres 0.45
修改IoU
阈值,这个如果没猜错的话,是用于NMS
吧?还可以用上数据增强TTA
,加上--augment
,同时放大尺寸--img 832
,耗时会变多,不过效果还是有改观的。具体做了什么增强,可以看代码:
看起来就是缩放+翻转,也可以自定义调整。
超参数设置
默认的超参数一般够用。在data/hyps
目录下,有一些超参数配置,可以自行修改,比如有的项目关掉mosaic
增强的flip。另外,训练时加上
--evolve,可以进行超参数搜寻,可以用
--hyp指定配置,默认跑300代,结果存在
runs/evolve目录。超参数的寻找非常贵,在
wandb的
runs`里可以看到,其实就是一遍遍的跑。
结合Flask
原repo
自带,可以通过网页来识别图片。
python utils/flask_rest_api/restapi.py --port 5000 --model yolov5n
然后POST
发个图片就能得到识别结果的json
:
$ curl -X POST -F [email protected] 'http://localhost:5000/v1/object-detection/yolov5n'