YOLOv5改进 | 注意力机制 | 在主干网络中添加SOCA模块【原理+附完整代码】

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

现有的基于CNN的SISR方法主要关注更宽或更深的架构设计,忽视了探索中间层的特征相关性,因此阻碍了CNN的表达能力。为了解决这一问题,研究人员提出了一个二阶注意力网络(SAN),用于更强大的特征表达和特征相关性学习。具体来说,就是开发了一个新颖的可训练的二阶通道注意力(SOCA)模块,通过使用二阶特征统计自适应地重新缩放逐通道特征,以获得更具辨识力的表征。在本文中,给大家带来的教程是在原来的主干网络添加SOCA模块。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

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

目录

1.原理

2. SOCA代码实现

2.1 将SOCA添加到YOLOv5代码中

2.2 新增yaml文件

2.3 注册模块

2.4 执行程序

3. 完整代码分享

4. GFLOPs

5. 进阶

6.总结


1.原理

 

官方论文:Second-order Attention Network for Single Image Super-Resolution——点击即可跳转

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

1. 概述

SOCA模块旨在通过考虑特征的二阶统计量来提高网络的判别能力,而不仅仅使用之前常用的一阶统计量。

2. 动机

以前的模型,例如SENet,利用一阶统计量(例如全局平均池化)来重新调整通道特征。然而,这种方法不能完全捕捉特征之间的复杂依赖关系。研究表明,二阶统计量可以在深度CNN中提供更具判别力的表示。

3.实现

  1. 特征图重塑和协方差计算

    • 给定尺寸为 H \times W \times C (高度、宽度和通道数)的特征图 F ,它被重塑成一个特征矩阵 X ,其中包含 s = H \times W 个 C 维的特征。

    • 样本协方差矩阵\Sigma 计算如下:\Sigma = XIX^T 其中 I 是包含均值减法成分的单位矩阵。

  2. 协方差归一化

    • 协方差矩阵 \Sigma 进行特征值分解,得到\Sigma = U \Lambda U^T,其中 U 是正交矩阵,\Lambda 是特征值的对角矩阵。

    • 协方差归一化应用如下:Y = \Sigma^\alpha = U \Lambda^\alpha U^T 其中\alpha = 1/2,有助于平衡特征值以获得更好的特征表示。

  3. 通道注意力

    • 归一化的协方差矩阵表示通道间的相关性,通过全局协方差池化用作描述符。

    • 这允许网络通过自适应重新调整通道特征来学习和强调更有信息量和判别力的特征。

4. 优点

  • 增强判别能力:通过使用二阶统计量,SOCA模块使网络能够集中注意力于更有信息量的特征,从而更有效地区分不同的特征。

  • 更好的性能:与一阶统计量相比,使用二阶统计量在图像超分辨率任务中表现出更优越的性能。

5. 在SAN中的集成

SOCA模块嵌入在每个局部源残差注意力组(LSRAG)的尾部。这个位置帮助在将特征图传递到后续层之前,通过考虑复杂的特征依赖关系来精细化特征图,从而增强整体超分辨率性能。

6. 总结

SOCA模块通过利用二阶统计量来重新调整特征,提供了一种更强大和判别力更强的特征表示机制。这有助于SAN在单图像超分辨率任务中表现出色。

2. SOCA代码实现

2.1 将SOCA添加到YOLOv5代码中

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

