美文网首页
YOLOv5的使用细节

YOLOv5的使用细节

作者: 赤色要塞满了 | 来源:发表于2022-09-15 11:45 被阅读0次

    安装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'
    

    相关文章

      网友评论

          本文标题:YOLOv5的使用细节

          本文链接:https://www.haomeiwen.com/subject/gvfrortx.html