Criss-Cross Attention for Semantic Segmentation论文及代码分析

2023-11-13

先附上论文代码。该工作于2019年发表于ICCV会议。
请添加图片描述

1. Introduction

由于固定的几何结构,传统的FCN受限于局部的感受野,只能提供短程的上下文信息。这对于提升分割任务的精度起到相反的影响。

为了弥补FCN的缺陷,ASPP和PPM模块被提出来,在网络的底层中加入有效的上下文特征。但是膨胀卷积并不能够产生密集的上下文信息。同时,基于池化的方法以非自适应的方式聚合上下文信息,并且认为所有图像像素具有相同的重要性,这不能满足不同像素需要不同的上下文依赖关系的要求。

为了包含密集的且逐像素的上下文信息,一些全连接的GNN方法被提出来,用估计的全图像上下文表示来增强传统的卷积特征。该方法中就包含了提出了自注意力机制的Non-local Networks工作,。

然而,这些基于GNN的Non-local神经网络需要产生庞大的注意力特征图来表示相互配对的像素间的关系,导致对于时间和空间复杂度都到 O ( N 2 ) O(N^2) O(N2), N N N代表输入特征的数量。

为了解决上述问题,我们的动机是使用几个连续的稀疏连接的图来代替单一的密集连接的图,使得可以减少计算资源。通过连续堆叠2个十字交叉的注意力模块,可以将时间和空间复杂度从 O ( N 2 ) O(N^2) O(N2)降低到 O ( N N ) O(N \sqrt N) O(NN )。我们共享交叉模块的参数以保持我们的模型苗条。

2. Approach请添加图片描述

2.1 Network Architecture

接下来介绍在水平和垂直方向上捕获上下文信息的 2D 十字交叉注意力模块。 为了捕获密集的全局上下文信息,我们建议对十字交叉注意力模块采用循环操作。

2.1.1. 输入图像经过一个DCNN网络来生成特征图空间维度是 H × W H \times W H×W的特征图 X X X。为了保留更多的细节信息并且能够生成密集的特征图,我们去除了最后两层的下采样操作并且加入了膨胀卷积在后面的卷积网络层中,最终特征图 X X X的大小为输入图像的 1 8 \frac{1}{8} 81

2.1.2. 得到特征图 X X X后,使用 1 × 1 1 \times 1 1×1卷积降低通道数得到特征图 H H H。特征图 H H H再输入到十字交叉注意力模块后得到新的特征图 H ′ H^{'} H,特征图 H ′ H^{'} H中将上下文信息聚合到其十字交叉路径的每个像素中。

2.1.3. 特征图 H ′ H^{'} H中每个像素中只包含了沿着它的水平方向和竖直方向上的上下文信息,对于要求精确度高的分割任务来说能力不够。为了得到更加丰富和密集的上下文信息,再将特征图 H ′ H^{'} H又一次地输入到十字交叉注意力模块后,得到特征图 H ′ ′ H^{''} H。此时,特征图 H ′ ′ H^{''} H的每个像素都聚集了与所有位置像素的信息。

2.1.4. 两次十字交叉注意力模块共享参数,避免在模块中加入太多参数。并将其命名为 r e c u r r e n t   c r i s s − c r o s s   a t t e n t i o n ( R C C A ) recurrent \ criss-cross \ attention(RCCA) recurrent crisscross attention(RCCA)模块。

2.1.5. 之后,我们将密集的上下文特征 H ′ ′ H^{''} H与特征图 X X X c o n c a t e n a t e concatenate concatenate操作后,后面架上卷积操作、 B N BN BN操作和激活函数来进行特征融合。

2.1.6. 最后,将融合后的特征图传入到分割层去预测最后的分割结果。

2.2 Criss-Cross Attention