from torch.autograd import Functionclass Covpool(Function):@staticmethoddef forward(ctx, input):x = inputbatchSize = x.data.shape[0]dim = x.data.shape[1]h = x.data.shape[2]w = x.data.shape[3]M = h*wx = x.reshape(batchSize,dim,M)I_hat = (-1./M/M)*torch.ones(M,M,device = x.device) + (1./M)*torch.eye(M,M,device = x.device)I_hat = I_hat.view(1,M,M).repeat(batchSize,1,1).type(x.dtype)y = x.bmm(I_hat).bmm(x.transpose(1,2))ctx.save_for_backward(input,I_hat)return y@staticmethoddef backward(ctx, grad_output):input,I_hat = ctx.saved_tensorsx = inputbatchSize = x.data.shape[0]dim = x.data.shape[1]h = x.data.shape[2]w = x.data.shape[3]M = h*wx = x.reshape(batchSize,dim,M)grad_input = grad_output + grad_output.transpose(1,2)grad_input = grad_input.bmm(x).bmm(I_hat)grad_input = grad_input.reshape(batchSize,dim,h,w)return grad_inputclass Sqrtm(Function):@staticmethoddef forward(ctx, input, iterN):x = inputbatchSize = x.data.shape[0]dim = x.data.shape[1]dtype = x.dtypeI3 = 3.0*torch.eye(dim,dim,device = x.device).view(1, dim, dim).repeat(batchSize,1,1).type(dtype)normA = (1.0/3.0)*x.mul(I3).sum(dim=1).sum(dim=1)A = x.div(normA.view(batchSize,1,1).expand_as(x))Y = torch.zeros(batchSize, iterN, dim, dim, requires_grad = False, device = x.device)Z = torch.eye(dim,dim,device = x.device).view(1,dim,dim).repeat(batchSize,iterN,1,1)if iterN < 2:ZY = 0.5*(I3 - A)Y[:,0,:,:] = A.bmm(ZY)else:ZY = 0.5*(I3 - A)Y[:,0,:,:] = A.bmm(ZY)Z[:,0,:,:] = ZYfor i in range(1, iterN-1):ZY = 0.5*(I3 - Z[:,i-1,:,:].bmm(Y[:,i-1,:,:]))Y[:,i,:,:] = Y[:,i-1,:,:].bmm(ZY)Z[:,i,:,:] = ZY.bmm(Z[:,i-1,:,:])ZY = 0.5*Y[:,iterN-2,:,:].bmm(I3 - Z[:,iterN-2,:,:].bmm(Y[:,iterN-2,:,:]))y = ZY*torch.sqrt(normA).view(batchSize, 1, 1).expand_as(x)ctx.save_for_backward(input, A, ZY, normA, Y, Z)ctx.iterN = iterNreturn y@staticmethoddef backward(ctx, grad_output):input, A, ZY, normA, Y, Z = ctx.saved_tensorsiterN = ctx.iterNx = inputbatchSize = x.data.shape[0]dim = x.data.shape[1]dtype = x.dtypeder_postCom = grad_output*torch.sqrt(normA).view(batchSize, 1, 1).expand_as(x)der_postComAux = (grad_output*ZY).sum(dim=1).sum(dim=1).div(2*torch.sqrt(normA))I3 = 3.0*torch.eye(dim,dim,device = x.device).view(1, dim, dim).repeat(batchSize,1,1).type(dtype)if iterN < 2:der_NSiter = 0.5*(der_postCom.bmm(I3 - A) - A.bmm(der_sacleTrace))else:dldY = 0.5*(der_postCom.bmm(I3 - Y[:,iterN-2,:,:].bmm(Z[:,iterN-2,:,:])) -Z[:,iterN-2,:,:].bmm(Y[:,iterN-2,:,:]).bmm(der_postCom))dldZ = -0.5*Y[:,iterN-2,:,:].bmm(der_postCom).bmm(Y[:,iterN-2,:,:])for i in range(iterN-3, -1, -1):YZ = I3 - Y[:,i,:,:].bmm(Z[:,i,:,:])ZY = Z[:,i,:,:].bmm(Y[:,i,:,:])dldY_ = 0.5*(dldY.bmm(YZ) - Z[:,i,:,:].bmm(dldZ).bmm(Z[:,i,:,:]) - ZY.bmm(dldY))dldZ_ = 0.5*(YZ.bmm(dldZ) - Y[:,i,:,:].bmm(dldY).bmm(Y[:,i,:,:]) -dldZ.bmm(ZY))dldY = dldY_dldZ = dldZ_der_NSiter = 0.5*(dldY.bmm(I3 - A) - dldZ - A.bmm(dldY))grad_input = der_NSiter.div(normA.view(batchSize,1,1).expand_as(x))grad_aux = der_NSiter.mul(x).sum(dim=1).sum(dim=1)for i in range(batchSize):grad_input[i,:,:] += (der_postComAux[i] \- grad_aux[i] / (normA[i] * normA[i])) \*torch.ones(dim,device = x.device).diag()return grad_input, None
def CovpoolLayer(var):return Covpool.apply(var)
def SqrtmLayer(var, iterN):return Sqrtm.apply(var, iterN)
class SOCA(nn.Module):# second-order Channel attentiondef __init__(self, channel, reduction=8):super(SOCA, self).__init__()self.max_pool = nn.MaxPool2d(kernel_size=2)self.conv_du = nn.Sequential(nn.Conv2d(channel, channel // reduction, 1, padding=0, bias=True),nn.ReLU(inplace=True),nn.Conv2d(channel // reduction, channel, 1, padding=0, bias=True),nn.Sigmoid())def forward(self, x):batch_size, C, h, w = x.shape  # x: NxCxHxWN = int(h * w)min_h = min(h, w)h1 = 1000w1 = 1000if h < h1 and w < w1:x_sub = xelif h < h1 and w > w1:W = (w - w1) // 2x_sub = x[:, :, :, W:(W + w1)]elif w < w1 and h > h1:H = (h - h1) // 2x_sub = x[:, :, H:H + h1, :]else:H = (h - h1) // 2W = (w - w1) // 2x_sub = x[:, :, H:(H + h1), W:(W + w1)]cov_mat = CovpoolLayer(x_sub) # Global Covariance pooling layercov_mat_sqrt = SqrtmLayer(cov_mat,5) # Matrix square root layer( including pre-norm,Newton-Schulz iter. and post-com. with 5 iteration)cov_mat_sum = torch.mean(cov_mat_sqrt,1)cov_mat_sum = cov_mat_sum.view(batch_size,C,1,1)y_cov = self.conv_du(cov_mat_sum)return y_cov*x

