1 ESPCN
ESCPN(Efficient Sub-Pixel, 高效亚像素)同样可直接对低分辨率图像进行处理。
首先介绍下亚像素的概念:
面阵摄像机的成像面以像素为最小单位。在相机成像的过程中,获得的图像数据是将图像进行了离散化处理。例如两个感官元件上的像素之间有4.5um的间距,宏观上它们是连在一起的,微观上它们之间还有无数更小的东西存在,这个更小的东西就称之为“亚像素”。实际上,亚像素应该是存在的,只是缺少更细微的传感器把它检测出来,只能通过软件将起近似计算出来。
如下图所示,每四个红色点围成的矩形区域为实际原件上的像素点,黑色点为亚像素点:
根据相邻两像素之间插值情况的不同,可以调整亚像素的精度,例如四分之一,就是将每个像素从横向和纵向上当做四个像素点。也就是上面图里的红色点之间有三个黑色点。这样通过亚像素插值的方法可以实现从小矩形到大矩形的映射,从而提高分辨率。ESPCN网络结构图:
如图所示,此网络的关键在于Sub-pixel convoluntion layer(亚像素卷积层)。在原文中,作者将网络模型定义为3层,前两层为普通卷积,最后的亚像素卷积层则包括两个部分,卷积+像素排列。
即通过三个卷积层,得到与输入图像尺寸一致、通道数为 的特征图像。再将特征图像的每个像素的 个通道重新排列成一个 的区域,对应高分辨图像中一个 大小的子块,从而大小为 的特征图像被重新排列成
卷积参数从SRCNN中得到启发。
第一层:kernelSize =
第二层:kernelSize =
第三层:kernelSize =
激活函数选择的是 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