YOLOv5改进 | SPPF | 具有多尺度带孔卷积层的ASPP【CVPR2018】


💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡


专栏目录: 《YOLOv5入门 + 改进涨点》专栏介绍 & 专栏目录 |目前已有40+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进


Atrous Spatial Pyramid Pooling (ASPP) 是一种在深度学习框架中用于语义分割的网络结构,它旨在通过不同采样率的带孔卷积(atrous convolution,也称为扩张卷积)来捕获多尺度上下文信息。ASPP 结构在原始的空洞卷积基础上,通过在多个不同的扩张率上应用卷积层,从而有效地扩大了感受野,同时保留了空间分辨率。在 ASPP 中,输入图像经过一系列带孔卷积层,每个层使用不同的扩张率,这样可以在不同的尺度上捕捉图像特征。这些层的结果被并行处理,并且它们的输出被拼接起来,形成一个丰富的特征图,这个特征图可以提供多尺度的上下文信息。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

专栏地址YOLOv5改进+入门——持续更新各种有效涨点方法——点击即可跳转

目录

1.原理

2. 将ASPP添加到YOLOv5中

2.1 ASPP的代码是实现

2.2 新增yaml文件

2.3 注册模块

2.4 执行程序

3. 完整代码分享

4. GFLOPs

5. 进阶

6. 总结


1.原理

论文地址:DenseASPP for Semantic Segmentation in Street Scenes——点击即可跳转

官方仓库:github代码仓库——点击即可跳转

带孔空间金字塔池化 (ASPP) 是一种用于语义分割任务的技术,可提高神经网络理解多尺度物体的能力。

语义分割挑战

  • 在街景理解等任务中,物体的大小差异很大。传统的卷积网络难以捕捉多尺度上下文,因为增加感受野(影响输出的输入图像区域)通常会降低特征图的空间分辨率。

带孔卷积

  • 引入带孔卷积(也称为扩张卷积)来解决此问题。它允许更大的感受野,而不会通过在过滤器权重之间插入零(或空洞)来降低空间分辨率。这样,网络可以在特征图中保持高分辨率,同时扩展感受野以捕获更多上下文。

ASPP(带孔空间金字塔池化)

  • ASPP 以带孔卷积为基础,并行应用具有不同扩张率的多个带孔卷积。其理念是同时捕获多个尺度的特征。这样,网络可以聚合不同尺度的上下文信息,提高其识别不同大小物体的能力并提高分割准确性。

DenseASPP

  • 虽然 ASPP 改进了多尺度特征表示,但它在尺度密度和感受野大小方面存在限制。DenseASPP 通过密集连接多个带孔卷积层来解决这些限制。

  • 在 DenseASPP 中,每个带孔卷积层将其输出馈送到所有后续层。这种密集连接可确保以多个尺度和各种感受野生成特征图。它还允许后面层的神经元具有更大的感受野,而不会遭受内核退化。

  • 密集连接有助于形成非常密集的尺度金字塔,从而捕获广泛且密集的尺度范围内的特征,这对于对象大小变化性高的任务(如自动驾驶)特别有用。

优点

  • DenseASPP 提供较大的感受野,同时保持密集的多尺度特征表示。

  • 它结合了并行和级联空洞卷积层的优点,提高了尺度多样性和感受野的密度。

实现

  • DenseASPP 层的组织方式是,扩张率较小的层后面是扩张率较大的层。所有前几层的输出被连接起来并输入到每个后续层中。

  • 这种设计有助于捕获更丰富、更全面的特征集,从而提高整体分割性能。

总之,ASPP 通过使用具有不同扩张率的空洞卷积捕获多尺度特征来增强语义分割。 DenseASPP 通过密集连接空洞卷积层进一步改进了这种方法,以确保密集和大范围的尺度覆盖,显著提高了网络处理高分辨率图像中不同大小物体的能力。

2. 将ASPP添加到YOLOv5中

2.1 ASPP的代码是实现

