图像超分辨率之FSRCNN(Accelerating the Super-Resolution Convolutional Neural Network)

ECCV2016
论文下载地址:Accelerating the Super-Resolution Convolutional Neural Network
代码:参考了这位同学https://blog.csdn.net/gwplovekimi/article/details/83413171

0.摘要

FSRCNN直接采用低分辨的图像作为输入,不同于SRCNN需要先对低分辨率的图像进行双三次插值然后作为输入;
FSRCNN在网络的最后采用反卷积层实现上采样;
FSRCNN选择更小尺寸的滤波器和更深的网络结构。

1.结构

在这里插入图片描述
特征提取:一次用5*5卷积,因为现在输入的图片尺寸变小了。
压缩:采用小的感受野1*1节约计算能力,同时输出采用s<d方式减少计算量。
非线性映射:感受野大,表现的更好,这里采用3、*3.采用m个非线性单元。
拓展:为了得到HR图像,那么就要进行增加扩展层,类似于压缩层的逆过程。
反卷积层:可以看成卷积的逆过程。对于卷积,如果步长为k,那么输出大小为1/k。因此反卷积另步长为k = n,那么分辨率提升n倍。因此这里卷积核取9*9。
在这里插入图片描述

在这里插入图片描述

激活函数:采用PReLU。整个架构如下

在这里插入图片描述


#FSRCNN
class FSRCNN(nn.Module):
    def __init__(self, in_nc, out_nc, nf, nb, upscale=4, norm_type='batch', act_type='relu', \
            mode='NAC', res_scale=1, upsample_mode='upconv'):##play attention the upscales
        super(FSRCNN,self).__init__()
        #Feature extractionn
        self.conv1=nn.Conv2d(in_channels=in_nc,out_channels=nf,kernel_size=5,stride=1,padding=2)#nf=56.add padding ,make the data alignment
        self.prelu1=nn.PReLU()
 
        #Shrinking
        self.conv2=nn.Conv2d(in_channels=nf,out_channels=12,kernel_size=1,stride=1,padding=0)
        self.prelu2 = nn.PReLU()
 
        # Non-linear Mapping
        self.conv3=nn.Conv2d(in_channels=12,out_channels=12,kernel_size=3,stride=1,padding=1)
        self.prelu3 = nn.PReLU()
        self.conv4=nn.Conv2d(in_channels=12,out_channels=12,kernel_size=3,stride=1,padding=1)
        self.prelu4 = nn.PReLU()
        self.conv5=nn.Conv2d(in_channels=12,out_channels=12,kernel_size=3,stride=1,padding=1)
        self.prelu5 = nn.PReLU()
        self.conv6=nn.Conv2d(in_channels=12,out_channels=12,kernel_size=3,stride=1,padding=1)
        self.prelu6 = nn.PReLU()
 
        # Expanding
        self.conv7=nn.Conv2d(in_channels=12,out_channels=nf,kernel_size=1,stride=1,padding=0)
        self.prelu7 = nn.PReLU()
 
        # Deconvolution
        self.last_part= nn.ConvTranspose2d(in_channels=nf,out_channels=in_nc,kernel_size=9,stride=upscale, padding=4, output_padding=3)
 
 
    def forward(self, x):#
         out = self.prelu1(self.conv1(x))
         out = self.prelu2(self.conv2(out))
         out = self.prelu3(self.conv3(out))
         out = self.prelu4(self.conv4(out))
         out = self.prelu5(self.conv5(out))
         out = self.prelu6(self.conv6(out))
         out = self.prelu7(self.conv7(out))
         out = self.last_part(out)
 
         return out

2.实验结果

在这里插入图片描述
在这里插入图片描述
这篇论文确实相较于srcnn逊色很多,本以为会是fast rcnn那种又快又准,结果只快不准

3.个人实验

请添加图片描述
FSRCNN:0.25027109384536744 seconds, 3.9956671968591797FPS
origin: 0.2119568991661072 seconds, 4.7179403168014655FPS
915: 0.38688172578811647 seconds, 2.584769280489795FPS
935: 0.3359390616416931 seconds, 2.9767303483945042FPS

相比于srcnn快了很多,但是精度却下降了,是因为网络过深导致的吗?
我感觉可以把fsrcnn中的后上采样,先提纯的思想应用到srcnn935之中,然后再尝试拆分大卷积,再插入残差块。给我的思路就是后上采样的手段确实可以极大的提高速度,如何不降低精度是个问题。

        # 13,13,512   -> 13,13,256 ->26,26,256
        x1_in = self.last_layer1_patch(out0_branch)#通道数不变
        x1_in = self.last_layer1_noline(x1_in)#通道下降
        x1_in = self.last_layer1_recon(x1_in) #通道数不变
        x1_in = self.last_layer1_decon(x1_in)#再上采样

反卷积会来带了棋盘格现象:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值