Advertisement

ESPCN MNIST 数据集超分辨率重建

阅读量:

https://my.oschina.net/ahaoboy/blog/1927041

上一篇: gan-cls 具有匹配感知的判别器

下一篇: [ ESPCN 在 flowers 数据集中完成了两倍放大的高分辨率重建 ]

超分辨(SR)技术主要涉及从获取到的低质量图像中恢复出高质量图像的关键方法。该领域主要分为两种主要类型:一种是基于多帧低质量图像恢复高清晰度图景的方法;另一种则是通过处理单一低质量图片来实现细节还原的技术。其中深度学习驱动的超分辨(SR)方法因其在单帧小尺寸图片重构方面的显著优势而备受关注。其核心是基于深度学习模型进行单帧低分辨率到高分辨率映射关系的学习机制

SISR single image super resolution

对于一个低分辨率图像而言,可能存在多个对应的高分辨率图像.为了使逆向生成的图像更接近真实图像,则必须让模型在特定条件下进行可逆训练.这种特定条件即基于现有低分辨率像素的颜色信息及其位置信息.为了使模型能够更好地学习并有效利用这些信息,基于深度学习的方法SR(SR代表Super-Resolution)通过神经网络直接优化从低分辨率到高分辨率图像的损失函数loss进行端到端训练,从而实现超分辨率重建功能.

该实时图像超分辨率技术以卷积神经网络为基础进行设计与实现,并以其独特的亚像素卷积层为核心组件进行创新性构建。其工作原理是首先在输入的低分辨率图像上执行卷积操作并生成多个特征图;随后通过这一过程生成多个特征图并保证其输出结果中的总像素数与原始高分辨率图保持一致;最后将其余步骤整合完成目标图像生成任务

仅在最后一层处理图像从低分辨率至高分辨率的空间尺寸转换,并通过这种方式实现所有 preceding 的卷积操作均基于低分辨率图像执行以获得更高的运算效率

图像变换函数

输入格式【batch,height,width,channels】

复制代码
 @tf_export('image.resize_images')

    
 def resize_images(images,
    
               size,
    
               method=ResizeMethod.BILINEAR,
    
               align_corners=False):
    
  
    
  
    
 class ResizeMethod(object):
    
   BILINEAR = 0  # 双线性插值
    
   NEAREST_NEIGHBOR = 1  # 临近值插值
    
   BICUBIC = 2 # 双立方插值
    
   AREA = 3 # 面积插值
    
    
    
    
    代码解释

先将2828 转为1414,长宽缩小两倍

分别使用不同的插值方法还原图片,与ESPCn 效果对比

将多个图像整合为一个综合图像进行处理。其中第一个参数接收原始数据信息作为基础图层。第二个参数则用于指定后续处理时所使用的块尺寸设定。当输入数值2时,则表示采用2×2的块尺寸进行拼接运算。在这一过程中, 深度参数决定了生成图像中的通道数量, 从而影响最终输出结果的质量与细节层次感. 具体来说, 将每个通道对应的像素信息填入预先定义大小的块中进行计算处理, 最终得到融合后的统一图像输出

复制代码
 @tf_export("depth_to_space")

    
 def depth_to_space(input, block_size, name=None, data_format="NHWC"):  # pylint: disable=redefined-builtin
    
   return gen_array_ops.depth_to_space(input, block_size, data_format, name=name)
    
    
    
    
    代码解释

图像shape变化

复制代码
 x_small = tf.image.resize_bicubic(img, (14, 14))  # 缩小2倍

    
 print(x_small.shape)  # (?, 14, 14, 1)
    
  
    
 # espcn
    
 net = slim.conv2d(x_small, 64, 5)
    
 print(net.shape)  # (?, 14, 14, 64)
    
 net = slim.conv2d(net, 32, 3)
    
 print(net.shape)  # (?, 14, 14, 32)
    
 net = slim.conv2d(net, 4, 3)
    
 print(net.shape)  # (?, 14, 14, 4)
    
 net = tf.depth_to_space(net, 2)
    
 print("net.shape", net.shape)  # (?, 28, 28, 1)
    
    
    
    
    代码解释

可以看到最后一行清晰度较高

b73030c4f8a71d71e32e49e9395a5cef3c9.jpg

全部评论 (0)

还没有任何评论哟~