热门标签 | 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
由于训练的模型固定了输出的尺寸,因此你自己想输入的图片也尽可能取正方形图片(裁剪一下就行)。


推荐阅读
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 2017年人工智能领域的十大里程碑事件回顾
    随着2018年的临近,我们一同回顾过去一年中人工智能领域的重要进展。这一年,无论是政策层面的支持,还是技术上的突破,都显示了人工智能发展的迅猛势头。以下是精选的2017年人工智能领域最具影响力的事件。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了如何使用Python编写爬虫程序,从豆瓣电影Top250页面抓取电影信息。文章涵盖了从基础的网页请求到处理反爬虫机制,再到多页数据抓取的全过程,并提供了完整的代码示例。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • 使用EmguCV 4.5.4实现LSD直线检测的C#示例
    欢迎关注“视觉与AI技术前沿”公众号,获取最新的计算机视觉和深度学习干货。本文将详细介绍如何使用EmguCV 4.5.4在C#中实现LSD(Line Segment Detector)直线检测,并提供完整的代码示例。 ... [详细]
  • 新手指南:在Windows 10上搭建深度学习与PyTorch开发环境
    本文详细记录了一名新手在Windows 10操作系统上搭建深度学习环境的过程,包括安装必要的软件和配置环境变量等步骤,旨在帮助同样初入该领域的读者避免常见的错误。 ... [详细]
  • 本文档旨在帮助开发者回顾游戏开发中的人工智能技术,涵盖移动算法、群聚行为、路径规划、脚本AI、有限状态机、模糊逻辑、规则式AI、概率论与贝叶斯技术、神经网络及遗传算法等内容。 ... [详细]
  • 在Ubuntu 16.04中使用Anaconda安装TensorFlow
    本文详细介绍了如何在Ubuntu 16.04系统上通过Anaconda环境管理工具安装TensorFlow。首先,需要下载并安装Anaconda,然后配置环境变量以确保系统能够识别Anaconda命令。接着,创建一个特定的Python环境用于安装TensorFlow,并通过指定的镜像源加速安装过程。最后,通过一个简单的线性回归示例验证TensorFlow的安装是否成功。 ... [详细]
  • 本文探讨了亚马逊Go如何通过技术创新推动零售业的发展,以及面临的市场和隐私挑战。同时,介绍了亚马逊最新的‘刷手支付’技术及其潜在影响。 ... [详细]
  • 随着5G、云计算、人工智能、大数据等新技术的广泛应用,人们的生活生产方式发生了深刻变化。从人际互联到万物互联,数据存储与处理需求激增,推动了数据与算力设施的发展。 ... [详细]
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社区 版权所有