cvpr2016
论文下载:Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network
代码:https://github.com/leftthomas/ESPCN
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
voc+coco预训练+yolov3+loss3.874+915但是已经停止收敛了:
srcnn915依旧有着收敛的趋势:
935&EPOCH58已经收敛了:
ESPCN: