热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深度学习:用生成对抗网络(GAN)来恢复高分辨率(高精度)图片(附源码,模型与数据集)

文章目录前言Demo效果链接原理分析


文章目录


  • 前言
  • Demo效果
  • 链接
  • 原理分析

    • 系统模型
    • 损失函数
  • 实验
  • 结束


前言

平时生活中,我们经常碰到一些自己喜欢的图片却苦于分辨率很低,而原图又找不太到。 现在,神经网络可以帮助我们从一张给定的低分辨率图片恢复出高分辨率的图片。 这个功能听上去既炫酷又实用,具体是怎么做的呢,详见下文!

Demo效果


上图就是训练了2000次后的模型的效果,只需要输入一张左边的低精度的图片, 就可以生成右边的高精度的图片。肉眼看上去效果还是非常不错的!

这张GIF则展示了整个训练过程的变化, 左边的图是由神经网络生成的, 中间的是原始的高精度的图片, 右边的是输入到神经网络的低分辨率图片, 神经网络在整个生成过程中是没有得到高精度图片信息的,这里给出高精度图片只是为了对比体现生成的效果。可以看到在100次epoch迭代之后,性能已经非常不错了。

链接

项目源码:基于keras的SRGAN实现.
主要参考了著名的keras-GAN这个库,做了一些小改动使得节目效果更好,适合作为Demo来展示哈哈。如果对你有帮助的话请Star一下哈!
论文地址 被引用了1500多次,很强了!这个代码也是根据论文里的参数写的。
数据集地址 这个链接给出了百度云和谷歌云盘的下载地址,笔者是用百度云下载的,非会员用户, 5M/s的速度,很给力!

原理分析

这里提供非常概括性的分析,想深入理解的同学建议参考原文。

系统模型