理解SOCA模块的工作流程需要考虑以下关键步骤:

  1. 特征图重塑和协方差计算

    • 首先,将输入的特征图重塑为一个二维矩阵,其中每一行对应一个空间位置,而每一列对应一个通道。

    • 接着,计算这个特征矩阵的协方差矩阵。协方差矩阵衡量了特征之间的线性相关性,有助于捕捉特征之间的相关关系。

  2. 协方差归一化

    • 在协方差归一化阶段,对协方差矩阵进行特征值分解。这个过程将协方差矩阵分解为特征向量和特征值。

    • 通过特征值分解,我们可以获得关于特征之间的重要性的信息。特征值表示了特征的重要程度,而特征向量则表示了特征之间的关系。

    • 接着,应用一个归一化操作,通过缩放特征矩阵的特征值,以达到更好地平衡不同特征之间的贡献。

  3. 通道注意力

    • 在这一步中,利用归一化后的协方差矩阵,计算每个通道之间的相关性。

    • 通过全局协方差池化,将这些相关性聚合为一个全局描述符,这个描述符反映了整个特征图中各个通道之间的关系。

    • 最后,利用这些通道间的相关性信息,调整和强调更具信息量和判别力的特征。

总的来说,SOCA模块通过对特征图进行协方差计算和归一化,以及通道注意力的机制,提供了一种更强大和判别力更强的特征表示方式。这有助于提高网络在各种计算机视觉任务中的性能表现。

2.2 新增yaml文件

关键步骤二在下/projects/yolov5-6.1/models下新建文件 yolov5_SOCA.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, SOCA, [1024]],[-1, 1, SPPF, [1024, 5]],  # 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, 15], 1, Concat, [1]],  # cat head P4[-1, 3, C3, [512, False]],  # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 11], 1, Concat, [1]],  # cat head P5[-1, 3, C3, [1024, False]],  # 23 (P5/32-large)[[18, 21, 24], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

温馨提示:本文只是对yolov5l基础上添加模块,如果要对yolov8n/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中注册, 大概在260行左右添加 ‘SOCA’

2.4 执行程序

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

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

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

3. 完整代码分享

https://pan.baidu.com/s/1J34gHh0sV6ZfQkkRpmGD9g?pwd=dni4

提取码: dni4  

4. GFLOPs

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

未改进的GFLOPs

img

改进后的GFLOPs

GFLOPs不变,网络的深度加深了

5. 进阶

你能在不同的位置添加SOCA注意力机制吗?这非常有趣,快去试试吧

