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

2024-06-24 13:36

本文主要是介绍YOLOv8改进 | SPPF | 具有多尺度带孔卷积层的ASPP【CVPR2018】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


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


专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进——点击即可跳转


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

专栏地址YOLOv8改进——更新各种有效涨点方法——点击即可跳转

目录

1.原理

2. 将ASPP添加到YOLOv8中

2.1 ASPP的代码是实现

2.2 更改init.py文件

2.3 添加yaml文件

2.4 在task.py中进行注册

2.5 执行程序

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添加到YOLOv8中

2.1 ASPP的代码是实现

关键步骤一: 将下面代码粘贴到在/ultralytics/ultralytics/nn/modules/block.py中,并在该文件的__all__中添加“ASPP”

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_dimself.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 更改init.py文件

关键步骤二:修改modules文件夹下的__init__.py文件,先导入函数

然后在下面的__all__中声明函数

2.3 添加yaml文件

关键步骤三:在/ultralytics/ultralytics/cfg/models/v8下面新建文件yolov8_ASPP.yaml文件,粘贴下面的内容

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 80  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'# [depth, width, max_channels]n: [ 0.33, 0.25, 1024 ]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs
# YOLOv8.0n backbone
backbone:# [from, repeats, module, args]- [ -1, 1, Conv, [ 64, 3, 2 ] ]  # 0-P1/2- [ -1, 1, Conv, [ 128, 3, 2 ] ]  # 1-P2/4- [ -1, 3, C2f, [ 128, True ] ]- [ -1, 1, Conv, [ 256, 3, 2 ] ]  # 3-P3/8- [ -1, 6, C2f, [ 256, True ] ]- [ -1, 1, Conv, [ 512, 3, 2 ] ]  # 5-P4/16- [ -1, 6, C2f, [ 512, True ] ]- [ -1, 1, Conv, [ 1024, 3, 2 ] ]  # 7-P5/32- [ -1, 3, C2f, [ 1024, True ] ]- [ -1, 1, ASPP, [ 1024 ] ]  # 9# YOLOv8.0n head
head:- [ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ]- [ [ -1, 6 ], 1, Concat, [ 1 ] ]  # cat backbone P4- [ -1, 3, C2f, [ 512 ] ]  # 12- [ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ]- [ [ -1, 4 ], 1, Concat, [ 1 ] ]  # cat backbone P3- [ -1, 3, C2f, [ 256 ] ]  # 15 (P3/8-small)- [ -1, 1, Conv, [ 256, 3, 2 ] ]- [ [ -1, 12 ], 1, Concat, [ 1 ] ]  # cat head P4- [ -1, 3, C2f, [ 512 ] ]- [ -1, 1, Conv, [ 512, 3, 2 ] ]- [ [ -1, 9 ], 1, Concat, [ 1 ] ]  # cat head P5- [ -1, 3, C2f, [ 1024 ] ]  # 21 (P5/32-large)- [ [ 15, 18, 21 ], 1, Detect, [ nc ] ]  # Detect(P3, P4, P5)

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


# YOLOv8n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple# YOLOv8s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple# YOLOv8l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple# YOLOv8m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple# YOLOv8x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple

2.4 在task.py中进行注册

关键步骤四:在parse_model函数中进行注册,添加ASPP,

2.5 执行程序

关键步骤五:在ultralytics文件中新建train.py,将model的参数路径设置为yolov8_ASPP.yaml的路径即可

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

from ultralytics import YOLO# Load a model
# model = YOLO('yolov8n.yaml')  # build a new model from YAML
# model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)model = YOLO(r'/projects/ultralytics/ultralytics/cfg/models/v8/yolov8_ASPP.yaml')  # build from YAML and transfer weights# Train the model
model.train(device = [3], batch=16)

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

3. 完整代码分享

https://pan.baidu.com/s/135hvNLKeAsVFZc-7QN2BHQ?pwd=he8n

