YOLOv5的使用细节

安装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版本之前文章说过。

image.png

然后:

# -c后面的不需要
conda install pytorch torchvision torchaudio cudatoolkit=11.6

requirements.txt里的注释掉。

image.png

一开始因为没这么做,导致训练根本不使用GPU
再安装一个wandb,这是个实时可视化的插件,YOLO已经集成了,需要联网,不过还挺流行。

pip install wandb

需要去wandb.ai注册账号并去wandb.ai/authorize复制一个API key,然后运行并输入登陆一下:

import wandb
wandb.login

然后当前电脑就不需要再登录了,永远记住。然后只要项目跑了,就可以在网页上进行监测管理,可自行探索研究。

image.png

如果需要每5个epoch保存模型,运行的时候加入参数--save-period 5,不过什么都传到网上,总感觉不太好。--project mywandbname可以修改项目名称。
另外可以通过这命令进行关闭开启:

wandb disabled
wandb online

当然了还有其它可视化方案,如tensorboard,本地集成了,也还行。

准备数据

图片和标注自己弄,可以去kaggle下载。有一些教程推荐在线数据集管理工具Roboflow,看起来功能是不错,但是网页上传下载国内真的慢,并且好功能是收费的,一个月上千刀呢。
所以还是用labelme吧,怎么使用以后再补,假设已经标注好了,并且转换成了YOLO的中心点格式。这时候开始组织目录并编写mydatasetname.yaml,放在如下yolov5/data目录下。然后看下图,datasets是与yolov5同一层的目录,作为图片和标注文件的根目录。识别种类务必从0开始编号。

image.png

train/val/test也可以是包含图片列表的txt文件,可参考自带的其它yaml文件。再看下,目录组织如图:
image.png

image.png

image.png

image.png

记住任何时候都把imageslabels并列,图片和标注的文件名也必须相同,系统会自动去替换寻找。
另外还可以使用自带的train/val/test分拆函数autosplit,指定到图片目录,然后会自动分拆图片和标签文件,如下:

>>> from utils.dataloaders import *;
>>> autosplit('datasets/images')

会生成txt文件,把路径写到之前的yaml里就行。

image.png

image.png

最后,最好别读取云盘数据来训练,慢。

训练

其实就可以了,选择模型,丰俭由人,不如mobile可以选择s/m

image.png

开始运行:

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 lossNaN的情况,当时折腾了很久,搜到一个方法,修改classify/train.py,然后就正常出数了。

# 43.135.153.188/ultralytics/yolov5/issues/6907
# www.johngo689.com/20424/
image.png

如果模型修改了,与预训练权重不完全匹配,程序也会自动读取匹配到的权重,挺智能的,只不过不一定管用,毕竟权重参数是集体发力的。在日志里可以看到迁移了多少参数,如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,反正都管用。

image.png

img参数,一般640就够了,但是如果图片里有很多小物体,可以选择1280。记住推理的时候也得改成1280。
--freeze 10参数,可以用来冻结预训练模型的一些层,具体模型有哪些层,可以想办法打印,或者去models目录查看,从backbonehead都可以冻结。
--name myexpname可以修改结果目录,默认为exp并自增编号。
--upload_data val会上传验证数据到wandb,方便查看。不过看代码是--upload_dataset,已经好几个参数与源代码对不上的情况了。

问题

  • 报错什么页面错误,忘了截图,去掉--cache ram就好了,哎,32GB的内存都不能打了。
  • 冒出这个错误:


    image.png

    根据提示可以:

import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE

但是好像不好,猜测是文件冲突,于是这样解决:

image.png

说到这个,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的风扇起来了。


image.png

推理

wandb查看训练结果:

image.png

可以看看各种指标,如果训练到最后几乎没什么改进了,训练也会自动停止。
image.png

image.png

wandb和本地都能看到tensorboard的输出结果。
image.png

再看训练好的模型:

image.png

这个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,耗时会变多,不过效果还是有改观的。具体做了什么增强,可以看代码:

image.png

看起来就是缩放+翻转,也可以自定义调整。

超参数设置

默认的超参数一般够用。在data/hyps目录下,有一些超参数配置,可以自行修改,比如有的项目关掉mosaic增强的flip。另外,训练时加上--evolve,可以进行超参数搜寻,可以用--hyp指定配置,默认跑300代,结果存在runs/evolve目录。超参数的寻找非常贵,在wandbruns`里可以看到,其实就是一遍遍的跑。

结合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'

你可能感兴趣的:(YOLOv5的使用细节)