【深度学习】--图像处理中的注意力机制

这篇具有很好参考价值的文章主要介绍了【深度学习】--图像处理中的注意力机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

注意力机制是一个非常有效的trick,注意力机制的实现方式有许多。可以在知网上搜索一下yolov下的目标监测的硕士论文,没有一篇不提到注意力机制的迭代修改的,所以很有必要学一下.
最后给出了一个例子。

图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能
注意力机制的本质:就是寻址过程!
图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能
几种典型的注意力机制:
hard/soft/local attention
左侧是hard-attention,很极端只觉得某一步时最重要的。要么时0,要么是1, 太专一
右侧是soft-attention,对整个encode的结果都觉分配了权重。太泛滥,有些地方并不合理
图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能
比如:
图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能
图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能
local attention:是把两种attention做了一个折中,

图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能

自注意力机制:

图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能

图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能
attention机制要把postional encoding环节,是要把位置信息注入进来,因为他是并行操作的,不像RNN,只能处理完前一步,才能处理后一步,是自带位置信息的,但这样也注定了RNN很慢。
图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能
图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能

注意力机制

注意力机制是深度学习常用的一个小技巧,它有多种多样的实现形式,每一种注意力机制的实现的核心都是类似的,核心重点就是让网络关注到它更需要关注的地方。
当使用卷积神经网络去处理图片的时候,我们会更希望卷积神经网络去注意应该注意的地方,而不是什么都关注,因此,如何让卷积神经网络去自适应的注意重要的物体变得极为重要。

因此一句话总结:注意力机制就是实现网络自适应注意的一个方式
注意力机制分为三类:通道注意力机制,空间注意力机制,以及二者的结合。
图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能

注意力机制的实现方式

在深度学习中,常见的注意力机制的实现方式有SENet,CBAM,ECA等等。

SENet的实现

SENet是通道注意力机制,它是最后一届ImageNet竞赛的冠军。对于SENet而言,其重点是获得输入进来的特征层,每一个通道的权值。利用SENet,我们可以让网络关注它最需要关注的通道。
实现步骤:
1、对输入进来的特征层进行全局平均池化。
2、然后进行两次全连接,第一次全连接神经元个数较少,第二次全连接神经元个数和输入特征层相同。
3、在完成两次全连接后,我们再取一次Sigmoid将值固定到0-1之间,此时我们获得了输入特征层每一个通道的权值(0-1之间)。
4、在获得这个权值后,我们将这个权值乘上原输入特征层即可。
图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能
实现代码:

import torch
import torch.nn as nn
import math

class se_block(nn.Module):
    def __init__(self, channel, ratio=16):
        super(se_block, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
                nn.Linear(channel, channel // ratio, bias=False),
                nn.ReLU(inplace=True),
                nn.Linear(channel // ratio, channel, bias=False),
                nn.Sigmoid()
        )

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        return x * y

追加一个使用案例

if __name__ == '__main__':
    #inut: 构建数据 bz = 8  c= 64 w =227 h=227
    data = np.random.randn(8,64,227,227)
    data = torch.from_numpy(data)
    data = data.to(torch.float32)
    seblock = se_block(64,2)
    res = seblock(data)
    print(res)
    # output 输出:torch.Size([8, 64, 227, 227])

输入还是等于输出,可是却是已经获取和注意力的特征.正是因为这个特点,所以注意力机制可以任意插拔。 输入等于输出,可以侵入搭建block的任意模块!

CBAM的实现

CBAM将通道注意力机制和空间注意力机制进行一个结合,相比于SENet只关注通道的注意力机制可以取得更好的效果。其实现示意图如下所示,CBAM会对输入进来的特征层,分别进行通道注意力机制的处理和空间注意力机制的处理。
图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能
通道注意力机制和空间注意力机制的具体实现方式如下图:
图像的上半部分为通道注意力机制,通道注意力机制的实现可以分为两个部分,我们会对输入进来的单个特征层,分别进行全局平均池化和全局最大池化。之后对平均池化和最大池化的结果,利用共享的全连接层进行处理,我们会对处理后的两个结果进行相加,然后取一个sigmoid,此时我们获得了输入特征层每一个通道的权值(0-1之间)。在获得这个权值后,我们将这个权值乘上原输入特征层即可。

图像的下半部分为空间注意力机制,我们会对输入进来的特征层,在每一个特征点的通道上取最大值和平均值。之后将这两个结果进行一个堆叠,利用一次通道数为1的卷积调整通道数,然后取一个sigmoid,此时我们获得了输入特征层每一个特征点的权值(0-1之间)。在获得这个权值后,我们将这个权值乘上原输入特征层即可。
图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能

class ChannelAttention(nn.Module):
    def __init__(self, in_planes, ratio=8):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        # 利用1x1卷积代替全连接
        self.fc1   = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
        self.relu1 = nn.ReLU()
        self.fc2   = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)

        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))
        max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))
        out = avg_out + max_out
        return self.sigmoid(out)

