0%

yolov5详细教程、分析和改良

最近突发奇想:目标检测网络本身是否自带分类效果?分类效果如何?于是重新翻出yolov5,拿cs做个小测试。

而且不得不说,网上那堆千篇一律的,有多少真正在玩这个东西啊,还有直接copy github项目介绍当文章的,也是服气,参数介绍要么不全,要么错误百出,坑啊。没办法,只能自己弄一篇文章了,我踩过的坑,都是你脚下的桥,哈哈。

yolov5项目结构及参数详解

项目结构

我们知道:训练一个神经网络,无外乎三个部分:网络、数据集、参数。对于yolo而言,网络在

./model/common.py./model/yolo.py两个文件里,网络参数分别在同目录yaml文件和data文件夹的yaml文件内。

训练需要pt文件,可以在官网下载,数据集、网络结构准备好后,就可以点开train.py文件开始训练了,训练参数同样在两个地方:data/hyps指定文件超参数设置;train.py内ctrl+f搜索prase_opt的一大串东西。

其中hyps文件夹内的超参数设置:

def prase_opt参数设置

此外,你可能发现yolov5的学习率有点特别,在train.py内搜lr可以看见它的公式,如果你想魔改它,或许需要用到。

至此,整个项目结构了解清楚,就可以开始自己的魔改了,建议有空多看看源码,即使一知半解也对你消除error大有裨益。接下来,我们重头开始。(避免某时候忽然要用自己忘了。。)

从零开始安装pytorch及yolov5 6.0

仅限windows下,为啥捏,因为习惯了。。。最好用NVIDIA 20系以上GPU,tensor加速很爽

安装cuda和cudnn(在python的文章里有相同的)

1
conda install cudatoolkit=11.3 cudnn=8.2.1
  • CUDA 工具包 11.0 配合 cuDNN v8.0.2
  • CUDA 工具包 11.1 配合 cuDNN v8.1.1
  • CUDA 工具包 11.2 配合 cuDNN v8.2.1

安装位置在library\lib

安装pytorch 和yolov5 6.0

PyTorch

进去找到安装代码(记得要符合自己cudnn版本的,得自己修改官方给出的命令)

建议使用conda和pip安装,pycharm自动安装的是cpu版本,gpu似乎有bug(我的是2021年版本,可能老了点)

因此最适合流程是:anaconda(可以弄个精简版的,没numpy等等,很快)——conda装cuda和cudnn驱动——在新建环境下安装pytorch-gpu——把pycharm设置为该环境,非常小白,经过多次失败总结出的血泪教训……

yolov5

进入正题,如果你嫌麻烦,请直接打开pycharm,设置好环境后,在文件—设置—pycahrm解释器,把那个绿色的小圆圈取消,点击加号:

如果没有出现内容,请在仓库管理内设置为清华源

https://pypi.tuna.tsinghua.edu.cn/simple/

随后,无敌的pycharm就会自动配置好yolo和它的小伙伴了。而yolov5本身包在左侧site-packages下面,慢慢找

随后你可以直接在pycahrm操作包里的文件,而不必每次打开命令行,diy自由度极高

开始魔改

因为我拿来测试csgo滴,cs截取的数据集至少为1440*900,即使按0.8截取也远大于标准640和v5s6的1280,而且很多时候,cs玩家喜欢露个小脑袋,喜欢半截身子peek,比起守望这种目标简直蚊子一般,因此得加点东西,不过加了也因为cs特性及帧数很难在一两年内派上用场。

至于注意力,大佬们已经总结了,感谢jpg

https://blog.csdn.net/weixin_43694096/article/details/124443059

简而言之,1、把结构类放在common里,在yolo.py内把类加进去,再到网络相应的yaml文件内添加新的层。

修改激活函数也有,提升还行,relu很老了,是时候来点新鲜血液。

注意:魔改完一定记得改超参数!!!!!!

为什么建议直接找网上呢?因为基本是你抄我我抄你,很多作者还自诩原创,说不定电脑里连编译器都没有……正因如此,你会发现那么多作者代码他娘的基本一模一样,连名称都不带改的!!!于是一个大佬发,一堆人抄,一来二去除非连复制粘贴都不会,代码基本是对的?!离谱就

