修改YOLOv5的模型结构

YOLOv5 模型结构

修改YOLOv5的模型结构_第1张图片

C3模块结构图

修改YOLOv5的模型结构_第2张图片

修改目标

修改目标是移除C3模块concat后的卷积操作
修改YOLOv5的模型结构_第3张图片
YOLOv5的模型存储在项目目录下的models目录中。

  • 一些以yaml为后缀的文件保存了一些模型的超参数,通过不同的参数,形成了yolov5s,yolov5n,yolov5l等不同参数等级,不同性能的网络模型。
  • segment文件夹保存的是用于分割的配置
  • experimental.py 文件中保存了一些实验性质的模块
  • tf.py是tensorflow版本的YOLOv5
  • yolo.py 是pytorch版本的YOLOv5,这个文件中主要存放了yolo专用的模型
  • common.py 是pytorch版本的,YOLO用到的一些基本模块,例如上图中的C3模块、Conv卷积块、Bottleneck瓶颈块等。

要想实现修改C3模块,就要从common.py入手。

common.py的简单介绍

common.py中实现了yolov5所用到的一些模块

  • 将卷积、归一化、和激活函数合并成一个Conv模块
  • 将通道数先缩小后放大的Bottleneck模块
  • 结合跳跃连接、Conv、Bottleneck模块的C3模块
  • 为了下采样、降低计算量用的Focus模块
  • 融合多尺度特征的SPP(Sptaial Pyramid Pooling,空间金字塔)模块

然后在上层又创建了AutoShape进行非模型本身的预处理、后处理过程;创建了Detections用于控制检测的过程,记录状态等;创建了Classify用于二级分类。

修改代码

修改YOLOv5的模型结构_第4张图片

通过阅读源代码可知,想要删除上图中,concat后面的Conv模块,就要让concat的结果能够满足代码中原本cv3的输出格式。可以发现默认的伸缩因子就是0.5,会把cv1和cv2的输出变成c2的一半。这样concat后刚好就是c2,可以直接移除cv3层。但是有可能会出现c3是奇数的情况,这种时候我将通道大的部分分给了bottleneck模块。
修改后的代码如下:

修改YOLOv5的模型结构_第5张图片
训练修改后的模型,得到的准确率如下:
修改YOLOv5的模型结构_第6张图片
对比修改前的模型运行准确率:
修改前的模型运行准确率
对比修改前后的准确率,可以发现这层卷积的影响还是很大的,总体的准确率下降了5%。猜测是连接后的特征图直接进行接下来的处理,不能使C3模块两条向前传播的线路捕捉的特征很好的融合到一起,从而影响模型的准确率。

你可能感兴趣的:(YOLO,深度学习,YOLO)