提取码: he8n 

4. GFLOPs

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

未改进的YOLOv8nGFLOPs

img

改进后的GFLOPs

5. 进阶

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

6. 总结

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

这篇关于YOLOv8改进 | SPPF | 具有多尺度带孔卷积层的ASPP【CVPR2018】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090291

相关文章

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

YOLOv8改进实战 | 注意力篇 | 引入CVPR2024 PKINet 上下文锚点注意力CAAttention

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8 是一种尖端的、最先进的 (SOTA) 模型,它建立在以前成功的 YOLO 版本的基础上,并引入了新的功能和改进,以

基于深度学习 卷积神经网络resnext50的中医舌苔分类系统

项目概述 本项目旨在通过深度学习技术,特别是利用卷积神经网络(Convolutional Neural Networks, CNNs)中的ResNeXt50架构,实现对中医舌象图像的自动分类。该系统不仅能够识别不同的舌苔类型,还能够在PyQt5框架下提供一个直观的图形用户界面(GUI),使得医生或患者能够方便地上传舌象照片并获取分析结果。 技术栈 深度学习框架:采用PyTorch或其他

如何将卷积神经网络(CNN)应用于医学图像分析:从分类到分割和检测的实用指南

引言 在现代医疗领域,医学图像已经成为疾病诊断和治疗规划的重要工具。医学图像的类型繁多,包括但不限于X射线、CT(计算机断层扫描)、MRI(磁共振成像)和超声图像。这些图像提供了对身体内部结构的详细视图,有助于医生在进行准确诊断和制定个性化治疗方案时获取关键的信息。 1. 医学图像分析的挑战 医学图像分析面临诸多挑战,其中包括: 图像数据的复杂性:医学图像通常具有高维度和复杂的结构

【YOLO 系列】基于YOLOV8的智能花卉分类检测系统【python源码+Pyqt5界面+数据集+训练代码】

前言: 花朵作为自然界中的重要组成部分,不仅在生态学上具有重要意义,也在园艺、农业以及艺术领域中占有一席之地。随着图像识别技术的发展,自动化的花朵分类对于植物研究、生物多样性保护以及园艺爱好者来说变得越发重要。为了提高花朵分类的效率和准确性,我们启动了基于YOLO V8的花朵分类智能识别系统项目。该项目利用深度学习技术,通过分析花朵图像,自动识别并分类不同种类的花朵,为用户提供一个高效的花朵识别

YOLOv8改进 | Conv篇 | YOLOv8引入DWR

1. DWR介绍 1.1  摘要:当前的许多工作直接采用多速率深度扩张卷积从一个输入特征图中同时捕获多尺度上下文信息,从而提高实时语义分割的特征提取效率。 然而,这种设计可能会因为结构和超参数的不合理而导致多尺度上下文信息的访问困难。 为了降低多尺度上下文信息的绘制难度,我们提出了一种高效的多尺度特征提取方法,将原始的单步方法分解为区域残差-语义残差两个步骤。 在该方法中,多速率深度扩张卷积

yolov8 pt转onnx

第一步: 安装onnx pip install --upgrade onnx 第二步: 将以下代码创建、拷贝到yolov8根目录下。具体代码test.py: from ultralytics import YOLO# Load a modelmodel = YOLO('yolov8n.pt') # load an official model# Export the model

图特征工程实践指南:从节点中心性到全局拓扑的多尺度特征提取

图结构在多个领域中扮演着重要角色,它能有效地模拟实体间的连接关系,通过从图中提取有意义的特征,可以获得宝贵的信息提升机器学习算法的性能。 本文将介绍如何利用NetworkX在不同层面(节点、边和整体图)提取重要的图特征。 本文将以NetworkX库中提供的Zachary网络作为示例。这个广为人知的数据集代表了一个大学空手道俱乐部的社交网络,是理解图特征提取的理想起点。 我们先定义一些辅助函数