关键步骤一: 将下面代码粘贴到/yolov5-6.1/models/common.py文件中

class ASPP(nn.Module):
    def __init__(self, in_channel=512, out_channel=256):
        super(ASPP, self).__init__()
        self.mean = nn.AdaptiveAvgPool2d((1, 1))  # (1,1)means ouput_dim
        self.conv = nn.Conv2d(in_channel, out_channel, 1)
        self.atrous_block1 = nn.Conv2d(in_channel, out_channel, 1)
        self.atrous_block6 = nn.Conv2d(in_channel, out_channel, 3, padding=6, dilation=6)
        self.atrous_block12 = nn.Conv2d(in_channel, out_channel, 3, padding=12, dilation=12)
        self.atrous_block18 = nn.Conv2d(in_channel, out_channel, 3, padding=18, dilation=18)
        self.conv_1x1_output = nn.Conv2d(out_channel * 5, out_channel, 1)

    def forward(self, x):
        size = x.shape[2:]

        image_features = self.mean(x)
        image_features = self.conv(image_features)
        image_features = F.upsample(image_features, size=size, mode='bilinear')

        atrous_block1 = self.atrous_block1(x)
        atrous_block6 = self.atrous_block6(x)
        atrous_block12 = self.atrous_block12(x)
        atrous_block18 = self.atrous_block18(x)

        net = self.conv_1x1_output(
            torch.cat([image_features, atrous_block1, atrous_block6, atrous_block12, atrous_block18], dim=1))
        return net

带孔空间金字塔池化 (ASPP) 通过捕获多尺度信息来增强卷积神经网络 (CNN) 中的特征提取过程。

特征提取

  • 首先将输入图像通过主干网络(例如 ResNet)以提取高级特征图。这些特征图的分辨率通常低于输入图像,但语义信息丰富。

具有不同扩张率的带孔卷积

  • 然后通过多个带孔卷积层处理提取的特征图,每个层具有不同的扩张率。扩张率控制核元素之间的间距,有效地增加了感受野而不会丢失空间分辨率。

  • 使用的典型扩张率例如为 1、6、12 和 18。这意味着特征图被卷积多次,每次的核元素之间的间距都不同。

池化和 1x1 卷积

  • 除了空洞卷积之外,全局平均池化通常应用于特征图以捕获全局上下文信息。

  • 1x1 卷积用于降低空洞卷积和池化特征的特征图的维数。这有助于保持计算效率并有效地融合特征。

多尺度特征的连接

  • 具有不同扩张率的空洞卷积的输出和池化特征图沿深度维度连接。这会产生丰富的多尺度特征表示,该表示结合了来自不同接受场的信息。

最终卷积层

  • 然后将连接的特征图传递到另一个 1x1 卷积层以融合多尺度特征并将输出通道数减少到所需的类别数以进行分割。

上采样

  • 使用双线性插值或反卷积层对最终输出进行上采样,以匹配输入图像的分辨率。这可确保分割图具有与原始输入图像相同的尺寸。

这样将允许 ASPP 创建丰富的多尺度特征表示,通过有效捕获局部细节和全局上下文来增强语义分割模型的性能。

2.2 新增yaml文件

关键步骤二在下/yolov5-6.1/models下新建文件 yolov5_ASPP.yaml并将下面代码复制进去

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # 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, ASPP, [1024]],  # 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)
  ]

温馨提示:本文只是对yolov5l基础上添加模块,如果要对yolov5n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。


# YOLOv5n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple
 
# YOLOv5s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
 
# YOLOv5l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
 
# YOLOv5m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple
 
# YOLOv5x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple

2.3 注册模块

关键步骤三在yolo.py中注册 添加“ASPP",

2.4 执行程序

在train.py中,将cfg的参数路径设置为yolov5_ASPP.yaml的路径

建议大家写绝对路径,确保一定能找到

🚀运行程序,如果出现下面的内容则说明添加成功🚀