6.总结

SOCA(Second-Order Channel Attention)模块的主要原理在于通过考虑特征之间的二阶统计量,即协方差矩阵,来提升网络的判别能力。首先,将特征图转换为特征矩阵,并计算其协方差矩阵,以捕捉特征之间的相关性。然后,通过特征值分解和归一化操作,平衡特征值,使得网络能够更好地理解和表达特征之间的重要性。最后,利用全局协方差池化来描述通道间的相关性,从而调整和强调更具信息量和判别力的特征,进而提高网络的性能和泛化能力。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx c++模块编译

不论是c还是c&#xff0c;nginx的第三方模块编写没什么太区别&#xff0c;但是提供给nginx调用的&#xff0c;必须是纯c的接口。 先说下为什么不能使用c编译nginx&#xff0c;nginx是纯c写的&#xff0c;而且c是兼容c的&#xff0c;但是用c(g)编译nginx的框架&#xff0c;就会出…

VRRP----虚拟路由器冗余协议(技术专题)

目录 一、VRRP的基本原理 1.1 技术背景 1.2 VRRP带来了什么 1.2.1 VRRP的作用 1.2.2 VRRP工作的过程 1.2.3 VRRP报文: 1.3 VRRP术语 1.3.1 虚拟IP地址、MAC地址 1.3.2 Master、Backup路由器 二、VRRP的基础配置 实例一 需求 配置 一、VRRP的基本原理 1.1 技术背景…

docker 拉取镜像报错: error pulling image configuration:(kafka)

一、问题描述 docker 拉取镜像报错: error pulling image configuration:&#xff08;kafka&#xff09; ERROR: error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/a6/a692873757c06a38279b61…

idea debug时提示”Method breakpoints may dramatically slow down debugging“的解决办法

问题现象 今天同事喊我过去看一个问题&#xff0c;项目正常启动的时候没问题&#xff0c;debug模式就卡住了&#xff0c;很久不动。我推测是哪个断点导致的&#xff0c;一看断点果然有情况。在方法上打了断点。 解决方式(Android Studio一样的解决&#xff09; 1、View Brea…

视频大模型 Vidu 支持音视频合成;字节跳动推出语音生成模型 Seed-TTS 丨 RTE 开发者日报 Vol.221

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

ABAP - SAP与企业微信集成

最近接到一个SAP直接给企业微信推送消息的需求&#xff0c;说实话之前一直没接触过&#xff0c;脑袋空空的&#xff0c;最终通过在百度搜索案例成功解决了&#xff0c;百度虽然一直被诟病&#xff0c;但却无法否认它的神奇。实现效果 实现思路&#xff1a;从需求出发&#xff0…

构建数字社会:Web3时代的社会治理与价值重构

随着数字化技术的飞速发展&#xff0c;我们正逐渐迈入Web3时代&#xff0c;这是一个以去中心化、开放性和透明性为特征的新时代。在这个时代&#xff0c;数字技术将不仅仅改变我们的生活方式和商业模式&#xff0c;还将对社会治理和价值观念产生深远影响。本文将探讨Web3时代下…

夏日骑行新宠降临!VELO Eden Angel坐垫 —— 让你的征途如诗般惬意!

夏日炎炎&#xff0c;是时候与维乐Eden Angel坐垫&#xff08;型号VL-6319&#xff09;共舞&#xff0c;开启一场关于自由与舒适的长途骑行盛宴&#xff01;这不仅是一款坐垫&#xff0c;它是你探索世界、追逐夏日风光的秘密武器。    聚丙烯底壳与钢弓的精妙组合&#xff…

Soildworks学习笔记(一)

1.如何添加M3,M4等螺丝孔&#xff1a; 有时候异形孔向导显示灰色是因为没有退出草图选项卡&#xff0c;选择异形孔向导就可以进行异形孔的设定和放置&#xff1a; solidwork放置螺丝孔以及显示螺纹的问题_.16-m3 solidwork-CSDN博客 2.如何修剪线条&#xff1a; 如何倒圆角或…

20240607给Toybrick的TB-RK3588开发板在Buildroot下适配瑞芯微7.86寸QXGATFT-LCD EDP屏幕1536x2048

