1 ESPCN

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

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

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

如下图所示,每四个红色点围成的矩形区域为实际原件上的像素点,黑色点为亚像素点:

亚像素语义分割 亚像素原理_亚像素语义分割


根据相邻两像素之间插值情况的不同,可以调整亚像素的精度,例如四分之一,就是将每个像素从横向和纵向上当做四个像素点。也就是上面图里的红色点之间有三个黑色点。这样通过亚像素插值的方法可以实现从小矩形到大矩形的映射,从而提高分辨率。ESPCN网络结构图:

亚像素语义分割 亚像素原理_人工智能_02


如图所示,此网络的关键在于Sub-pixel convoluntion layer(亚像素卷积层)。在原文中,作者将网络模型定义为3层,前两层为普通卷积,最后的亚像素卷积层则包括两个部分,卷积+像素排列。

即通过三个卷积层,得到与输入图像尺寸一致、通道数为 亚像素语义分割 亚像素原理_深度学习_03 的特征图像。再将特征图像的每个像素的 亚像素语义分割 亚像素原理_深度学习_03 个通道重新排列成一个 亚像素语义分割 亚像素原理_计算机视觉_05 的区域,对应高分辨图像中一个 亚像素语义分割 亚像素原理_深度学习_06 大小的子块,从而大小为 亚像素语义分割 亚像素原理_深度学习_07 的特征图像被重新排列成 亚像素语义分割 亚像素原理_计算机视觉_08

卷积参数从SRCNN中得到启发。
第一层:kernelSize = 亚像素语义分割 亚像素原理_亚像素语义分割_09
第二层:kernelSize = 亚像素语义分割 亚像素原理_亚像素语义分割_10
第三层:kernelSize = 亚像素语义分割 亚像素原理_亚像素语义分割_10
激活函数选择的是 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