3. 完整代码分享

https://pan.baidu.com/s/1kItN2X_AHd_OwigJlGPvGw?pwd=sagv

提取码: sagv 

4. GFLOPs

关于GFLOPs的计算方式可以查看百面算法工程师 | 卷积基础知识——Convolution

未改进的GFLOPs

img

改进后的GFLOPs

5. 进阶

可以和损失函数以及注意力机制的修改相结合,效果可能会更好

6. 总结

空洞空间金字塔池化(ASPP)通过不同膨胀率的并行空洞卷积捕捉多尺度上下文信息,从而增强语义分割。通过应用这些卷积,ASPP在不降低空间分辨率的情况下有效地扩展了感受野,使网络能够整合来自不同尺度的特征。这一过程还通过全局平均池化进一步丰富,捕捉更广泛的上下文信息。这些多尺度卷积和池化特征的输出被连接并通过最终的1x1卷积处理以融合特征,然后进行上采样以恢复原始图像分辨率。这个过程使ASPP能够提高网络识别不同大小物体的能力,并增强精度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/742348.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式5-策略模式(Strategy)

设计模式5-策略模式 简介目的定义结构策略模式的结构要点 举例说明1. 策略接口2. 具体策略类3. 上下文类4. 客户端代码 策略模式的反例没有使用策略模式的代码 对比分析 简介 策略模式也是属于组件协作模式一种。现代软件专业分工之后的第一个结果是框架语音应用程序的划分。组…

WEB界面上使用ChatGPT

(作者:陈玓玏) 开源项目,欢迎star哦,https://github.com/tencentmusic/cube-studio 随着大模型不断发展,现在无论写代码,做设计,甚至老师备课、评卷都可以通过AI大模型来实现了&…

【数据结构与算法】动态查找表(二叉排序树,二叉平衡树)详解

二叉排序树的数据结构。 struct TreeNode {ElemType data;TreeNode *left, *right; }; using BiTree TreeNode *;结构体包含三个成员: data 是一个 ElemType 类型的变量,用于存储二叉搜索树节点的数据。left 是一个指向 TreeNode 类型的指针&#xff…

【Pandas驯化-16】一文搞懂Pandas中高性能query、eval函数技巧

【Pandas驯化-16】一文搞懂Pandas中高性能query、eval函数技巧 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 相关内容文档获取 微信公众…

Linux命令学习2

一.文件基础命令 1.alias-给某个命令取别名 使用方式:alias cl ls -la 说明:将ls -la命令取别名为cl,使用这种方式只是临时将命令取别名,重启中断后,就会失效。 问题1:如何永久性的设置命令的别名? 答…

生命在于学习——Python人工智能原理(4.3)

三、Python的数据类型 3.1 python的基本数据类型 3.1.4 布尔值(bool) 在Python中,布尔值是表示真或假的数据类型,有两个取值,True和False,布尔值常用于控制流程、条件判断和逻辑运算,本质上来…

ONLYOFFICE 桌面编辑器 8.1全新发布,更强大的编辑工具

ONLYOFFICE 8.1 一、什么是ONLYOFFICE?二、怎么安装 ONLYOFFICE 8.1三、主要功能介绍四、总结 一、什么是ONLYOFFICE? ONLYOFFICE 是一款功能强大的办公套件,旨在提供全面的文档、表格和演示文稿编辑解决方案。它集成了文字处理、电子表格和演…

基于 Native 技术加速 Spark 计算引擎

本文整理自 2024 年 6 月 DataFunSummit 2024 OLAP 架构峰会 Lakehouse 湖仓一体化架构论坛的同名主题分享。 今天分享的主题是基于 Native 技术加速 Spark 计算引擎,大家将会了解到如何基于 ClickHouse 来改造 Spark 引擎,最终获得较为可观的性能提升。…

正则表达式以及文本三剑客grep、sed、awk