20240607给Toybrick的TB-RK3588开发板在Buildroot下适配瑞芯微7.86寸QXGATFT-LCD EDP屏幕1536x2048 2024/6/7 13:59 1、背光部分&#xff1a;&backlight { pwms <&pwm2 0 25000 0>; status "okay"; }; &pwm2 { status "okay&…

海康威视综合安防管理平台 多处 FastJson反序列化RCE漏洞复现

0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 由于…

每日一练 2024.6.7

给你一个仅由 大写 英文字符组成的字符串 s 。 你可以对此字符串执行一些操作&#xff0c;在每一步操作中&#xff0c;你可以从 s 中删除 任一个 "AB" 或 "CD" 子字符串。 通过执行操作&#xff0c;删除所有 "AB" 和 "CD" 子串&#x…

如何备份和恢复华为手机?

智能手机已成为我们日常生活中不可或缺的一部分&#xff0c;它们存储着大量敏感数据。因此&#xff0c;确保数据安全&#xff0c;定期备份至关重要&#xff0c;以防手机意外丢失、损坏或被盗。 如果您拥有华为设备&#xff0c;并且正在寻找如何将华为手机备份到PC的方法&#…

爱校对繁体字校对上线——让企业文档更精准

在港澳台地区&#xff0c;企业每天都要处理大量繁体字文档&#xff0c;确保文档的准确性和专业性至关重要。爱校对全新推出的繁体字校对服务&#xff0c;专为企业设计&#xff0c;自动检测并修正拼写和语法错误&#xff0c;让您的文档管理更加轻松高效&#xff0c;提升企业形象…

【权威主办|投稿优惠】2024年应用物理、力学与数学国际会议(APMM 2024)

2024年应用物理、力学与数学国际会议&#xff08;APMM 2024&#xff09; 2024 International Conference on Applied Physics, Mechanics, and Mathematics 【重要信息】 大会地点&#xff1a;南昌 大会官网&#xff1a;http://www.iacapmm.com 投稿邮箱&#xff1a;iacapmmsu…

香港优才diy推荐信很难写?看看140分获批的人怎么写!(附上模板)

大家好&#xff0c;我是已获批香港优才的糖爸。 香港优才diy推荐信作为申请材料中的重要一环&#xff0c;对于申请人过往工作的综合软实力和入境处的审核具有重要影响。如何撰写一份优秀的雇主推荐信呢&#xff1f;就我的获批经验来谈谈。 一、明确推荐信的目的 雇主推荐信的主…

外贸干货|如何提高商机转化率?

常常听到外贸业务员抱怨“询盘质量不高”、“有询盘没转化”、“有些客户只是来比价格的”……想必大家都不陌生&#xff01; 但难道只有询盘问题、客户问题吗&#xff1f;我们自身的处理真的没问题吗&#xff1f;我想只有更多的自省自查我们可以控制的问题&#xff0c;优化我们…

大模型在信用卡行业的应用探索

2022年11月&#xff0c;OpenAI发布ChatGPT3.5&#xff0c;迅速引起各界广泛关注&#xff0c;引发了人工智能领域新一轮发展热潮。ChatGPT作为一款基于人工智能技术的大语言模型&#xff08;LLMs&#xff09;&#xff0c;在文本生成、对话理解、多领域知识覆盖等方面具有卓越表现…

替代LT3741大功率20A恒压恒流驱动器

1. 产品特性(替代LT3741) ➢ CTRL 引脚对输出电流提供精确控制 ➢ 2%的电压调节精度 ➢ 6%的电流调节精度 ➢ 输入电压范围&#xff08;外接达林顿 NPN 管&#xff09;&#xff1a; 6V~40V ➢ 输入电压范围&#xff08;外接单颗 NPN 管&#xff09;&#xff1a; 5.25V~40V…

markdown图片离线备份,批量替换url

之前在某站写了很多笔记&#xff0c;最近想着迁移备份下&#xff0c;找到了接口写了个脚本将文章爬取下来了。文章是基于 Markdown 格式的&#xff0c;在写作时粘贴图片&#xff0c;直接上传到他们图床服务器了。Markdown 文本里面是个<img src"https://aaa.com/bbb.jp…