class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()

        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1
        self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.conv1(x)
        return self.sigmoid(x)

class cbam_block(nn.Module):
    def __init__(self, channel, ratio=8, kernel_size=7):
        super(cbam_block, self).__init__()
        self.channelattention = ChannelAttention(channel, ratio=ratio)
        self.spatialattention = SpatialAttention(kernel_size=kernel_size)

    def forward(self, x):
        x = x * self.channelattention(x)
        x = x * self.spatialattention(x)
        return x

ECA的实现

ECANet是也是通道注意力机制的一种实现形式。ECANet可以看作是SENet的改进版。
ECANet的作者认为SENet对通道注意力机制的预测带来了副作用,捕获所有通道的依赖关系是低效并且是不必要的,并且认为卷积具有良好的跨通道信息获取能力。

ECA模块的思想是非常简单的,它去除了原来SE模块中的全连接层,直接在全局平均池化之后的特征上通过一个1D卷积进行学习。

既然使用到了1D卷积,那么1D卷积的卷积核大小的选择就变得非常重要了,了解过卷积原理的同学很快就可以明白,1D卷积的卷积核大小会影响注意力机制每个权重的计算要考虑的通道数量。用更专业的名词就是跨通道交互的覆盖率。

如下图所示,左图是常规的SE模块,右图是ECA模块。ECA模块用1D卷积替换两次全连接。
图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能

class eca_block(nn.Module):
    def __init__(self, channel, b=1, gamma=2):
        super(eca_block, self).__init__()
        kernel_size = int(abs((math.log(channel, 2) + b) / gamma))
        kernel_size = kernel_size if kernel_size % 2 else kernel_size + 1
        
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.conv = nn.Conv1d(1, 1, kernel_size=kernel_size, padding=(kernel_size - 1) // 2, bias=False) 
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        y = self.avg_pool(x)
        y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)
        y = self.sigmoid(y)
        return x * y.expand_as(x)


if __name__ == '__main__':
    data = np.random.randn(8,64,227,227)
    data = torch.from_numpy(data)
    data = data.to(torch.float32)
    seblock = eca_block(64,2)
    res = seblock(data)
    print(res.shape)

即插即用真是好使

注意力机制的应用

注意力机制是一个即插即用的模块,理论上可以放在任何一个特征层后面,可以放在主干网络,也可以放在加强特征提取网络。

由于放置在主干会导致网络的预训练权重无法使用,本文以YoloV4-tiny为例,将注意力机制应用加强特征提取网络上。

如下图所示,我们在主干网络提取出来的两个有效特征层上增加了注意力机制,同时对上采样后的结果增加了注意力机制。
图像超分辨中注意力机制,yolov,图像识别,深度学习,深度学习,图像处理,人工智能
实现代码如下:文章来源地址https://www.toymoban.com/news/detail-780267.html

attention_block = [se_block, cbam_block, eca_block]

#---------------------------------------------------#
#   特征层->最后的输出
#---------------------------------------------------#
class YoloBody(nn.Module):
    def __init__(self, anchors_mask, num_classes, phi=0):
        super(YoloBody, self).__init__()
        self.phi            = phi
        self.backbone       = darknet53_tiny(None)

        self.conv_for_P5    = BasicConv(512,256,1)
        self.yolo_headP5    = yolo_head([512, len(anchors_mask[0]) * (5 + num_classes)],256)

        self.upsample       = Upsample(256,128)
        self.yolo_headP4    = yolo_head([256, len(anchors_mask[1]) * (5 + num_classes)],384)

        if 1 <= self.phi and self.phi <= 3:
            self.feat1_att      = attention_block[self.phi - 1](256)
            self.feat2_att      = attention_block[self.phi - 1](512)
            self.upsample_att   = attention_block[self.phi - 1](128)

    def forward(self, x):
        #---------------------------------------------------#
        #   生成CSPdarknet53_tiny的主干模型
        #   feat1的shape为26,26,256
        #   feat2的shape为13,13,512
        #---------------------------------------------------#
        feat1, feat2 = self.backbone(x)
        if 1 <= self.phi and self.phi <= 3:
            feat1 = self.feat1_att(feat1)
            feat2 = self.feat2_att(feat2)

        # 13,13,512 -> 13,13,256
        P5 = self.conv_for_P5(feat2)
        # 13,13,256 -> 13,13,512 -> 13,13,255
        out0 = self.yolo_headP5(P5) 

        # 13,13,256 -> 13,13,128 -> 26,26,128
        P5_Upsample = self.upsample(P5)
        # 26,26,256 + 26,26,128 -> 26,26,384
        if 1 <= self.phi and self.phi <= 3:
            P5_Upsample = self.upsample_att(P5_Upsample)
        P4 = torch.cat([P5_Upsample,feat1],axis=1)

        # 26,26,384 -> 26,26,256 -> 26,26,255
        out1 = self.yolo_headP4(P4)
        
        return out0, out1

