首页 > 其他分享 >Non-local Neural Networks 第一次将自注意力用于cv

Non-local Neural Networks 第一次将自注意力用于cv

时间:2023-12-18 19:26:06浏览次数:33  
标签:Non nn Neural self phi channels inter cv size

Non-local Neural Networks

* Authors: [[Xiaolong Wang]], [[Ross Girshick]], [[Abhinav Gupta]], [[Kaiming He]]


初读印象

comment:: (NonLocal)过去的网络注重处理局部关系,本篇网络研究了长程依赖。

Why

过去的网络,长程依赖都是依靠大量堆叠卷积得到的大感受野所建立的。

  1. 计算效率低。
  2. 难以优化。
  3. 难以多跳依赖性建模。

相关工作

  1. 非局部处理:非局部平均、BM3D
  2. CRF
  3. 使用深度1-D卷积的前馈网络
  4. 自注意力,本文可以视为对自注意力在cv的推广
  5. 交互网络(Interaction Networks)

What

提出一种非局部操作:一个点的值是所有其他位置的点的带权重的和。

  1. 直接、显式地计算任意两个点之间的关系,而非通过重复卷积。
  2. 效率高、计算量小。
  3. 不改变输入特征的尺寸,且易与其他操作结合。

How

非局部操作:

Pasted image 20220901160840

  • \(x\)是输入特征,\(y\)是和\(x\)相同大小的输出,\(x_i\)可以是一个标量,也可以是一个向量
  • \(f\)是\(x_i\)和\(x_j\)之间的关系函数(标量),\(g\)是输入\(x_j\)的一元函数,\(C(x)\)用于正则化

