1 ESPCN

ESCPN(Efficient Sub-Pixel, 高效亚像素)同样可直接对低分辨率图像进行处理。

首先介绍下亚像素的概念:

面阵摄像机的成像面以像素为最小单位。在相机成像的过程中,获得的图像数据是将图像进行了离散化处理。例如两个感官元件上的像素之间有4.5um的间距,宏观上它们是连在一起的,微观上它们之间还有无数更小的东西存在,这个更小的东西就称之为“亚像素”。实际上,亚像素应该是存在的,只是缺少更细微的传感器把它检测出来,只能通过软件将起近似计算出来。

如下图所示,每四个红色点围成的矩形区域为实际原件上的像素点,黑色点为亚像素点:
在这里插入图片描述
根据相邻两像素之间插值情况的不同,可以调整亚像素的精度,例如四分之一,就是将每个像素从横向和纵向上当做四个像素点。也就是上面图里的红色点之间有三个黑色点。这样通过亚像素插值的方法可以实现从小矩形到大矩形的映射,从而提高分辨率。

ESPCN网络结构图:
在这里插入图片描述
如图所示,此网络的关键在于Sub-pixel convoluntion layer(亚像素卷积层)。在原文中,作者将网络模型定义为3层,前两层为普通卷积,最后的亚像素卷积层则包括两个部分,卷积+像素排列。
即通过三个卷积层,得到与输入图像尺寸一致、通道数为 r 2 r^2 r2 的特征图像。再将特征图像的每个像素的 r 2 r^2 r2 个通道重新排列成一个 r × r r \times r r×r 的区域,对应高分辨图像中一个 r × r r\times r r×r 大小的子块,从而大小为 H × W × r 2 H\times W \times r^2 H×W×r2 的特征图像被重新排列成 r H × r W × 1 rH \times rW \times1 rH×rW×1 的高分辨率图像。

卷积参数从SRCNN中得到启发。
第一层:kernelSize = 5 × 5 5\times5 5×5
第二层:kernelSize = 3 × 3 3\times3 3×3
第三层:kernelSize = 3 × 3 3\times3 3×3
激活函数选择的是 TanH,损失函数同样为MSE。

2 code

ESPCN网络模型:

import torch.nn as nn
import torch


class ESPCN(nn.Module):
    def __init__(self, inputChannel=1, outputChannel=1, upscaleFactor=2):
        super(ESPCN, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(inputChannel, 64, kernel_size=5, padding=5 // 2),
            nn.Tanh(),
            nn.Conv2d(64, 32, kernel_size=3, padding=3 // 2),
            nn.Tanh(),
            nn.Conv2d(32, upscaleFactor ** 2, kernel_size=3, padding=3 // 2),
            nn.PixelShuffle(upscaleFactor)
        )

    def forward(self, x):
        out = self.conv(x)
        return out


# Test


net = ESPCN()
a = torch.randn(1, 1, 6, 6)

print(net(a).shape)  # (1,1,12,12)


https://zhuanlan.zhihu.com/p/31664818
https://arxiv.org/abs/1609.05158
https://blog.csdn.net/xu_fu_yong/article/details/96967977

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