到了这里,关于【深度学习】--图像处理中的注意力机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机视觉学习笔记(图像的灰度与灰度级 图像的深度 图像噪声 图像处理)

    如果把白色和黑色之间按对数关系分为若干等级,称为灰度,灰度分为256阶,0为黑色,灰度就是没有色彩,RGB色彩分量全部相等(150,150,150)就代表灰度为150. 一幅图像中不同位置的亮度是不一样的,可用f(x,y)来表示(x,y)上的亮度。由于光是一种能量形式,因此亮度是非负

    2024年02月01日
    浏览(54)
  • 一文整理深度学习【医学图像处理领域期刊和会议】

    参考地址:医学图像处理领域期刊和会议 参考地址:中国计算机学会推荐国际学术会议和期刊目录 期刊名 链接 TMI IEEE Transactions on Medical Imaging MedIA

    2023年04月23日
    浏览(43)
  • 九章算法: 深度学习、强化学习、机器学习、推荐系统、图像处理、文本处理、序列处理、搜索引擎、数据分析等

    作者:禅与计算机程序设计艺术 随着计算机技术的飞速发展,人工智能和机器学习领域迎来蓬勃发展的时代,从“知识图谱”到“零售系统自动化”,人工智能技术正在改变着社会生活的方方面面。传统的人工智能技术都依赖于硬件上的复杂计算能力,如神经网络、决策树等

    2024年02月08日
    浏览(58)
  • 12大类150个图像处理和深度学习开源数据集

    本文整理了150 个深度学习和图像处理领域的开源数据集,包括:目标检测、人脸识别、文本识别、图像分类、缺陷检测、医学影像、图像分割、图像去雾、关键点检测、动作识别、姿态估计、自动驾驶和 RGBT 等12个方向。 1. T-LESS数据集 类型:目标检测 数量:39000 数据集下载

    2024年04月22日
    浏览(82)
  • OpenCV实战:从图像处理到深度学习的全面指南

    本文深入浅出地探讨了OpenCV库在图像处理和深度学习中的应用。从基本概念和操作,到复杂的图像变换和深度学习模型的使用,文章以详尽的代码和解释,带领大家步入OpenCV的实战世界。 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一

    2024年02月14日
    浏览(42)
  • 深度学习图像处理基础工具——opencv 实战信用卡数字识别

    任务 信用卡数字识别 穿插之前学的知识点  形态学操作 模板匹配 等 总体流程与方法 1.有一个模板 2 用轮廓检测把模板中数字拿出来 外接矩形(模板和输入图像的大小要一致 )3 一系列预处理操作 问题的解决思路 1.分析准备:准备模板,读取文件——转化为灰度图——转化

    2024年04月15日
    浏览(49)
  • 深度学习中基于python的预处理和图像扩增方法

    容易出现的报错: 错误原因通常为保存的路径不正确: 应改为: 即第一个参数应该写到文件的名称,而不能只写到文件夹就停止。 灰度图片和黑白图片有些相似,但并不完全相同。 灰度图片是指每个像素点的颜色由灰度值来表示,通常使用8位无符号整数(0-255)表示。灰

    2024年02月08日
    浏览(41)
  • BIT 变化检测模型复现 深度学习学习笔记 基于transformer结构的图像处理模型

    BIT 是用 transformer 结构进行变化检测的一个孪生网络,它的 backbone 用的是 Resnet 结构,具体结构分析可以参考这个链接的作者写的,非常清楚, http://t.csdn.cn/rA9sH。 下面就是来讲我自己的实现过程,比较简单。 首先,在官网找到相应的代码,下载解压到自己的本地。github上面的

    2024年02月10日
    浏览(39)
  • 图像处理及深度学习开源数据集大全(四万字呕心沥血整理)

    本文整理了150 余个深度学习和图像处理领域的开源数据集,包括:目标检测、人脸识别、文本识别、图像分类、缺陷检测、医学影像、图像分割、图像去雾、关键点检测、动作识别、姿态估计、自动驾驶、RGBT共13个方向。 T-LESS数据集 类型:目标检测 数量:39000 数据集下载地

    2024年02月03日
    浏览(69)
  • 图像处理之《寻找和隐藏:通过深度强化学习的对抗隐写术》论文阅读

    一、文章摘要 图像隐写术的目的是将一个完整大小的图像(称为秘密)隐藏到另一个图像(称为封面)中。以往的图像隐写算法只能在一个封面中隐藏一个秘密。在这篇论文中, 我们提出了一个自适应局部图像隐写(AdaSteg)系统,允许缩放和位置自适应图像隐写 。该系统通过在局部

    2024年03月14日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包