机器之心编译项目作者:Francesco Cardinale等

没钱买华为P30?这个图像超分辨率项目帮你「拍」出高清照片

华为刚刚发布的 P30「望远镜」手机能在几十米外拍到埃菲尔上的人名,确实令人佩服,但其售价也是令人望而生畏。那么,不买华为手机、高级单反就拍不到充满细节的高清照片了吗?

相机不够算法凑,拥有超级拍照能力的手机也离不开算法的加持。本文介绍的图像超分辨率项目可以帮你补齐相机镜头的短板。

华为 P30 发布会上展示的埃菲尔铁塔高清远距离照片。

今天,一位 Reddit 网友贴出了自己基于 Keras 的图像超分辨率项目,可以让照片放大后依然清晰。先来看一下效果。

放大数倍后,照片中的蝴蝶(蛾子?)依然没有失真,背上的绒毛清晰可见。

作者表示,该项目旨在改善低分辨率图像的质量,使其焕然一新。使用该工具可以对图像进行超级放缩,还能很容易地在 RDN 和 GAN上进行实验。

该项目包含不同残差密集网络的 Keras 实现,它们可用于高效的单图像超分辨率(ISR)。同时作者还提供了各种文档资料以帮助训练模型,包括如何使用对抗损失组件训练这些网络。

项目示例

这些示例使用的放大因子(upscaling factor)为 2,即像素数扩大两倍。大家可在 sample_weights 中查看生成示例图像的权重,它们存储在 git lfs 上。如要下载这些权重,你需要先复制该 repo,然后运行 git lfs pull。

左图为原始的低分辨率图像,中间图为该网络的输出结果,右图为使用 GIMP bicubic scaling 得到的基线模型放大结果。

下面是不同方法作用于噪声图像的效果对比,这些方法分别是:使用 bicubic scaling 的基线模型、使用像素级内容损失函数训练的 RDN 网络,以及使用 VGG19 内容压缩数据集和损失函数进行重训练的 RDN 网络。该 repo 包含这些模型的权重

Bicubic up-scaling(基线模型)的输出结果示例。

使用像素级内容损失函数训练的 RDN 网络的输出结果示例。

使用 VGG 内容和对抗损失组件训练的 RDN 网络的输出结果示例。

超分辨率项目有什么

前面展示的超分辨率效果都是根据该项目实现的不同模型做出来的。超分辨率希望根据已有的图像信息重构出缺失的图像细节,它通常借助卷积神经网络抽取图像信息,再通过转置卷积将这些信息扩展到希望获得的图像分辨率。

在这个项目中,作者新增了很多模块与特征,例如使用 VGG 与 GAN 实现真实的放大图像。该项目主要实现的是 RDN 与 RRDN 网络,且同时还提供了预训练权重和 Colab 教程。不论是训练还是推断,根据这些资料我们都可以快速上手。

此外,该项目目前已经可以发布到 PyPI 上了,因此安装也只需键入 pip 命令即可。

总而言之,整个项目实现了三个超分辨率网络,且采用了 Keras 版的 VGG-19 作为特征抽取模块。如下所示为三个超分辨率网络的相关研究:

  • Residual Dense Network for Image Super-Resolution(Zhang et al. 2018, arXiv:1802.08797)

  • ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks(Wang et al. 2018, arXiv:1809.00219)

  • Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network(SRGANS, Ledig et al. 2017, arXiv:1609.04802)

如果我们想要生成上面那样的高清图,该项目还提供了一系列的资源:

  • 文档:https://idealo.github.io/image-super-resolution/

  • 代码:https://github.com/idealo/image-super-resolution/

  • Colab 推断代码:https://colab.research.google.com/github/idealo/image-super-resolution/blob/master/notebooks/ISR_Prediction_Tutorial.ipynb

  • Colab 训练代码:https://colab.research.google.com/github/idealo/image-super-resolution/blob/master/notebooks/ISR_Traininig_Tutorial.ipynb

超分辨率项目怎么用

你可以选择两种方式安装图像超分辨率(ISR)包。

从 PyPI 中安装 ISR(推荐):

pip install ISR

从 GitHub 源安装 ISR:

git clone https://github.com/idealo/image-super-resolution

cd image-super-resolution

python setup.py install

预测

如果我们需要扩展低像素图像,简单两步就能借助 ISR 执行超分辨率。首先加载图像并做一定的预处理:

import numpy as npfrom PIL import Image

img = Image.open('data/input/test_images/sample_image.jpg')
lr_img = np.array(img)/255.
lr_img = np.expand_dims(lr_img, axis=0)

加载模型并执行预测:

from ISR.models import RDN

rdn = RDN(arch_params={'C':6, 'D':20, 'G':64, 'G0':64, 'x':2})
rdn.model.load_weights('weights/rdn-C6-D20-G64-G064-x2_enhanced-e219.hdf5')

sr_img = rdn.model.predict(lr_img)[0]
sr_img = sr_img.clip(0, 1) * 255
sr_img = np.uint8(sr_img)
Image.fromarray(sr_img)

训练

如果需要使用你的数据集重新训练超分辨率模型,那我们也只需要改一改参数。如下首先创建模型:

from ISR.models import RRDN
from ISR.models import Discriminator
from ISR.models import Cut_VGG19

lr_train_patch_size = 40
layers_to_extract = [5, 9]
scale = 2
hr_train_patch_size = lr_train_patch_size * scale