正则表达式匹配的是文本内容,文本三剑客都是针对文本内容。 grep:过滤文本内容 sed:针对文本内容进行增删改查 awk:按行取列 一、grep grep的作用使用正则表达式来匹配文本内容 1、grep选项 -m:匹配几次之后停止…

第10章 启动过程组 (启动过程组的重点工作)

第10章 启动过程组 10.3启动过程组的重点工作,在第三版教材第362~364页; 文字图片音频方式 第一个知识点:项目启动会议 1、作用 标志着对项目经理责权的定义结果的正式公布,通常由项目经理负责组织和召开。2、目的 使项目各…

2024 cicsn 西南赛区 半决赛

文章目录 前言mcmf结构定义添加边遍历邻接点示例场景解决步骤1. 初始化2. 应用SPFA找最小费用增广路径 3. 增广操作4. 终止条件 结果分析 逆向maincaldeladdedit 思路expvlunexp qeme启动不行保护逆向 题目给的脚本模版 前言 不能联网搜是真坐牢 本来想等着全写了再发的&#…

我终于毕业啦!

2024-6-24,星期一,19:21,天气:阴转小雨,心情:晴。大家好啊,“失踪人员”回归啦,整整断更了两周,这两周发生了很多事,第一件就是我的毕业答辩通过啦&#xff0…

python-题库篇-Python语言特性

文章目录 Python语言特性1 Python的函数参数传递2 Python中的元类(metaclass)3 staticmethod和classmethod4 类变量和实例变量5 Python自省6 字典推导式7 Python中单下划线和双下划线8 字符串格式化:%和.format9 迭代器和生成器10 *args and **kwargs11 面向切面编程AOP和装饰器…

Element 进度条样式优化

在开发后台管理系统时,经常会用到进度条这样一个控件,Element UI中提供了progress这样一个组件,如下图所示: 该组件默认的颜色会比较单一,为此时常需要对该组件的样式进行一些优化,以满足实际项目的需求。 …

【华为HCIA数通网络工程师真题-构建以太网交换网络】

华为HCIA数通网络工程师真题-构建以太网交换网络 一、1-10题 一、1-10题 1、如图所示,四台交换机都运行 STP,各种参数都采用默认值如果交换机C的G0/0/2端口发生阻塞并无法通过该端口发送配置 BPDU,则网络中 blocked 端口多久之后会进入到转发…

【Linux】动/静态库的创建和使用

目录 一、动/静态库的概念回顾: 二、动态库与静态库的区别: 三、静态库的创建与使用: 1、Linux静态库命名规则: 2、静态库的创建和使用: 四、动态库的创建与使用: 1、Linux动态库命名规则&#xff1…

Mac环境 aab包转apks,并安装apks

一、下载下载bundletool工具 Releases google/bundletool GitHub 二、将下载bundletool.jar包、aab、keystore文件全部放到同一个目录下 例如我全部放到download目录下 转换命令行: java -jar bundletool-all-1.16.0.jar build-apks --modeuniversal --bundle…

「全新升级,性能更强大——ONLYOFFICE 桌面编辑器 8.1 深度评测」

文章目录 一、背景二、界面设计与用户体验三、主要新功能亮点3.1 高效协作处理3.2 共同编辑,毫无压力3.3 批注与提及3.4 追踪更改3.5 比较与合并3.6 管理版本历史 四、性能表现4.1 集成 AI 工具4.2 插件强化 五、用户反馈与使用案例 一、背景 Ascensio System SIA -…

finalize——释放内存

重写 没写的话就按照定义的方法,object的默认方法 system.gc会主动调用垃圾回收器,不会使用finalize方法。需求不大 对于用debug怎么进入jdk源码,ararry.sort的源码进入

OpenAI: 禁止在不支持的地区使用其 API

OpenAI 给开发者发邮件表示,禁止其 API 用于不被允许的地区,否则 7 月 9 日将面临封杀。 本次封杀似乎不区分 IP ,而是直接按照地理位置。