YOLOv5改进(一)改进的核心内容

YOLOv5改进(一)核心内容(如何添加自己的模块以及配置通道)


文章目录

  • YOLOv5改进(一)核心内容(如何添加自己的模块以及配置通道)
  • 前言
  • 一、改进模型修改YOLOv5s.yaml文件
  • 二、通道配置yolo.py
  • 三、实战演示
    • 1.创建自己的模块
    • 2.通道推导以及模块参数配置
  • 四、报错推理
  • 总结


前言

要想改进YOLOv5,无非都是些缝合,一般就是加注意力,换模块,包括换主干,换池化,换头等,也有略微高级点的,就是改注意力,这个改注意力有点靠运气,可能不同的数据改进效果不同。甚至会掉点。再高级一点的就是自己设计一个模块,搭积木那种,然后多种数据实验,再放大描述。最高级的就是有数学推导以及卷积计算等公式,验证了自己的模块有优势,然后在这个模块上继续丰富形成一个网络,然后再实验,多个方向均测试,这样是最牛的,当然网络就需要全部自己建了。
我们普通人能做到再高级一点的就行,自己设计出一个模块,可以运行就基本可以了。以我的经历来说,这是建立在不断复现论文的过程上的,可能复现了一点点,也可能最后发现复现不了,都是有用的。
我这里就以记录我设计的模块进行调试介绍YOLOv5改进的一个核心内容。因为我发现很少人讲这个怎么推理以及通道配置。学会这样处理,基本上什么模型都能很快上手。


一、改进模型修改YOLOv5s.yaml文件

如果你要改模型,这个文件是必改的,这样写在一个文件里面的好处就是便于人机交互,但是缺点也严重,这个文件无法dubug,这样就无法知道每个模块之后的输出大小是多少,甚至通道数也不好看清楚。所以根据这个文件怎么看输出特征图的大小就显得很重要。
这个文件的参数的具体的介绍大家自己去查。我只介绍核心的几个参数。

1、depth_multiple: 0.33 # model depth multiple 是为了控制层的重复的次数。它会和number相乘后取整,代表该层的重复的数量,
2、width_multiple: 0.5 # layer channel multiple 是为了控制输出特征图的通道数,它会和出特征图的通道数相乘,代表该层的输出通道数。
3、[-1, 1, Conv, [64, 6, 2, 2] # [from, number, module, args],from是记录哪一层的输出通道数,-1是上一层,其他数是对应的层,YOLOv5对每个层都做了编号。number是该模块重复次数,module是这个模块的类名称,args就是这个模块的设置参数,根据这个模块的类进行定义,一般是输入通道,输出通道,步长等等,输入通道可省略。

YOLOv5改进(一)改进的核心内容_第1张图片

二、通道配置yolo.py

以C3模块为例介绍,我们以如下图找到C3通道配置,可以从yaml文件看出,C3模块的输入通道数是上一层(from=-1)的输出通道数,该模块重复3次,输出通道数是128。在yolo.py中可以看出,C3模块的c1输入通道数确实-1层的通道数,就是上一层的,c2也确实是args的第一个元素,当然也只有一个。后面的if判断,和args输出的是什么我也不太懂,但是这个很有用的,会用就行。

YOLOv5改进(一)改进的核心内容_第2张图片
再以concat为例介绍,可以从yaml看出from来源于上一层和第四层的通道数,从yolo.py可以看出,通过遍历from列表找到每个的通道数进行求和作为输出通道数。
YOLOv5改进(一)改进的核心内容_第3张图片

三、实战演示

1.创建自己的模块

代码如下(示例,讯飞星火语言模型生成):前向推导你要根据自己的设计来调,这里只是模块形式的一个示例,需要在common.py文件中添加。

class MyModel(nn.Module):
     def __init__(self, c1, c2):
         super(MyModel, self).__init__()
         # model layers
         self.layer1 = nn.Linear(c1, 64)
         self.layer2 = nn.ReLU()
         self.layer3 = nn.Linear(64, 10)
     
     def forward(self, x):
         x = self.layer1(x)
         x = self.layer2(x)
         x = self.layer3(x)
         return x

2.通道推导以及模块参数配置

按照自己的模块参数设置,你需要通道怎么变,就设置进去。以下面添加的模块为例。假如你的模块需要输入三个通道。如下所示,就是上一层和第四层以及第二层作为这个模块的输入通道数,我在args里面写出来了,实际上可以省略,只留下最后的128作为输出通道数,那么在yolo.py文件中怎么写呢。因此他是输入三个通道。所以跟之前的每个都不一样,所以分析就得到了第二张图,遍历每个输入通道作为输入,输出通道为args里面的第二个元素,当然你也可以省略输入,输出通道就修改为args里面的第一个元素。这样这个模块就 OK了。
在这里插入图片描述
在这里插入图片描述
当然还有别的模块不是这样的,如果加入就是正常的类似C3模块的形式,如下图,那么就简单了,直接在yolo.py中跟C3放在一起,第二张图就是,直接放在主的循环函数里面,那么下面要不要加入呢,这个要根据你的模型功能进行测试。我只是演示一下怎么改。
YOLOv5改进(一)改进的核心内容_第4张图片
YOLOv5改进(一)改进的核心内容_第5张图片

四、报错推理

上述改的差不多需要不断运行,看网络输出到哪里断掉了,断掉就说明这个模块的没有配置好。这就需要首先推导出你的输出通道以及各个尺度,判断是不是模块自己内部的问题,如果没问题,那就是配置通道的问题,需要按照上面方法尝试配置你的模块的通道,记住那个判断条件是很有用的,如果是类似上面第一种的单独写通道配置的话,依旧不行,可以尝试添加判断条件以及args的语句,这个我不太懂什么意思,有懂得可以一起评论区交流一下。我个人觉得dubug在这时候没啥用。

总结

本节介绍了改进YOLOv5中的较难部分:添加自己设计的模块的办法,需要设计自己的模块,并推导一些尺度和通道数,然后在yaml文件中配置模型参数,在yolo.py中配置输出通道数,如果自己推导了整个模型每层的尺寸和通道数,配置这些参数就相对容易。

你可能感兴趣的:(YOLOV5改进,深度学习,人工智能,机器学习)