rrdn  = RRDN(arch_params={'C':4, 'D':3, 'G':64, 'G0':64, 'T':10, 'x':scale}, patch_size=lr_train_patch_size)
f_ext = Cut_VGG19(patch_size=hr_train_patch_size, layers_to_extract=layers_to_extract)
discr = Discriminator(patch_size=hr_train_patch_size, kernel_size=3)

创建 Trainer 对象,并将训练的各种配置传递到该对象中:

from ISR.train import Trainer

loss_weights = {
  'generator': 0.0,
  'feat_extr': 0.0833,
  'discriminator': 0.01,
}

trainer = Trainer(
    generator=rrdn,
    discriminator=discr,
    feature_extractor=f_ext,
    lr_train_dir='low_res/training/images',
    hr_train_dir='high_res/training/images',
    lr_valid_dir='low_res/validation/images',
    hr_valid_dir='high_res/validation/images',
    loss_weights=loss_weights,
    dataname='image_dataset',
    logs_dir='./logs',
    weights_dir='./weights',
    weights_generator=None,
    weights_discriminator=None,
    n_validation=40,
    lr_decay_frequency=30,
    lr_decay_factor=0.5,
    T=0.01,
)

开始训练:

trainer.train(
    epochs=80,
    steps_per_epoch=500,
    batch_size=16,
)

网络架构与超参数

实际上,如果我们需要重新训练,那么还需要了解具体的参数都表示什么。这一部分介绍了各超分辨率网络的架构与对应超参数

RDN 网络架构

RDN 网络架构的主要参数如下:

  • D:残差密集块(RDB)数量

  • C:RDB 内部堆叠的卷积层数量

  • G:RDB 内部每一卷积层的特征图数量

图源:https://arxiv.org/abs/1802.08797

RRDN 网络架构

RRDN 架构的主要参数如下:

  • T:残差密集块内的残差数量(RRDB)

  • D:每一 RRDB 内部的残差密集块(RDB)的数量

  • C:RDB 内部堆叠的卷积层数量

  • G:RDB 内部每一卷积层的特征图数量

图源:https://arxiv.org/abs/1809.00219

工程GAN图像超分辨率重建计算机视觉
4
相关数据
华为机构

华为成立于1987年,是全球领先的ICT(信息与通信)基础设施和智能终端提供商。华为的主要业务分布在无线、网络、软件、服务器、云计算、人工智能与大数据、安全、智能终端等领域,发布了5G端到端解决方案、智简网络、软件平台、面向行业的云解决方案、EI企业智能平台、新一代FusionServer V5服务器、HUAWEI Mate等系列智能手机、麒麟系列AI芯片等产品。目前华为拥有18万员工,36所联合创新中心,14所研究院/所/室,业务遍及170多个国家和地区。

http://www.huawei.com/cn
权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

重构技术

代码重构(英语:Code refactoring)指对软件代码做任何更动以增加可读性或者简化结构而不影响输出结果。 软件重构需要借助工具完成,重构工具能够修改代码同时修改所有引用该代码的地方。在极限编程的方法学中,重构需要单元测试来支持。

VGG技术

2014年,牛津大学提出了另一种深度卷积网络VGG-Net,它相比于AlexNet有更小的卷积核和更深的层级。AlexNet前面几层用了11×11和5×5的卷积核以在图像上获取更大的感受野,而VGG采用更小的卷积核与更深的网络提升参数效率。VGG-Net 的泛化性能较好,常用于图像特征的抽取目标检测候选框生成等。VGG最大的问题就在于参数数量,VGG-19基本上是参数量最多的卷积网络架构。VGG-Net的参数主要出现在后面两个全连接层,每一层都有4096个神经元,可想而至这之间的参数会有多么庞大。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

损失函数技术

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

超参数技术

在机器学习中,超参数是在学习过程开始之前设置其值的参数。 相反,其他参数的值是通过训练得出的。 不同的模型训练算法需要不同的超参数,一些简单的算法(如普通最小二乘回归)不需要。 给定这些超参数,训练算法从数据中学习参数。相同种类的机器学习模型可能需要不同的超参数来适应不同的数据模式,并且必须对其进行调整以便模型能够最优地解决机器学习问题。 在实际应用中一般需要对超参数进行优化,以找到一个超参数元组(tuple),由这些超参数元组形成一个最优化模型,该模型可以将在给定的独立数据上预定义的损失函数最小化。

卷积神经网络技术

卷积神经网路(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网路由一个或多个卷积层和顶端的全连通层(对应经典的神经网路)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网路能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网路,卷积神经网路需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 卷积网络是一种专门用于处理具有已知的、网格状拓扑的数据的神经网络。例如时间序列数据,它可以被认为是以一定时间间隔采样的一维网格,又如图像数据,其可以被认为是二维像素网格。

特征抽取技术

堆叠技术

堆叠泛化是一种用于最小化一个或多个泛化器的泛化误差率的方法。它通过推导泛化器相对于所提供的学习集的偏差来发挥其作用。这个推导的过程包括:在第二层中将第一层的原始泛化器对部分学习集的猜测进行泛化,以及尝试对学习集的剩余部分进行猜测,并且输出正确的结果。当与多个泛化器一起使用时,堆叠泛化可以被看作是一个交叉验证的复杂版本,利用比交叉验证更为复杂的策略来组合各个泛化器。当与单个泛化器一起使用时,堆叠泛化是一种用于估计(然后纠正)泛化器的错误的方法,该泛化器已经在特定学习集上进行了训练并被询问了特定问题。

暂无评论
暂无评论~