1 YOLOv5环境搭建
1.1 视频版教程
手把手教你搭建自己的yolov5目标检测平台_哔哩哔哩_bilibili
1.2 文字版教程
1.2.1 专栏链接
https://blog.csdn.net/didiaopao/category_11321656.html
1.2.2 详细页面
注:以下教程中pytorch和paddle只需要配置一个即可,多用pytorch,飞桨用的比较少,可以按需配置。
利用Anaconda安装pytorch和paddle深度学习环境+pycharm安装---免额外安装CUDA和cudnn(适合小白的保姆级教学)_炮哥带你学的博客-CSDN博客_anaconda安装cuda 目标检测---利用labelimg制作自己的深度学习目标检测数据集_炮哥带你学的博客-CSDN博客_目标检测label
目标检测---数据集格式转化及训练集和验证集划分_炮哥带你学的博客-CSDN博客_目标检测验证集
目标检测---教你利用yolov5训练自己的目标检测模型_炮哥带你学的博客-CSDN博客_yolov5训练自己的模型 yolov5检测框显示中文标签_炮哥带你学的博客-CSDN博客_yolov5中文标签
2 问题解决
2.1 PyCharm详细安装及配置教程
pycharm从安装到全副武装,学起来才嗖嗖的快,图片超多,因为过度详细!_川川菜鸟的博客-CSDN博客
2.2 镜像源配置
镜像源用于加快下载外网资源,复制粘贴配置即可。
清华源:https://mirrors.tuna.tsinghua.edu.cn/
腾讯源:https://mirrors.cloud.tencent.com/
阿里源:https://developer.aliyun.com/mirror/
华为源:https://mirrors.huaweicloud.com/home
网易源:http://mirrors.163.com/
淘宝 NPM 镜像:https://developer.aliyun.com/mirror/NPM
豆瓣 Python PyPI 镜像:http://pypi.doubanio.com/simple/
常用清华源即可,详细内容见该博主博客:镜像源是什么_乌11111的博客-CSDN博客_镜像源
2.3 更新显卡驱动
在后期安装PyTorch的时候要求驱动和CUDA的版本,所以显卡驱动版本较低的需要更新版本驱动。
有独显的教程:
更新显卡驱动_风吹我亦散的博客-CSDN博客
无独显计算机,仅有集显的教程:
集成显卡安装pytorch_lakomi的博客-CSDN博客_集成显卡能用pytorch吗
(我的电脑有独显,这个教程我没有实地考察过效果,可以试一试。)
2.4 pip install -r requirements.txt安装失败
(1)把pip换成pip3 install -r requirements.txt
(2)检查路径。要在requirements.txt所在的文件夹下安装。
(3)缺少C++编译工具,解决方法如下:
三步解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“_苦茶_ch066613的博客-CSDN博客
2.5 Packages Not Found
(1)我自己的问题是根据PyCharm的提醒了两个插件,结果下载了以后每次打开都给我报不同的Packages Not Found,但我在编辑器、Anaconda终端都能检查到我已经安装了这些包。所以我将PyCharm推荐的两个插件关闭试了一下,这个问题就解决了。
(2)如果不是上面的问题,可以看看以下博主的解决办法:
python numpy安装失败,Numpy已安装,但仍然出现错误_Yiqin Fu的博客-CSDN博客
使用pycharm编辑器编写python出现找不到numpy等包的问题_菜坯子的博客-CSDN博客_pycharm没有numpy python3中导入pillow时显示没有名为“pillow”的包(ModuleNotFoundError: No module named 'pillow')_JJJasmine的H君的博客-CSDN博客_import pillow
Pycharm:第三方库安装、包无法找到_Heiiyoo的博客-CSDN博客
pycharm找不到已安装的包/无法找到新包解决办法_MWHLS的博客-CSDN博客_pycharm安装了包找不到 Pycharm 安装第三方包,显示安装成功,但是没有包显示,瞬间解决_比卡丘不皮的博客-CSDN博客_pycharm没有包
解决pycharm中无法安装包,或者安装了仍然无法使用的问题_李略肖的博客-CSDN博客_pycharm无法安装包
pip里面已经下载好的库,但是conda list里面找不到/pip安装了包但pycharm里找不到(pip如何安装到conda下)_落雪wink的博客-CSDN博客_pip安装的包conda没有 因为这部分我最后是自己歪打正着解决掉了,跟以上博主遇到的问题不一样,所以没有验证是否有用,可以按照需求自己试一试。
2.6 AttributeError: Can‘t get attribute ‘SPPF‘
YOLOv5-5.0没有SPPF这个类,所以需要去YOLOv5-6.0 copy下SPPF这个类进5.0
在model/common.py中添加如下代码即可:
最上方添加引用:
import warnings
在类SPP下方添加如下代码:
class SPPF(nn.Module):
# Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher
def __init__(self, c1, c2, k=5): # equivalent to SPP(k=(5, 9, 13))
super().__init__()
c_ = c1 // 2 # hidden channels
self.cv1 = Conv(c1, c_, 1, 1)
self.cv2 = Conv(c_ * 4, c2, 1, 1)
self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)
def forward(self, x):
x = self.cv1(x)
with warnings.catch_warnings():
warnings.simplefilter('ignore') # suppress torch 1.9.0 max_pool2d() warning
y1 = self.m(x)
y2 = self.m(y1)
return self.cv2(torch.cat([x, y1, y2, self.m(y2)], 1))
参考博客:
AttributeError: Can‘t get attribute ‘SPPF‘ on <module ‘models.common‘ from ‘yolov5-5.0\\models\\comm_诺顿与苏菲的博客-CSDN博客
AttributeError: Can‘t get attribute ‘SPPF‘ on <module ‘models.common‘ from ‘H:\\yolov5-5.0\\models\\_啥也不是的py人的博客-CSDN博客
2.7 Image Not Found
(1)确保训练集的路径正确。
深度机器学习:报错AssertionError: Image Not Found D:\PycharmProjects\yolov5-hat\VOCdevkit\images\train\000000_学习中.....臭丫头的博客-CSDN博客
(2)在云服务器上已经跑过的代码放进PyCharm中出现该问题:
解决YOLOv5训练报错之AssertionError: Image Not Found YOLOv5-5.0/VOCdevkit/images/train/0.jpg_Mr_LanGX的博客-CSDN博客
(3) 路径本身不能出现中文名称。
YOLOv5测试时出现AssertionError: Image Not Found-Python-CSDN问答
(4)绝对路径和相对路径的修改 :
yolov5 AssertionError: Image Not Found_ITLCFgoing的博客-CSDN博客
2.8 批量修改文件名
在CSDN上找了一下,都是中文改成首字母或者拼音,没有改成英文版名称那种,然后找了一些源码也不大会用,可以整理给大家看一下:
python批量修改文件名_用余生去守护的博客-CSDN博客_python批量修改文件名
Python 批量修改文件名_sereasuesue的博客-CSDN博客
计算机名改为名字的拼音,批量转换中文文件名为拼音_慢潜空间站的博客-CSDN博客
python批量修改文件名(将中文改为英文首字母)和xml文件_冰激凌啊的博客-CSDN博客_python批量修改xml文件名
怎么简单快速的将多个中文文件转换成英文的名称_SHkingA的博客-CSDN博客_批量中文文件名转英文
python版-批量中文文件名转英文_MartinHan01的博客-CSDN博客_python 中文转英文
2.9 显存不足:报错CUDA out of memory.
RuntimeError: CUDA out of memory. Tried to allocate 14.00 MiB (GPU 0; 6.00 G)的解决【实测成功】_captain飞虎大队的博客-CSDN博客
在修改batch_size为4以后我害怕有很大影响,所以找了一下这个会造成什么影响看看:
深入剖析深度学习中Batch Size大小对训练过程的影响_flyfor2013的博客-CSDN博客
2.10 Tensorboard查看曲线
这个其实不一定非要使用Tensorboard看,但怎么用在最上面的教程里有很详细的做法。
如果Tensorboard报错的话,
你就是很想用Tensorboard,可以参考如下博客:
关于解决Tensorboard出现No dashboards are active for the current data set.问题_我会像蜗牛一样努力的博客-CSDN博客
但如果你对曲线图的要求没有那么高,可以直接打开你的yolov5文件夹yolov5-5.0\runs\train,随便点开一个exp就可以看到这次训练的具体曲线参数了,还可以看到一些图片(可以用来做中期答辩。)
3 优化部分(官方建议)
先po一下参考链接:Tips for Best Training Results 📌 - YOLOv5 Documentation
3.1 数据集
根据官网的建议,针对数据集我们首先要检查如下方面的内容:
(1)数据集足够大且标记良好。大多数情况下,只要满足这一条就可以在不更改模型或训练设置的情况下获得良好的结果。
(2)每类图像≥1500张(毕设的数据集不需要这么多,这个是官网给的数据,本科生毕业设计具体可以询问导师大约需要多少张。)
(3)每类总数≥10000个实例(标记对象)
(4)图像具有多样性,代表部署的环境。针对现实世界的用例,推荐来自一天中不同时间、不同季节、不同天气、不同照明、不同角度、不同来源(在线抓取、本地收集、不同相机)等图像。
(5)标签准确性。标签必须紧紧包围每个对象,对象与边界框之间不应存在空间,任何对象都不应该缺少标签。
(6)背景图像。背景图像是没有添加到数据集以减少误报(FP)的对象的图像。官网建议使用大约0-10%的背景图片来帮助减少FP(COCO中含有1000张背景图片供参考,占总数的1%)
本科生毕业设计重点关注(1)、(4)、(5)即可,(2)可以适当扩充,最少500张左右,少了数据会不太好。(6)的背景图像我没有试过,如果是单纯学习可以试一试。
3.2 预训练权重类型选择
这里我使用的是yolov5s,我的电脑是办公本,用m就跑不起来了。
(1)移动部署:yolov5s、yolov5m(普通的就用s就好,毕设什么的,够用了)
(2)云部署:yolov5l、yolov5x
(3)大模型:yolov5x、yolov5x6
具体的模型选择可以在GitHub中yolov5的界面下拉看到表格,不过一般来说yolov5s就可以了。
3.3 训练设置
(1)epoch:默认设置为300轮。
如果过早拟合(例如mPA没什么提升了,比如跑了几十轮都差别不大)可以减少轮数,例如100轮;如果在300轮后还没有出现过拟合,可以增加轮数到600、1200等。
(2)图片大小:默认设置为--img 640。
如果数据集中有很多小对象,那么自定义数据集将受益于本机或更高分辨率的训练,例如-img 1280。
(3)批量大小:默认设置为16。
尽可能用硬件允许的最大容量,小批量会产生较差的批量标准统计数据。
(4)超参数:hyp.scratch.yaml。
这个不建议新手修改,如果要修改,修改前应该先用默认超参数进行训练。
一般来说,增加增强超参数将减少和延迟过度拟合,从而允许更长训练时间和更高的mPA。
3.4 Further Reading
有更多学习需求的可以看看这个:A Recipe for Training Neural Networks
4 优化部分(其他)
4.1 数据集
4.1.1 基础调整
我第一次代码跑完100轮以后发现mPA非常低,所以我就做了一些基础的调整。
建议先检查代码,在代码参数设置无误的情况下建议先把数据集的标签和对应的图片数目列一个表格。
(1)针对图片数目过少的标签可以进行扩充图片、删减该标签的数目处理。
(仅仅针对本科生毕设可以适当删除标签,因为我一共13个标签,只有500多张数据集,有些瑕疵的张数太少了,而且13个标签对应需要的数据集我的电脑是带不起来的,本科生毕设也不需要过大的数据集和过多的标签,所以我适当的删除了部分标签)
(2)针对图片数目适量但mPA精度较低的标签,可以先检查数据集的标注(对数据集进行更详细的标注)
4.1.2 图像预处理
如果上面的基础调整下来以后mPA精度还是一般般,可以尝试学习图像增强。
(最好能在表格里记录一下每次调整后的标签、图片数量、对应个体mPA、整体mPA)
目前我正在这一优化阶段,还没完全实施,所以过两天等我尝试过了再写。
4.1.2.1 图像增强
(待补充)
暂时补充几个我看到的相关教程,还没试验:Deep Learning的案例-YoloV5中的数据增强_卡列宁在睡觉的博客-CSDN博客
目标检测 YOLOv5 - 数据增强_TheOldManAndTheSea的博客-CSDN博客_yolov5 数据增强
YOLOv5 数据增强data augmentation (七)_@BangBang的博客-CSDN博客_yolov5数据增强方法
4.1.2.2 图像变换
(待补充)
4.2 算法优化
此处我只详细列举我认为自己可以用到的,其他的方法我会放在参考链接里大家可以自己详细去阅读和尝试。
4.2.1 小目标检测:增加小目标检测层
具体做法:
在模型文件yaml中增加小目标检测层。
(1)修改Anchor:增加一组较小的anchor。
# anchors
anchors:
- [5,6, 8,14, 15,11] #4
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
(2)修改Head部分:
在第17层后,继续对特征图进行上采样等处理,使得特征图继续扩大,同时在第20层时,将获取到的大小为160X160的特征图与骨干网络中第2层特征图进行concat融合,以此获取更大的特征图进行小目标检测。
# YOLOv5 head
[-1, 1, Conv, [256, 1, 1]], #18 80*80
[-1, 1, nn.Upsample, [None, 2, 'nearest']], #19 160*160
[[-1, 2], 1, Concat, [1]], #20 cat backbone p2 160*160
[-1, 3, BottleneckCSP, [256, False]], #21 160*160
# 篇幅限制中间省略一些代码,原代码关注公众后后台回复:YOLO小目标
[[21, 24, 27, 30], 1, Detect, [nc, anchors]], # Detect(p2, P3, P4, P5)
]
其他方法参考:YOLOV5 的小目标检测网络结构优化方法汇总(附代码)_3D视觉工坊的博客-CSDN博客
4.2.2 提升置信度
4.2.2.1 hyp参数调优
注:我看了一些其他博主对hyp参数调整的博客,评论区一些人反应调整后并不一定有优化,但代码运行速度会变慢,所以这部分谨慎调整。置信度识别能到0.6左右就是不错的了,如果真的太低例如0.2、0.3这样的建议可以尝试调整,稳妥一点的办法就是对数据集调整。
具体做法:
(1)路径:yolov5-5.0/data/hyp.finetune.yaml
(2)我参考的这位博主主要调整了lr0(学习率)为0.0030,同时修改了epoch、batch_size。(这里的话我增大batch_size代码是跑不起来的,所以根据自己电脑量力而行进行微调)
(3)所有超参数详解:
# 梯度下降法参数
lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3) # 初始的学习率
lrf: 0.1 # final OneCycleLR learning rate (lr0 * lrf) # 余弦函数动态降低学习率
momentum: 0.937 # SGD momentum/Adam beta1 # 梯度动量
weight_decay: 0.0005 # optimizer weight decay 5e-4 # 权重衰减度,降低权重的波动
warmup_epochs: 3.0 # warmup epochs (fractions ok) # 预热训练的轮数,采用小的学习率
warmup_momentum: 0.8 # warmup initial momentum # 预热训练时的梯度动量
warmup_bias_lr: 0.1 # warmup initial bias lr # 预热训练时的偏置b的学习率
# Loss 参数
box: 0.05 # box loss gain # 定位框损失函数的增益比
cls: 0.5 # cls loss gain # 分类损失的增益比
cls_pw: 1.0 # cls BCELoss positive_weight # 正样本的权重
obj: 1.0 # obj loss gain (scale with pixels) # 目标距离的权重
obj_pw: 1.0 # obj BCELoss positive_weight # 负样本的权重
# 输出后处理超参数
iou_t: 0.20 # IoU training threshold
anchor_t: 4.0 # anchor-multiple threshold
# anchors: 3 # anchors per output layer (0 to ignore)
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
# 图像增强的参数
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4 # image HSV-Value augmentation (fraction)
degrees: 0.0 # image rotation (+/- deg)
translate: 0.1 # image translation (+/- fraction)
scale: 0.5 # image scale (+/- gain)
shear: 0.0 # image shear (+/- deg)
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001
flipud: 0.0 # image flip up-down (probability)
fliplr: 0.5 # image flip left-right (probability)
mosaic: 1.0 # image mosaic (probability)
mixup: 0.0 # image mixup (probability)
copy_paste: 0.0 # segment copy-paste (probability)
参考: Yolov5自定义图片训练测试及模型调优(详细过程)_HowieXue的博客-CSDN博客_yolov5训练需要多少图片
[YOLO专题-22]:YOLO V5 - ultralytics代码解析-超参数详解_文火冰糖的硅基工坊的博客-CSDN博客_yolov5超参数
4.2.2.2 提高样本数据量然后重新训练
(1)参考官方对数据集的要求,见3.1。
(2)图像增强、图像变换等预处理技术,见4.1.2。
增加模型鲁棒性,防止过拟合。
注:优化重点在数据优化,对模型进行优化的提升相比数据来说较小,两者都可以试一试,但重点还是在数据上,参数要是微调<>测试这样修改。
5 总结
等完成完善之后再写总结吧目前没有什么好总结的。