请添加图片描述
\quad 为了以轻量级的计算量和内存作为代价,就能够将全副图像的邻域特征间的依赖关系进行建模,我们提出了一个十字交叉注意力模块。十字交叉注意力模块在水平和竖直方向上收集上下文信息来增强逐像素的特征能力。如图3所示,大小为 R C × W × H R^{C\times W\times H} RC×W×H特征图 H H H,经过两次 1 × 1 1 \times 1 1×1卷积各自生成特征图 Q Q Q K K K { Q , K } ∈ R C ′ × W × H \{Q,K\}\in R^{C^{'} \times W \times H } {Q,K}RC×W×H,其中 C ′ C^{'} C小于 C C C。根据 Q Q Q K K K,生成注意力图 A ∈ R ( H + W − 1 ) × ( W × H ) A \in R^{(H+W-1)\times(W \times H)} AR(H+W1)×(W×H)

步骤:

2.2.1 在 Q C ′ × W × H Q^{C^{'} \times W \times H} QC×W×H的空间维度上每一个特征点 u u u的位置上,都可以得到一个向量 Q u ∈ R C ′ Q_u \in R^{C^{'}} QuRC

2.2.2 同时,也在 K C ′ × W × H K^{C^{'}\times W \times H} KC×W×H中在对应着特征点 u u u的所处位置从相同水平和竖直方向上收集特征,得到集合 Ω u ∈ R ( H + W − 1 ) × C ′ \Omega_u \in R^{(H+W-1) \times C^{'}} ΩuR(H+W1)×C。其中, Ω i , u ∈ R C ′ \Omega_{i,u} \in R^{C^{'}} Ωi,uRC,是 Ω u \Omega_u Ωu的第 i i i个元素。

2.2.3 d i , u = Q u × Ω i , u T d_{i,u}=Q_u \times \Omega_{i,u}^{T} di,u=Qu×Ωi,uT d i , u ∈ D ( H + W − 1 ) × ( W × H ) d_{i,u} \in D^{(H+W-1)\times(W \times H)} di,uD(H+W1)×(W×H) Q u Q_{u} Qu Ω i , u \Omega_{i,u} Ωi,u之间的相关程度。其中, i = [ 1 , … , H + W − 1 ] i=[1,…,H+W-1] i=[1,H+W1]。之后再在通道维度上做一个softmax操作后,得到注意力特征图 A A A

2.2.4 在特征图 H H H 1 × 1 1 \times 1 1×1卷积,得到特征图 V V V V ∈ R C × W × H V \in R^{C \times W \times H} VRC×W×H。在 V V V的空间维度上每一个特征点 u u u的位置上,都可以得到一个向量 V u ∈ R C V_u \in R^{C} VuRC。并且还能从 u u u所处位置从相同水平和竖直方向上收集特征,得到集合 Φ u ∈ R ( H + W − 1 ) × C \Phi_u \in R^{(H+W-1)\times C} ΦuR(H+W1)×C

2.2.5 将注意力特征图 A A A作用于特征图 V V V上,过程如公式 H u ′ = ∑ i = 0 H + W − 1 A i , u ϕ i , u + H u H_u^{'}=\sum_{i=0}^{H+W-1}A_{i,u} \phi_{i,u}+H_u Hu=i=0H+W1Ai,uϕi,u+Hu所示。至此,特征图 H u ′ H_u^{'} Hu获得更大的上下文感受野,并且可以通过注意力特征图,从而有选择性地聚集上下文特征。

2.3 Recurrent Criss-Cross Attention(RCCA)

尽管通过十字交叉注意力模块作用后,能够在水平和竖直方向上捕获上下文特征,但并为考虑到其周围像素。为了处理这个问题,我们基于十字交叉注意力模块的基础上,既创新又简单地引入了RCCA操作。RCCA操作就是连续两个十字交叉注意力模块相连。首先,将特征图 H H H经过第一个十字交叉注意力模块后,输出特征图 H ′ H^{'} H, H ′ H^{'} H H H H的形状相同。再将特征图H^'经过第二个十字交叉注意力模块,输出特征图 H ′ ′ H^{''} H H ′ ′ H^{''} H能够从所有像素中获取全图像上下文信息,以生成具有密集和丰富上下文信息的新特征。请添加图片描述
通过两次十字交叉注意力操作后,特征图中每个特征点与所有特征点的相关程度的信息传递的过程如图4所示。

2.3.1 如左图所示,经过第一个十字交叉注意力操作后,特征点 ( θ x , θ y ) (\theta_x, \theta_y) (θx,θy)只能计算与其水平和竖直方向上的特征(如图中 ( u x , θ y ) (u_x, \theta_y) (ux,θy) ( θ x , u y ) (\theta_x,u_y) (θx,uy))间的相关程度,将 ( θ x , θ y ) (\theta_x, \theta_y) (θx,θy)的信息传递给两者,此时无法计算和 ( u x , u y ) (u_x,u_y) (ux,uy)的相关程度。

2.3.2 如右图所示, ( u x , θ y ) (u_x, \theta_y) (ux,θy) ( θ x , u y ) (\theta_x,u_y) (θx,uy)是在 ( u x , u y ) (u_x, u_y) (ux,uy)的十字交叉路径上,当经过第二个十字交叉注意力操作后, ( u x , θ y ) (u_x, \theta_y) (ux,θy) ( θ x , u y ) (\theta_x,u_y) (θx,uy)即可各自把与 ( θ x , θ y ) (\theta_x, \theta_y) (θx,θy)的相关程度信息传递给 ( u x , u y ) (u_x,u_y) (ux,uy)

综上,RCCA模块弥补了一次十字交叉注意力操作不能从所有像素中获得密集的上下文信息的缺陷。

3. Code

3.1 十字交叉注意力模块中要计算某像素与其水平和竖直方向上所有元素的相关程度。将降通道后的自注意力中的特征图 Q u e r y ( B , C ′ , H , W ) Query^{(B,C^{'},H,W)} Query(B,C,H,W)和特征图 K e y ( B , C ′ , H , W ) Key^{(B,C^{'},H,W)} Key(B,C,H,W)分别沿水平方向 W W W和竖直方向 H H H计算水平方向和竖直方向上的相关程度。

3.2 比如在特征图 Q u e r y ( B , C ′ , H , W ) Query^{(B,C^{'},H,W)} Query(B,C,H,W)中,一共 B B B b a t c h batch batch,每个 b a t c h batch batch中都有 H × W H \times W H×W C ′ C^{'} C维特征。考虑将特征图 Q u e r y ( B , C ′ , H , W ) Query^{(B,C^{'},H,W)} Query(B,C,H,W)表示成 ( B × W , H , C ′ ) (B \times W, H, C^{'}) (B×W,H,C)维矩阵后,表示一共有 B × W B \times W B×W b a t c h batch batch,每个 b a t c h batch batch中都有 H H H C ′ C^{'} C维特征,即是 H × C ′ H \times C^{'} H×C维矩阵。

3.3 同上,将特征图 K e y ( B , C ′ , H , W ) Key^{(B,C^{'},H,W)} Key(B,C,H,W)转换成 ( B × W , C ′ , H ) (B \times W, C^{'},H) (B×W,C,H)维矩阵。

3.4 当计算竖直方向上所有像素的相关程度时, t o r c h . b m m ( Q u e r y ( B × W , H , C ′ ) , K e y ( B × W , C ′ , H ) ) torch.bmm(Query^{(B \times W,H,C^{'})},Key^{(B \times W, C^{'},H)}) torch.bmm(Query(B×W,H,C),Key(B×W,C,H))得到 A t t e n t i o n _ H ( B × W , H , H ) Attention\_H^{(B \times W, H,H)} Attention_H(B×W,H,H)。这样就在特征图每行分开后,计算出每个像素与沿着竖直方向上像素的相关程度。

3.5 按照类似3.2-3.4思路即可计算出沿水平方向上的相关程度 A t t e n t i o n _ W ( B × H , W , W ) Attention\_W^{(B \times H,W,W)} Attention_W(B×H,W,W)

3.6 将 A t t e n t i o n _ H ( B × W , H , H ) Attention\_H^{(B \times W, H,H)} Attention_H(B×W,H,H)转换成 A t t e n t i o n _ H ( B , H , W , H ) Attention\_H^{(B,H,W,H)} Attention_H(B,H,W,H)后,去掉像素与自己的相关程度。再将 A t t e n t i o n _ W ( B × H , W , W ) Attention\_W^{(B \times H,W,W)} Attention_W(B×H,W,W)转换成 A t t e n t i o n _ W ( B , H , W , W ) Attention\_W^{(B,H,W,W)} Attention_W(B,H,W,W)后,再在 d i m = 3 dim=3 dim=3上进行 c o n c a t e n a t e concatenate concatenate操作和 s o f t m a x softmax softmax操作,即得到特征图上沿着十字交叉路径上的注意力分数。
注:torch.permute()操作在二维矩阵上进行转置,行变列,列变成行的过程。在三维矩阵上操作也如同二维矩阵上效果一样,是在换坐标轴,但理解起来困难,故配一张图(图中batch=1)帮助理解torch.permute()操作对数据的变换过程,先看图右上方,数据位置不动,将坐标轴位置对应变换;再如右下图,再以之前的坐标轴方向去查看数据。torch.permute()大概就是这样对数据进行了变换。
请添加图片描述

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

def INF(B, H, W):
    return -torch.diag(torch.tensor(float("inf")).repeat(H), 0).unsqueeze(0).repeat(B*W, 1, 1)

class CrissCrossAttention(nn.Module):
    """Criss-Cross Attention Moudle"""
    def __init__(self, in_dim):
        super(CrissCrossAttention, self).__init__()
        self.query_conv = nn.Conv2d(in_channels=in_dim, out_channels=in_dim//8, kernel_size=1)
        self.key_conv   = nn.Conv2d(in_channels=in_dim, out_channels=in_dim//8, kernel_size=1)
        self.value_conv = nn.Conv2d(in_channels=in_dim, out_channels=in_dim, kernel_size=1)
        self.softmax    = Softmax(dim=3)
        self.INF        = INF
        self.gamma      = nn.Parameter(torch.zeros(1))
        
    def forward(self, x):
        m_batchsize, _, height, width = x.size()
        
        proj_query = self.query_conv(x)
        # b, c', h, w ===> b, w, c', h ===> b*w, c', h ===> b*w, h, c'
        proj_query_H = proj_query.permute(0, 3, 1, 2).contiguous().view(m_batchsize*width, -1, height).permute(0, 2, 1)
        # b, c', h, w ===> b, h, c', w ===> b*h, c', w ===> b*h, w, c'
        proj_query_W = proj_query.permute(0, 2, 1, 3).contiguous().view(m_batchsize*height, -1, width).permute(0, 2, 1)
        
        proj_key = self.key_conv(x)
        # b, c', h, w ===> b, w, c', h ===> b*w, c', h
        proj_key_H = proj_key.permute(0, 3, 1, 2).contiguous().view(m_batchsize*width, -1, height)
        # b, c', h, w ===> b, h, c', w ===> b*h, c', w
        proj_key_W = proj_key.permute(0, 2, 1, 3).contiguous().view(m_batchsize*height, -1, width)
        
        proj_value = self.value_conv(x)
        # b, c', h, w ===> b, w, c', h ===> b*w, c', h
        proj_value_H = proj_value.permute(0, 3, 1, 2).contiguous().view(m_batchsize*width, -1, height)
        # b, c', h, w ===> b, h, c', w ===> b*h, c', w
        proj_value_W = proj_value.permute(0, 2, 1, 3).contiguous().view(m_batchsize*height, -1, width)
        
        # torch.bmm((b*w,h,c')x(b*w,c',h))===>(b*w,h,h)+(b*w,h,h)===>(b*w,h,h)===>(b,w,h,h)===>(b, h, w, h)
        energy_H = (torch.bmm(proj_query_H, proj_key_H)+self.INF(m_batchsize, height, width)).view(m_batchsize, width, height, height).permute(0, 2, 1, 3)
        # torch.bmm((b*h,w,c')x(b*h,c',w))===>(b*h,w,w)===>(b, h, w, w)
        energy_W = (torch.bmm(proj_query_W, proj_key_W)).view(m_batchsize, height, width, width)
        # torch.cat([(b,h,w,h),(b,h,w,w)], 3)===>(b,h,w,h+w)
        concate = self.softmax(torch.cat([energy_H, energy_W], 3))
        
        # (b,h,w,h+w)===>(b,h,w,h)===>(b,w,h,h)===>(b*w,h,h)
        att_H = concate[:,:,:,0:height].permute(0, 2, 1, 3).contiguous().view(m_batchsize*width, height, height)
        # (b,h,w,h+w)===>(b,h,w,w)===>(b*h,w,w)
        att_W = concate[:,:,:,height:height+width].contiguous().view(m_batchsize*height, width, width)
        
        # torch.bmm((b*w,c',h)x(b*w,h,h))===>(b*w,c',h)===>(b,w,c',h)===>(b,c',h,w)
        out_H = torch.bmm(proj_value_H, att_H.permute(0, 2, 1)).view(m_batchsize, width, -1, height).permute(0, 2, 3, 1)
        # torch.bmm((b*h,c',w)x(b*h,w,w))===>(b*h,c',w)===>(b,h,c',w)===>(b,c',h,w)
        out_W = torch.bmm(proj_value_W, att_W.permute(0, 2, 1)).view(m_batchsize, height, -1, width).permute(0, 2, 1, 3)
        
        return self.gamma*(out_H + out_W) + x
        
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Criss-Cross Attention for Semantic Segmentation论文及代码分析 的相关文章

  • 推导 pytorch 网络的结构

    对于我的用例 我需要能够采用 pytorch 模块并解释模块中的层序列 以便我可以以某种文件格式在层之间创建 连接 现在假设我有一个简单的模块 如下所示 class mymodel nn Module def init self input
  • 用我自己的值初始化pytorch卷积层

    我想知道是否有办法用我自己的值初始化 pytorch 卷积过滤器 例如 我有一个元组 0 8423 0 3778 3 1070 2 6518 我想用这些值初始化 2X2 过滤器 我该怎么做 我查找了一些答案 但他们大多使用火炬正态分布和其他
  • 如何检查 PyTorch 是否正在使用 GPU?

    如何检查 PyTorch 是否正在使用 GPU 这nvidia smi命令可以检测 GPU 活动 但我想直接从 Python 脚本内部检查它 这些功能应该有助于 gt gt gt import torch gt gt gt torch cu
  • Pytorch 数据加载器:错误的文件描述符和 EOF > 0

    问题描述 在使用由自定义数据集制作的 Pytorch 数据加载器进行神经网络训练期间 我遇到了奇怪的行为 数据加载器设置为workers 4 pin memory False 大多数时候 训练都顺利完成 有时 训练会随机停止 并出现以下错误
  • 如何使用 torch.stack?

    我该如何使用torch stack将两个张量与形状堆叠a shape 2 3 4 and b shape 2 3 没有就地操作 堆叠需要相同数量的维度 一种方法是松开并堆叠 例如 a size 2 3 4 b size 2 3 b torc
  • 在pytorch中使用tensorboard,但得到空白页面?

    我在pytorch 1 3 1中使用tensorboard 并且我在张量板的 pytorch 文档 https pytorch org docs stable tensorboard html 运行后tensorboard logdir r
  • 将 CNN Pytorch 中的预训练权重传递到 Tensorflow 中的 CNN

    我在 Pytorch 中针对 224x224 大小的图像和 4 个类别训练了这个网络 class CustomConvNet nn Module def init self num classes super CustomConvNet s
  • PyTorch 教程错误训练分类器

    我刚刚开始 PyTorch 教程使用 PyTorch 进行深度学习 60 分钟闪电战我应该补充一点 我之前没有编写过任何 python 但其他语言 如 Java 现在 我的代码看起来像 import torch import torchvi
  • torch-1.1.0-cp37-cp37m-win_amd64.whl 在此平台上不受支持的滚轮

    我在开发 RNN 时需要使用 pyTorch 每当我尝试安装它时 我都会收到一条错误消息 指出 torch 1 1 0 cp37 cp37m win amd32 whl 在此平台上不受支持 pip3安装https download pyto
  • 一次热编码期间出现 RunTimeError

    我有一个数据集 其中类值以 1 步从 2 到 2 i e 2 1 0 1 2 其中 9 标识未标记的数据 使用一种热编码 self one hot encode labels 我收到以下错误 RuntimeError index 1 is
  • torch.mm、torch.matmul 和 torch.mul 有什么区别?

    阅读完 pytorch 文档后 我仍然需要帮助来理解之间的区别torch mm torch matmul and torch mul 由于我不完全理解它们 所以我无法简明地解释这一点 B torch tensor 1 1207 0 3137
  • PyTorch 中复数矩阵的行列式

    有没有办法在 PyTorch 中计算复矩阵的行列式 torch det未针对 ComplexFloat 实现 不幸的是 目前尚未实施 一种方法是实现您自己的版本或简单地使用np linalg det 这是一个简短的函数 它计算我使用 LU
  • Blenderbot 微调

    我一直在尝试微调 HuggingFace 的对话模型 Blendebot 我已经尝试过官方拥抱脸网站上给出的传统方法 该方法要求我们使用 trainer train 方法来完成此操作 我使用 compile 方法尝试了它 我尝试过使用 Py
  • pytorch 的 IDE 自动完成

    我正在使用 Visual Studio 代码 最近尝试了风筝 这两者似乎都没有 pytorch 的自动完成功能 这些工具可以吗 如果没有 有人可以推荐一个可以的编辑器吗 谢谢你 使用Pycharmhttps www jetbrains co
  • 预期设备类型为 cuda 的对象,但在 Pytorch 中获得了设备类型 cpu

    我有以下计算损失函数的代码 class MSE loss nn Module metric L1 L2 norms or cosine similarity mode training or evaluation mode def init
  • 保存具有自定义前向功能的 Bert 模型并将其置于 Huggingface 上

    我创建了自己的 BertClassifier 模型 从预训练开始 然后添加由不同层组成的我自己的分类头 微调后 我想使用 model save pretrained 保存模型 但是当我打印它并从预训练上传时 我看不到我的分类器头 代码如下
  • 样本()和r样本()有什么区别?

    当我从 PyTorch 中的发行版中采样时 两者sample and rsample似乎给出了类似的结果 import torch seaborn as sns x torch distributions Normal torch tens
  • PyTorch:如何批量进行推理(并行推理)

    如何在PyTorch中批量进行推理 如何并行进行推理以加快这部分代码的速度 我从进行推理的标准方法开始 with torch no grad for inputs labels in dataloader predict inputs in
  • BertForSequenceClassification 是否在 CLS 向量上进行分类?

    我正在使用抱脸变压器 https huggingface co transformers index html使用 PyTorch 打包和 BERT 我正在尝试进行 4 向情感分类并正在使用BertFor序列分类 https hugging
  • 如何在不安装pytorch的情况下使用pytorch预训练模型?

    我只想在 pytorch 中使用预先训练的模型 而不安装整个包 我可以从 pytorch 复制模型模块吗 恐怕你不能这样做 为了运行模型 你不仅需要经过训练的权重 pth tar 文件 还需要网络的 结构 即层 它们如何相互连接等 该网络结

随机推荐

  • java入门四:数组

    1 数组概述 数组是最简单的数据结构 是相同类型数据的有序集合 数组描述的是相同类型的若干个数据 按照一定的先后次序排列组合而成的 数组中 每一个数据称作一个数组元素 每个数组元素可以通过一个下标来访问他们 2 数组的声明创建 首先必须声明
  • 分享解决jar包冲突问题的方法:(看了这个你就能解决所有包冲突问题!)

    1 问题描述 maven eclipse环境 1 1 昨晚发布这个新功能 接入notify消息中间件 预发失败 报 nested exception is java lang NoSuchMethodError org springfram
  • Go函数--匿名函数与闭包

    0 匿名函数概念 Go语言提供两种函数 有名函数和匿名函数 所谓匿名函数就是没有函数名的函数 匿名函数没有函数名 只有函数体 它和有名函数的最大区别是 我们可以在函数内部定义匿名函数 形成类似嵌套的效果 匿名函数常用于实现回调函数 闭包等
  • is服务器虚拟目录,Tomcat虚拟目录配置

    1 编辑server文件 x tomcat conf server xml 2 只要在server xml文件中加入如下代码即可 注意 在server xml中 此语句 unpackWARs true autoDeploy true xml
  • 数据库:sql 递归

    mysql 自关联表 以下为向下递归以及向上递归样例 1 递归查询前期准备 如果你的表已经存在 可忽略此步 建表 CREATE TABLE wq areainfo id int 11 NOT null AUTO INCREMENT leve
  • 服务器A拷贝文件到服务器B

    命令格式如下 scp 要拷贝的文件名 服务器B的用户名 IP 服务器B要存放的路径 拷贝文件 如 scp install log root 192 168 33 111 home 或 scp install log 192 168 33 1
  • Docker是什么?

    一 概述 Docker是一个用于开发 交付和运行应用程序的开放平台 Docker使您能够将应用程序与基础架构分离 从而实现快速交付软件 借助Docker 您可以以与管理应用程序相同的方式来管理基础架构 通过利用Docker快速交付 测试和部
  • python生成微信个性签名的词云图

    需要用到的库 itchat jieba numpy wordcloud import itchat import re import jieba import matplotlib pyplot as plt import PIL Imag
  • 企业运维

    欢迎关注 全栈工程师修炼指南 公众号 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 专注 企业运维实践 网络安全 系统运维 应用开发 物联网实战 全栈文章 等知识分享 花开堪折直须折 莫待无花空折枝 作者主页 https w
  • QT控件之(QLabel)中加载了图片想清除掉

    这个时候直接在你加载图片的那个label中使用如下代码 清除label中加载过来的图片 label clear qt学习推荐 百度云盘 链接 https pan baidu com s 11b634VvKMIsGdahyBLpZ3Q 提取码
  • 远程调试Android/IOS设备/微信网页方法汇总

    以下汇总现在可远程调试手机网页的几个方法 基本上官方都有详细的说明文档 可移步至相关网站查看 这里就不赘述使用 操作方法了 微信web开发者工具 PC客户端 官方说明文档 支持Windows和Mac系统 支持调试Android和IOS设备
  • 原生 fetch 请求 fetch和ajax的区别

    比如请求一个json文件 async function 请求 let res fetch data1 json 解析内容 let data await res json 获取到json 文件 console log data 比如请求一个图
  • NG4+NG-ZORRO搭建项目

    一 安装Nodejs Angular CLI 安装nodejs node官网下载安装即可 安装完成后查看版本信息 npm v npm install g angular cli 下载Angular CLI 查看Angular CLI的安装结
  • 【正点原子STM32连载】第四十二章 FLASH模拟EEPROM实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1 实验平台 正点原子MiniPro H750开发板 2 平台购买地址 https detail tmall com item htm id 677017430560 3 全套实验源码 手册 视频下载地址 http www openedv
  • 使用Encoder-Decoder模型自动生成对联的思路

    版权声明 可以任意转载 转载时请标明文章原始出处和作者信息 author 张俊林 在我看到第一篇Encoder Decoder模型的论文的时候 我就觉得用这个来作对联自动生成是再合适不过的了 做诗词应该也是比较适合的 但是相对诗词 用它来做
  • Linux wget下载指定目录及重命名

    Linux系统wget下载指定目录及重命名 假设目录为 happy page 假设下载网址为 http www baidu com 假设下载文件的原始文件名为 baidu html 1 指定下载目录 wget P happy page ht
  • PCL-获取点云体素中的所有点的索引的方法

    使用 octree 将点云体素化之后 获取体素中所有点的方法 即OctreeContainerBase中的三个方法的介绍 getPointIndex getPointIndicesVector getPointIndices 这三个方法都是
  • R语言tidyr包的详解

    tidyr用于数据处理 可以实现数据长格式和宽格式之间的相互转换 这里所指的长格式数据就是一个观测对象由多行组成 而宽数据格式则是一个观测仅由一行组成 除此之外 tidyr还可以对数据进行拆分和合并 同时也能够对缺失值进行简单的处理 tid
  • oracle(内置函数)

    1 转换函数 to char to number to date 例子 to number 转成数值型 select to number 22 23 from dual 2 to char 转成字符型 select to char 22 哈
  • Criss-Cross Attention for Semantic Segmentation论文及代码分析

    先附上论文及代码 该工作于2019年发表于ICCV会议 1 Introduction 由于固定的几何结构 传统的FCN受限于局部的感受野 只能提供短程的上下文信息 这对于提升分割任务的精度起到相反的影响 为了弥补FCN的缺陷 ASPP和PP