不同的\(f\)实例(\(g(x_j) = W_gx_j\)):

  1. 高斯函数\(f(x_i,x_j) = e^{{x_i}^Tx_j}\),其中\(x_i^Tx_j\)为点积。\(C(x)=\sum_{\forall j} f(x_i,x_j)\)
  2. 嵌入高斯\(f(x_i,x_j) = e^{\theta(x_i)^T \phi(x_j)}\),其中\(\theta(x_i)=W_\theta x_i\),\(\phi(x_j)=W_\phi x_j\)。\(C(x)=\sum_{\forall j} f(x_i,x_j)\)
  3. 点积:\(f(x_i,x_j) = \theta(x_i)^T \phi(x_j)\),其中\(\theta(x_i)=W_\theta x_i\),\(\phi(x_j)=W_\phi x_j\),\(C(x)=N\)
  4. 拼接:\(f(x_i,x_j) = ReLU(W^T_f[\theta(x_i),\phi(x_j)]\),其中\(W^T_f\)维度和后者的拼接相同。\(C(x)=N\)

C6959CE537AC39A75C108ACB243673AA

非局部块(从左到右分支名分别为a、b、c、d):

Pasted image 20220901234430Pastedimage 20220901180839

  1. 分支a是一个恒等映射;
  2. 分支b、c、d分别使用1×1卷积作为\(\theta,\phi,g\)运算,将通道数减少到512(Bottleneck),并对输入特征reshape,变为THW×512的矩阵。该矩阵中每一行为一个基本元素(一行中的所有点对应的是所有通道中的相同的那个点)。
  3. b与转置后的c进行矩阵乘法,得到关联矩阵,关联矩阵沿着行进行softmax。
  4. 关联矩阵与d进行矩阵乘法,reshape并1×1卷积(\(W_z\))增加通道数。
  5. 与恒等映射相加。

52960CCD949C3F7EB6B301268FB36F99

E0156E8A423E713D11E8FCACF0ED392C

代码

import torch
from torch import nn
from torch.nn import functional as F

class _NonLocalBlockND(nn.Module):
    """
    调用过程
    NONLocalBlock2D(in_channels=32),
    super(NONLocalBlock2D, self).__init__(in_channels,
            inter_channels=inter_channels,
            dimension=2, sub_sample=sub_sample,
            bn_layer=bn_layer)
    """
    def __init__(self,
                 in_channels,
                 inter_channels=None,
                 dimension=3,
                 sub_sample=True,
                 bn_layer=True):
        super(_NonLocalBlockND, self).__init__()

        assert dimension in [1, 2, 3]

        self.dimension = dimension
        self.sub_sample = sub_sample

        self.in_channels = in_channels
        self.inter_channels = inter_channels

        if self.inter_channels is None:
            self.inter_channels = in_channels // 2
            # 进行压缩得到channel个数
            if self.inter_channels == 0:
                self.inter_channels = 1

        if dimension == 3:
            conv_nd = nn.Conv3d
            max_pool_layer = nn.MaxPool3d(kernel_size=(1, 2, 2))
            bn = nn.BatchNorm3d
        elif dimension == 2:
            conv_nd = nn.Conv2d
            max_pool_layer = nn.MaxPool2d(kernel_size=(2, 2))
            bn = nn.BatchNorm2d
        else:
            conv_nd = nn.Conv1d
            max_pool_layer = nn.MaxPool1d(kernel_size=(2))
            bn = nn.BatchNorm1d

        self.g = conv_nd(in_channels=self.in_channels,
                         out_channels=self.inter_channels,
                         kernel_size=1,
                         stride=1,
                         padding=0)

        if bn_layer:
            self.W = nn.Sequential(
                conv_nd(in_channels=self.inter_channels,
                        out_channels=self.in_channels,
                        kernel_size=1,
                        stride=1,
                        padding=0), bn(self.in_channels))
            nn.init.constant_(self.W[1].weight, 0)
            nn.init.constant_(self.W[1].bias, 0)
        else:
            self.W = conv_nd(in_channels=self.inter_channels,
                             out_channels=self.in_channels,
                             kernel_size=1,
                             stride=1,
                             padding=0)
            nn.init.constant_(self.W.weight, 0)
            nn.init.constant_(self.W.bias, 0)

        self.theta = conv_nd(in_channels=self.in_channels,
                             out_channels=self.inter_channels,
                             kernel_size=1,
                             stride=1,
                             padding=0)
        self.phi = conv_nd(in_channels=self.in_channels,
                           out_channels=self.inter_channels,
                           kernel_size=1,
                           stride=1,
                           padding=0)

        if sub_sample:
            self.g = nn.Sequential(self.g, max_pool_layer)
            self.phi = nn.Sequential(self.phi, max_pool_layer)

    def forward(self, x):
        '''
        :param x: (b, c,  h, w)
        :return:
        '''

        batch_size = x.size(0)

        g_x = self.g(x).view(batch_size, self.inter_channels, -1)#[bs, c, w*h]
        g_x = g_x.permute(0, 2, 1)

        theta_x = self.theta(x).view(batch_size, self.inter_channels, -1)
        theta_x = theta_x.permute(0, 2, 1)

        phi_x = self.phi(x).view(batch_size, self.inter_channels, -1)

        f = torch.matmul(theta_x, phi_x)

        print(f.shape)

        f_div_C = F.softmax(f, dim=-1)

        y = torch.matmul(f_div_C, g_x)
        y = y.permute(0, 2, 1).contiguous()
        y = y.view(batch_size, self.inter_channels, *x.size()[2:])
        W_y = self.W(y)
        z = W_y + x
        return z
  • 减少运算量:
  1. 使用了Bottleneck
  2. 可以在\(\phi,g\)后面增加pooling层下采样。

Experiment

3D卷积:卷积核为3D,并且能够沿着深度方向卷积(2D的卷积核只能沿着平面卷积)。下图中每个立方体表示一个通道,多出的一维是因为增加了时间。
Pasted image 20220902001457

视频分类模型

  • 实验模型:
  1. C2D:增加了3D池化的resnet
    Pasted image 20220902003922

  2. I3D3×3×3:将残差结构中的3×3卷积膨胀成了3D的(conV1为5×7×7)

  3. I3D3×1×1:将残差结构中的第一个1×1卷积膨胀成了3D的(conV1为5×7×7)

  4. Non-local network:将non-local块插入以上三个网络中

  • 实现细节:
    • 训练
      1. non-local块中的参数被初始化为0,保证刚开始训练时该结构为一个恒等映射,使其能够从任何预训练网络上开始训练。

Kinetics

video数据集,包含400种人类动作。

C2D和nonlocal-C2D比较,nonlocal明显更优
Pasted image 20220902005346*消融实验:
Pasted image 20220902010350

(a)增加不同的nonlocal块,最少也有1%提升。
(b)不同stage加入nonlocal块的效果,stage5效果较差,可能是因为尺寸太小空间信息不明显。
(c)增加不同数量的局部块的效果,越多效果越好。5-block resnet50比resnet101效果好,证明效果提升不单纯是因为深度的提升。
(d)时间、空间和时空下的不同测试,仅在时间、空间下分别使用nonlocal,效果提升,但是不如在时空环境下同时使用。
(e)2Dnonlocal和3D相比,2Dnonlocal准确率更高且计算量更小。
(f)将nonlocal插入I3D3×1×1,两者是互补的(3D注重局部,nonlocal注重长程依赖)。
(g)研究在长视频的效果,结果表明,在128帧视频上的效果比在32帧上效果更好。

不需要任何其他处理效果就很好
Pasted image 20220902012504

Conclusion

不再将计算局限于一个小的卷积核内,而是显式地计算所有点之间的相关性。可以作为和卷积互补的操作。

标签:Non,nn,Neural,self,phi,channels,inter,cv,size
From: https://www.cnblogs.com/tifuhong/p/17909229.html

相关文章

  • Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel C
    Real-TimeSingleImageandVideoSuper-ResolutionUsinganEfficientSub-PixelConvolutionalNeuralNetwork*Authors:[[WenzheShi]],[[JoseCaballero]],[[FerencHuszar]],[[JohannesTotz]],[[AndrewP.Aitken]],[[RobBishop]],[[DanielRueckert]],[[Z......
  • 视频监控管理平台/智能监测/检测系统EasyCVR出现内核报错导致无法播放,该如何解决?
    GB28181视频监控/安防视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,安防监控汇聚平台EasyCVR可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视频定时轮播。视频监控管理平台EasyCVR支持多种播放协议,包括:H......
  • 安防监控视频管理平台EasyCVR v3.4版如何取消首次登录强制重置密码的操作?
    在视频监控领域,智慧安防平台EasyCVR平台采用了开放式的网络结构,支持高清视频的接入和传输、分发,能提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,此外,高清可视化视频监控平台EasyCVR......
  • 安全帽AI识别算法在LiteCVR智慧工地解决方案中的应用
    智慧工地是利用物联网、云计算、大数据等先进技术来优化和管理工地施工过程的一种新型施工模式。视频监控在智慧工地中发挥着重要的作用。LiteCVR视频监控系统可以实时监测工地的人员和设备,及时发现安全隐患。例如,监控摄像头可以检测到工人是否佩戴安全帽,是否按规定操作,以及工地是......
  • 磁盘阵列/视频监控系统EasyCVR新增邮件验证与定时更换登录密码功能
    TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力,包括对人、车、......
  • 2021-CVPR-Transformer Tracking
    TransformerTracking相关性在跟踪领域起着关键作用,特别是在最近流行的暹罗跟踪器中。相关操作是考虑模板与搜索区域之间相似性的一种简单的融合方式。然而,相关操作本身是一个局部线性匹配过程,导致语义信息的丢失并容易陷入局部最优,这可能是设计高精度跟踪算法的瓶颈。还有比相关......
  • python3.8 模块 paramiko报错 AttributeError: 'NoneType' object has no attribute '
    报错信息Exceptionignoredin:<functionBufferedFile.__del__at0x7f4886fbd160>Traceback(mostrecentcalllast):File"/usr/local/python3/lib/python3.8/site-packages/paramiko/file.py",line67,in__del__File"/usr/local/python3/......
  • 国标GB28181智能视频监控LiteCVR设备列表显示不全的原因排查
    随着科技的不断发展,安防视频监控技术也在不断创新和升级。近年来,一些新技术不断涌现,为安防视频监控领域带来了更多的机遇和挑战。有用户在现场部署LiteCVR,服务器重启后,设备列表显示不全,只显示国标设备,不显示Ehome设备,如下图: GB28181视频监控国标平台/视频云存储/安防监控LiteCVR......
  • 安防视频监控常见技术及GB28181国标LiteCVR视频平台应用
    最近,安防视频监控领域正在迅速发展并应用了许多新技术。以下是几种常见的新技术应用:1)人工智能(AI):AI技术在安防视频监控中被广泛应用。通过使用深度学习算法和模式识别技术,AI可以自动检测、识别和跟踪人员、车辆和物品。这不仅有助于提高安防系统的报警精确性,还可以减轻安保人员在大......
  • GB28181视频监控平台LiteCVR出现用户已过期与401报错,是什么原因?
    安防视频监控新技术的应用使得监控系统变得更加智能化、灵活化,并且提供了更多的便利性和安全性。这些新技术的不断发展也为我们的日常生活和社会安全提供了更大的保障。GB28181视频监控平台LiteCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onv......