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 image=@zidane.jpg 'http://localhost:5000/v1/object-detection/yolov5n'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容