SPAN: Spatial Pyramid Attention Network for Image Manipulation Localization

SPAN: Spatial Pyramid Attention Network for Image Manipulation
Localization

  • University of Southern California, Los Angeles, USA
  • Indian Institute of Technology, Bombay, Mumbai, India
  • Facebook AI, Menlo Park, USA

ECCV 2020

在这里插入图片描述

代码链接

https://github.com/ZhiHanZ/IRIS0-SPAN/blob/d8e4241f151ef2f40eacbb970fe5e3f531c6a4b4/README.md

不过这个作者提供的权重是多gpu的,准确来说是2个GPU,没有这个资源用他这个训练好的模型。受不了。这个作者也是不厚道。使用的tensorflow的框架。
这个代码整了两天没跑起来。生气


这个作者的不厚道有2点

  • 至少配备2个GPU才能够使用这个模型。给multi gpu训练的模型是一种很糟糕的行为,根本就没打算让大多数人测试。
  • 没有提供requirement.txt.

网络框架

在这里插入图片描述
这个 pre-trained feature extracion 使用的是mantra net 的预训练模型,训练时候冻结。

后接5个self attention block.

这个self attention有些玄妙。

self attention block

在这里插入图片描述
不知道有没有理解错。
只需要理解成特殊的卷积层即可。
输入输出的矩阵大小没有变化。

中间层把D通道转为了9D通道(假设了n=1,为8邻域。)
9D为自身以及周围的8个点。为原本的通道数*9.

这个玄妙的地方大概在于 能够把一个像素点为中心的周围(2n+1)*(2n+1)邻域之内的所有像素的信息全部接收到一个对应点。

本来这东西是NLP领域提出的,不使用RNN,就得到时间顺序信息。图像和语言还是有些差别的。语言中的语言顺序和图像的邻域或许是等价的吧。

这是抄的这个作者的tensorflow 代码

基本和此图的结果相同,可能卷积层的数量稍微有点出入。
在这里插入图片描述

self attention 代码

from keras.engine.topology import Layer
import tensorflow as tf
import keras
from matplotlib.image import imread, imsave
from keras import backend as K


class PixelAttention(Layer):
    def __init__(self, kernel_range=[3, 3], shift=1, ff_kernel=[3, 3], useBN=False, useRes=False, **kwargs):
        self.kernel_range = kernel_range  # should be a list
        self.shift = shift
        self.ff_kernel = ff_kernel
        self.useBN = useBN
        self.useRes = useRes
        super(PixelAttention, self).__init__(**kwargs)

    def build(self, input_shape):
        D = input_shape[-1]
        n_p = self.kernel_range[0] * self.kernel_range[1]
        self.K_P = self.add_weight(name='K_P', shape=(1, 1, D, D * n_p),
                                   initializer='glorot_uniform',
                                   trainable=True)
        self.V_P = self.add_weight(name='V_P', shape=(1, 1, D, D * n_p),
                                   initializer='glorot_uniform',
                                   trainable=True)
        self.Q_P = self.add_weight(name='Q_P', shape=(1, 1, D, D),
                                   initializer='glorot_uniform',
                                   trainable=True)

        self.ff1_kernel = self.add_weight(name='ff1_kernel',
                                          shape=(3, 3, D, D),
                                          initializer='glorot_uniform', trainable=True)
        self.ff1_bais = self.add_weight(name='ff1_bias',
                                        shape=(D,), initializer='glorot_uniform'
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值