Feature Pyramid Transformer FPN和Transformer的有效结合

前言

Feature Pyramid Transformer出自于ECCV2020,本篇文章主要是把Transformer的主要架构self-attention进行了三种形式的演变( Self-Transformer,Grounding Transformer,Rendering Transformer),加入到了FPN的结构当中,起名叫FPT。

在这里插入图片描述
其主要架构如上图,本文中最主要的是它所提出的三个结构,Self-Transformer,Grounding Transformer,Rendering Transformer。以下简称ST,GT,RT。以上图b为例,其中ST,就是自己和自己进行self-attention,RT就是高位特征a,b之间的操作,GT,就是低维特征c,b之间的操作,通过这张图我们知道除了ST,a只有和b之间的GT。而c只有和b之间的RT。

ST

ST的公式如下所示在这里插入图片描述
与self-attention的公式类似多了一个N,N主要应用在Weight的Fmos的这个公式中,文中引入了
在这里插入图片描述

改进了softmax,其他的和self-attention没有什么区别,具体实现方法:

def ST(x,H,W,C,N): 
    x=tf.layers.conv2d(x,C*3,1,strides=1, padding='same')
    Q,K,V=tf.split(x, 3, axis=3)
    Q=tf.reshape(Q,[-1,H*W,C])
    K=tf.reshape(K,[-1,H*W,C])
    V=tf.reshape(V,[-1,H*W,C])
    K_trans=tf.transpose(K,[0,2,1])
    result_all=tf.Variable(tf.zeros([1,H*W,H*W]))
    for a in range(N):
        WT=tf.Variable(tf.random_normal([H*W]))
        k_mean,K_var=tf.nn.moments(K[:,:,int(C/N)*(a):int(C/N)*(a+1)],2)
        result=tf.matmul(Q[:,:,int(C/N)*(a):int(C/N)*(a+1)],K_trans[:,int(C/N)*(a):int(C/N)*(a+1),:])        
        result_all=result_all+tf.nn.softmax(k_mean*WT)*tf.nn.softmax(result)

    V=tf.matmul(result_all,V)
    V=tf.reshape(V,[-1,H,W,C])
    print(V)

N为个数,我们这里采用了for循环叠加的方案,完成的复现。

GT

在这里插入图片描述
GT主要采用的是欧式距离的方法,计算高维特征和低维特征,具体代码如下:

def GT(x,y,BZ,H,W,C,Expand,N): 
    x=tf.layers.conv2d_transpose(x,C*2,1,strides=Expand, padding='same')
    K=tf.layers.conv2d(y,C,1,strides=1, padding='same')
    Q,V=tf.split(x, 2, axis=3)
    Q=tf.reshape(Q,[BZ,H*W,C])
    K=tf.reshape(K,[BZ,H*W,C])
    V=tf.reshape(V,[BZ,H*W,C])
    print(Q,K,V)
    result_all=tf.zeros([BZ,H*W,1])
    for a in range(N):
        WT=tf.Variable(tf.random_normal([H*W]))
        k_mean,K_var=tf.nn.moments(K[:,:,int(C/N)*(a):int(C/N)*(a+1)],2)
        result=-tf.square(Q[:,:,int(C/N)*(a):int(C/N)*(a+1)]-K[:,:,int(C/N)*(a):int(C/N)*(a+1)])   
        result=tf.nn.softmax(tf.reshape(k_mean*WT,[-1,H*W,1]))*tf.nn.softmax(result)
        print(result)
        result_all=tf.concat([result_all,result],-1)
        print(result_all)
    V=result_all[:,:,1:]*V
    V=tf.reshape(V,[-1,H,W,C])
    print(V)

其中x代表高维特征,y代表低维特征。

RT

RT公式如下,Q是图一中b的,K,V是c的
在这里插入图片描述

def RT(x,y,H,W,H1,W1,C,narrow): #x:high-level feature map y:low-level feature map
    y=tf.layers.conv2d(y,C*2,1,strides=1, padding='same')
    K,V =tf.split(y, 2, axis=3)
    print(V)
    Q=tf.layers.conv2d(x,C,1,strides=1, padding='same')
    Q=tf.reshape(Q,[-1,H*W,C])
    K=tf.reshape(K,[-1,H1*W1,C])
    #
    w=tf.keras.layers.GlobalAvgPool1D()(K)
    Qatt=Q*tf.reshape(w,[-1,1,C])
    Vdow=tf.layers.conv2d(V,C,3,strides=narrow, padding='same')
    Qatt=tf.reshape(Qatt,[-1,H,W,C])
    Xc=tf.layers.conv2d(Qatt,C,3,strides=1, padding='same')+Vdow
    print(Xc)
  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Swin Transformer是一种基于Transformer架构的图像分类模型,而FPNFeature Pyramid Network)是一种用于目标检测和语义分割任务的特征金字塔网络。它们可以结合使用来提高图像分类和目标检测的性能。 在Swin TransformerFPN的代码配合中,一般的做法是将Swin Transformer作为主干网络提取图像特征,然后将这些特征传递给FPN进行进一步处理。下面是一个示例代码: ```python import torch import torch.nn as nn import torchvision.models as models # 加载Swin Transformer作为主干网络 backbone = models.swin_transformer.SwinTransformer() # 加载FPN fpn = models.detection.backbone_utils.FPN() # 定义整个模型 class SwinFPN(nn.Module): def __init__(self, backbone, fpn): super(SwinFPN, self).__init__() self.backbone = backbone self.fpn = fpn def forward(self, x): # 提取Swin Transformer的特征 features = self.backbone(x) # 将特征传递给FPN进行处理 fpn_features = self.fpn(features) return fpn_features # 创建SwinFPN模型实例 model = SwinFPN(backbone, fpn) # 输入示例图像 input_image = torch.randn(1, 3, 224, 224) # 前向传播 output_features = model(input_image) ``` 这段代码中,我们首先加载了Swin TransformerFPN的模型,然后定义了一个新的模型`SwinFPN`,其中将Swin Transformer作为主干网络,FPN作为进一步处理特征的网络。在前向传播过程中,我们将输入图像传递给`SwinFPN`模型,得到输出的特征。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值