ESPCN神经网络
ESPCN:加入亚像素卷积层的神经网络
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
更多推荐
所有评论(0)