深度学习non-local:Non-local Neural Network,PANet Pyramid Attention Network for Image Restoration

NON-LOCAL

之前介绍kernel prediction net的时候,会为每一个像素生成一个 filter来处理图像, 这样每个像素都有自定义的filter, 但是这个filter只是处理邻域像素,对于距离更远的区域没办法融合进来处理, 除非 filter很大,比如作用于整张图像。

non-local概念在图像降噪领域有比较广泛的应用,传统算法有。深度学习模型也可以借鉴类似的概念,引入和设计相关non-local模块。

non-local和self attention有一定的相关性,归根到底都是 解决不同区域的相关性以及如何建立联系。

1.全连接层

图像尺寸 h,w,c 。展开为1d
(h x w x c) matmul (h x w x c, h x w x c) 得到结果维度:(h x w x c)。 结果中的每一个数值利用了所有像素的信息。

(h x w x c, h x w x c) 是weight size, h,w 图像宽度和高度一般不小, 参数量很大,计算量也很大。

2.Non-local Neural Network | CVPR2018

https://juejin.cn/post/6914526262992044046 介绍的很好。

  1. 一个 h,w,c 分别经过1x1的卷积 为得到2个featire map: theta(h,w,c1) 和phi(h,w,c1) , 得到一个特征g(hw,c2)
  2. theta(hw,c1) matmul phi(c1,hw) 得到相似度结果 然后softmax 得到p: hw x hw
  3. p(hw,hw)与g(hw, c2) matmul 得到 h,w,c2 再经过 1x1卷积 恢复到尺寸 h,w,c

该计算量和参数量与上面全连接层比较可以看出小很多。但是比一般卷积计算量大很多。

一般卷积比如kernel size=3,输入通道为1, 输出通道数目为c
则计算量为 (hw,9) matmul (9,c) 得到 (hw, c),比较小。
在这里插入图片描述

把1,1卷积变成3,3,等价于block match,可以看 学到的3,3filter是不是类似于boxfilter
更多详细解释:https://cloud.tencent.com/developer/article/1582047

3. PANet Pyramid Attention Network for Image Restoration

https://blog.youkuaiyun.com/weixin_42096202/article/details/106240801
特点:

  1. 是像素块的匹配
  2. 利用了多层金字塔

有个问题, 利用了hw 个 3,3 filter, 计算量有点大吧。 假如图像h,w=400,400, 则一共 160000个 3,3,c_in filter. 输出通道是16万。。。。巨大计算量
log:
index scale , wishape raw_w i shape: 0 torch.Size([1, 2500, 4, 3, 3]) torch.Size([1, 2500, 8, 3, 3])
xi, wi_normed shape: torch.Size([1, 4, 50, 50]) torch.Size([2500, 4, 3, 3])
yi , raw_wi shape: torch.Size([1, 2500, 50, 50]) torch.Size([2500, 8, 3, 3])
可以改进的,可以减少计算量,而且特点1和2都保留。 首先进行boxfilter depthwise, 然后利用2的方法

https://github.com/SHI-Labs/Pyramid-Attention-Networks/tree/master

import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision import transforms
from torchvision import utils as vutils
import common
from utils.tools import extract_image_patches,\
    reduce_mean, reduce_sum, same_padding

class PyramidAttention(nn.Module):
    def __init__(self, level=5, res_scale=1, channel=64, reduction=2, ksize=3, stride=1, softmax_scale=10, average=True, conv=common.default_conv):
        super(PyramidAttention, self).__init__()
        self.ksize = ksize
        self.stride = stride
        self.res_scale = res_scale
        self.softmax_scale = softmax_scale
        self.scale = [1-i/10 for i in range(level)]
        self.average = average
        escape_NaN = torch.FloatTensor([1e-4])
        self.register_buffer('escape_NaN', escape_NaN)
        self.conv_match_L_base = common.BasicBlock(conv,channel,channel//reduction, 1, bn=False, act=nn.PReLU())
        self.conv_match = common.BasicBlock(conv,channel, channel//reduction, 1, bn=False, act=nn.PReLU())
        self.conv_assembly = common.BasicBlock(conv,channel, channel,1,bn=False, act=nn.PReLU())

    def forward(self, input):
        res = input
        #theta
        match_base = self.conv_match_L_base(input)
        shape_base = list(res.size())
        input_groups = torch.split(match_base,1,dim=0)
        # patch size for matching 
        kernel = self.ksize
        # raw_w is for reconstruction
        raw_w = []
        # w is for matching
        w =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值