图像超分辨率之ESPCN(Efficient Sub-Pixel Convolutional Neural Network)

2023-12-18 15:55:40

cvpr2016
论文下载:Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network
代码:https://github.com/leftthomas/ESPCN

1.结构

在这里插入图片描述ESPCN的核心概念是亚像素卷积层(sub-pixel convolutional layer)。网络的输入是原始低分辨率图像,通过三个卷积层以后,得到通道数为放大倍数的立方的与输入图像大小一样的特征图像。再将特征图像每个像素的 个通道重新排列成一个 的区域,对应高分辨率图像中一个 大小的子块,从而大小为 的特征图像被重新排列成 的高分辨率图像。我理解的亚像素卷积层包含两个过程,一个普通的卷积层和后面的排列像素的步骤。就是说,最后一层卷积层输出的特征个数需要设置成固定值,即放大倍数r的平方,这样总的像素个数就与要得到的高分辨率图像一致,将像素进行重新排列就能得到高分辨率图.
ESPCN的核心概念是亚像素卷积层(sub-pixel convolutional layer)。如上图所示,网络的输入是原始低分辨率图像,通过两个卷积层以后,得到的特征图像大小与输入图像一样,但是特征通道为 r 2 r^2 r2(r是图像的目标放大倍数)。将每个像素的 r 2 r^2 r2个通道重新排列成一个 r × r r×r r×r的区域,对应于高分辨率图像中的一个 r × r r×r r×r大小的子块,从而大小为 r 2 × H × W r^2×H×W r2×H×W的特征图像被重新排列成 1 × r H × r W 1×rH×rW 1×rH×rW大小的高分辨率图像。这个变换虽然被称作sub-pixel convolution, 但实际上并没有卷积操作。

也是一种后上采样的方法,速度十分的快。
在这里插入图片描述
看代码更清楚一些:

class espc(nn.Module):
    def __init__(self, upscale_factor,in_channel):
        super(espc, self).__init__()

        self.conv1 = conv2d(1*in_channel, 1*in_channel, 5, 1, pad=2)
        self.conv2 = conv2d(1*in_channel, 1*in_channel, 3, 1, pad=1)
        self.conv3 = conv2d(1*in_channel, 1*in_channel*(upscale_factor ** 2), 3, 1, pad=1)
        self.pixel_shuffle = nn.PixelShuffle(upscale_factor)

    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)        
        x = F.sigmoid(self.pixel_shuffle(x))
        return x

2.实验

voc+coco预训练+yolov3+loss3.874+915但是已经停止收敛了:
请添加图片描述

请添加图片描述
srcnn915依旧有着收敛的趋势:
请添加图片描述

请添加图片描述
935&EPOCH58已经收敛了:
请添加图片描述
ESPCN:
请添加图片描述

文章来源:https://blog.csdn.net/qq_41950533/article/details/121419174
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。