实操及一些测试

一、yolov5能否找到图像间逻辑关系

过去我使用yolo做人脸检测时,发现它本身就可以粗略进行人脸区分,当然其效果肯定不如专业的xception或resnet加attention,但我好奇地是:它究竟能做到怎样的程度,能否像人类一样找到游戏中的逻辑呢?

如上图所示,用260张经过筛选的cs样本,其中包含大量涵盖敌我的图片,我希望yolov5能发现头上带三角形和名字的是我队友,头上啥都没得才是敌人。满怀期待跑300个epoch(是跑多了过拟合吗?)很不幸它并没有呈现出我想要的样子。

于是又翻了翻模型结构,gayhub上yolov5s的yaml文件如下(尽管我用的是s6)

Parameters

nc: 80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
anchors:

  • [10,13, 16,30, 33,23] # P3/8
  • [30,61, 62,45, 59,119] # P4/16
  • [116,90, 156,198, 373,326] # P5/32

YOLOv5 v6.0 backbone

backbone:

[from, number, module, args]

[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]

YOLOv5 v6.0 head

head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13

[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)

[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)

[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)

[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]

不应该啊,conv理论上应该自带像素相关性,至少明白人物脑壳上一点有个箭头是队友不难吧……

二、yolo能否替代动作检测、骨骼检测

简而言之:我尝试将标记数据分为:ct(警察)、t(匪)、cthead、thead,共两百个,毕竟cs这游戏只有头==

然而同样令人失望,yolo似乎无法搞清楚脑袋和身体区别,而且比起上面“只标记敌人”的model,这一版本更容易将国内特色黑血识别为身体,细想确实如此,苍蝇头和黑漆漆的身体跟石油没啥区别。

此外,当目标较小时,它没办法识别,结构限制了。只能说现有的目标检测网络确实远不如人体先进,一个老练的玩家敌人哪怕漏出一个像素也会发现……

三、优化及更改

我尝试在yolov5s中加入ca注意力模块,在sppf层前,并尝试改变描框方法,尽量以头为对称线,试图让网络本身学习到“头”和“身”的概念,然而不仅网络识别效率下降,甚至出现一些意外的“未知小瞄匡”,随后排查推论:我故意添加的几个小脑袋样本产生了不良影响。删除该样本重新训练,仍低概率出现,而yolov5s本身则是“小概率出现中等大小瞄匡”,例如墙边和门,显而易见,小样本让神经网络对“边缘”过分敏感。

比起更改网络模块,变换网络结构、增大输入尺寸更为合适,同等样本下,yolov5s6的1280输入对小目标检测更友好,注意力模块确实能带来提升,但除非遇到瓶颈,否则其付出的算力代价远不如收益。

结论

所以其本身仍只能作为单纯检测网络,完整的识别流程仍然是目标检测——详细分类。当然关于yolo在射击游戏上的应用我并不打算止步不前,鉴于目前显卡运算能力,我们仍可以试着做一个简单的模块化半ai,移植到其它游戏中更改相应网络即可。

————————————2022年5月31日更新————————

我试着把yolo结构残差层激活,但对结果没啥用影响,对训练也没啥影响……于是关了,毕竟官方是false

随后更改激活函数、添加注意力、增大样本、优化超参数,取得意料之外结果,这玩意儿居然真有用了,极小的yolov5s6竟然能打中距离靶子,改了点参数后移动靶也能打了!!!还真的能粗略分清t和ct,如果万恶的G胖非得加人物皮肤,它的精确度还能更高。尽管目前反应比较慢(我会尝试优化代码,但似乎受到gpu显存速度,始终延迟很高),但距离真正“战争机器”似乎不远了,我还发现,准星对yolo有影响,得添加点瞄匡内有准星的样本哦。

————————————2022年7月13日更新————————

我在测试延迟后发现很奇怪的事情,如果用未经训练的模型,在3060ti上5s 6.0 1280*1280推理时间在20ms以内,而训练后接近40ms,(纯cuda计算)经初步排查,可能是更换激活层的后果,ca-attention对神经网络运算影响比想象更小,而5s和5n速度居然相差不大,令人诧异。