首先作者使用了非常火热的GAN生成对抗网络(对GAN不熟悉的可以百度一下GAN,已经有许多优质的资料)。 生成网络(上图上半部)接收低精度图片作为输入,通过残差网络等,生成高精度图片。 然后 判别器网络(上图下半部)接收一个输入, 判断其是否为生成的图片。 损失函数为:
min ⁡ θ G max ⁡ θ D E I H R ∼ p r a n i n ( I H R ) [ log ⁡ D θ D ( I H R ) ] + E I L R ∼ p G ( I L R ) [ log ⁡ ( 1 − D θ D ( G θ G ( I L R ) ) ] \begin{array}{c}{\min _{\theta_{G}} \max _{\theta_{D}} \mathbb{E}_{I^{H R} \sim p_{\mathrm{ranin}}\left(I^{H R}\right)}\left[\log D_{\theta_{D}}\left(I^{H R}\right)\right]+} {\mathbb{E}_{I^{L R} \sim p_{G}\left(I^{L R}\right)}\left[\log \left(1-D_{\theta_{D}}\left(G_{\theta_{G}}\left(I^{L R}\right)\right)\right]\right.}\end{array} minθG​​maxθD​​EIHR∼pranin​(IHR)​[logDθD​​(IHR)]+EILR∼pG​(ILR)​[log(1−DθD​​(GθG​​(ILR))]​
没有GAN基础的同学可能比较难理解上述公式,这里深入浅出的通俗解释下训练过程其实就是:

  1. 固定生成器G (参数为 θ G {\theta_{G}} θG​), 训练判别器,使得其能够分辨 真实的图片和生成器生成的图片。
  2. 固定判别器, 训练生成器, 使得其能够让固定的判别器将其判别为真实的图片
    如此迭代之后, 判别器再也无法分别真实和生成的图片,此时就说明生成器生成的图片已经足够以假乱真。这里真实的图片指的就是高精度的图片,训练完成后,我们期望生成器可以接收低精度图片,来生成高精度图片。

生成器作者主要使用了ResNet来实现。
判别器是使用了常规的卷积神经网络。

损失函数

与普通的GAN网络不同的是,这篇文章还考虑了content loss:
l V G G / i . j S R = 1 W i , j H i , j ∑ x = 1 W i , j H i , j ( ϕ i , j ( I H R ) x , y − ϕ i , j ( G θ G ( I L R ) ) x , y ) 2 \begin{array}{r}{l_{V G G / i . j}^{S R}=\frac{1}{W_{i, j} H_{i, j}} \sum_{x=1}^{W_{i, j} H_{i, j}}\left(\phi_{i, j}\left(I^{H R}\right)_{x, y}\right.} {-\phi_{i, j}\left(G_{\theta_{G}}\left(I^{L R}\right)\right)_{x, y} )^{2}}\end{array} lVGG/i.jSR​=Wi,j​Hi,j​1​∑x=1Wi,j​Hi,j​​(ϕi,j​(IHR)x,y​−ϕi,j​(GθG​​(ILR))x,y​)2​
意思就是,生成的图片会和准确的图片一起,输入到VGG网络中,然后得到特征图。 再将两者的特征图求MSE,并训练生成器缩小该MSE。这就是从内容的角度,让生成的图片和准确图片尽可能的接近。

结合上述的GAN网络,本文采用的loss是:
l S R = l X S R ⏟  content loss  + 1 0 − 3 l G e n S R ⏟  adversarial loss  l^{S R}=\underbrace{l_{\mathrm{X}}^{S R}}_{\text { content loss }}+\underbrace{10^{-3} l_{G e n}^{S R}}_{\text { adversarial loss }} lSR= content loss 


lXSR​​​+ adversarial loss 


10−3lGenSR​​​
也就是说在MSE损失的基础上,掺入了一点GAN的损失,作者指出这样会获得更好的性能。

实验

上述简单的概述应该很难让读者完全看懂,建议结合论文与代码一起融会贯通。这里说一下仿真细节:
数据集使用了数据集地址 人脸数据集,因此要恢复的图片也应该是人像图才会效果比较好。
笔者的配置是1080Ti + i9-9900k + 48G内存, 因此使用的batch_size为10。配置不够的同学可以先设为1,确保机器可以跑起来。
具体还可以参见基于keras的SRGAN实现中的readme,有具体的使用方法。

结束

这个Demo非常简单,但是效果很不错,适合课堂演示,Presentation之类的。
我给出了自己这边训练了2000次后的模型权重,可以从链接下载
提取码:su92
由于训练的模型固定了输出的尺寸,因此你自己想输入的图片也尽可能取正方形图片(裁剪一下就行)。


推荐阅读
  • 计算机学报精选论文概览(2020-2022)
    本文汇总了2020年至2022年间《计算机学报》上发表的若干重要论文,旨在为即将投稿的研究者提供参考。 ... [详细]
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • 机器学习(ML)三之多层感知机
    深度学习主要关注多层模型,现在以多层感知机(multilayerperceptron,MLP)为例,介绍多层神经网络的概念。隐藏层多层感知机在单层神经网络的基础上引入了一到多个隐藏 ... [详细]
  • LeetCode 实战:寻找三数之和为零的组合
    给定一个包含 n 个整数的数组,判断该数组中是否存在三个元素 a、b、c,使得 a + b + c = 0。找出所有满足条件且不重复的三元组。 ... [详细]
  • 目录预备知识导包构建数据集神经网络结构训练测试精度可视化计算模型精度损失可视化输出网络结构信息训练神经网络定义参数载入数据载入神经网络结构、损失及优化训练及测试损失、精度可视化qu ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 在2019中国国际智能产业博览会上,百度董事长兼CEO李彦宏强调,人工智能应务实推进其在各行业的应用。随后,在“ABC SUMMIT 2019百度云智峰会”上,百度展示了通过“云+AI”推动AI工业化和产业智能化的最新成果。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 每日学术推荐:异质图神经网络在抽取式文档摘要中的应用研究
    在抽取式文档摘要任务中,学习跨句子关系是至关重要的一步。本文探讨了利用异质图神经网络来捕捉句子间复杂关系的有效方法。通过构建包含不同类型节点和边的图结构,模型能够更准确地识别和提取关键信息,从而生成高质量的摘要。实验结果表明,该方法在多个基准数据集上显著优于传统方法。 ... [详细]
  • 精选10款Python框架助力并行与分布式机器学习
    随着神经网络模型的不断深化和复杂化,训练这些模型变得愈发具有挑战性,不仅需要处理大量的权重,还必须克服内存限制等问题。本文将介绍10款优秀的Python框架,帮助开发者高效地实现分布式和并行化的深度学习模型训练。 ... [详细]
  • 本文源自Coursera平台吴恩达教授的深度学习课程,重点探讨了卷积神经网络(ConvNets)从二维图像处理向一维信号及三维数据处理的拓展应用。 ... [详细]
  • 本文介绍了如何使用 Google Colab 的免费 GPU 资源进行深度学习应用开发。Google Colab 是一个无需配置即可使用的云端 Jupyter 笔记本环境,支持多种深度学习框架,并且提供免费的 GPU 计算资源。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
author-avatar
我只是狼却有幅羊的心肠_152
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有