竞赛保研 基于深度学的图像修复 图像补全

1 前言

🔥 优质竞赛项目系列,今天要分享的是

基于深度学的图像修复 图像补全

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

2 什么是图像内容填充修复

内容识别填充(译注: Content-aware fill ,是 photoshop
的一个功能)是一个强大的工具,设计师和摄影师可以用它来填充图片中不想要的部分或者缺失的部分。在填充图片的缺失或损坏的部分时,图像补全和修复是两种密切相关的技术。有很多方法可以实现内容识别填充,图像补全和修复。

  • 首先我们将图像理解为一个概率分布的样本。
  • 基于这种理解,学*如何生成伪图片。
  • 然后我们找到最适合填充回去的伪图片。

在这里插入图片描述

自动删除不需要的部分(海滩上的人)
在这里插入图片描述

最经典的人脸补充

补充前:

在这里插入图片描述

补充后:
在这里插入图片描述

3 原理分析

3.1 第一步:将图像理解为一个概率分布的样本

你是怎样补全缺失信息的呢?

在上面的例子中,想象你正在构造一个可以填充缺失部分的系统。你会怎么做呢?你觉得人类大脑是怎么做的呢?你使用了什么样的信息呢?

在博文中,我们会关注两种信息:

语境信息:你可以通过周围的像素来推测缺失像素的信息。

感知信息:你会用“正常”的部分来填充,比如你在现实生活中或其它图片上看到的样子。
两者都很重要。没有语境信息,你怎么知道填充哪一个进去?没有感知信息,通过同样的上下文可以生成无数种可能。有些机器学*系统看起来“正常”的图片,人类看起来可能不太正常。
如果有一种确切的、直观的算法,可以捕获前文图像补全步骤介绍中提到的两种属性,那就再好不过了。对于特定的情况,构造这样的算法是可行的。但是没有一般的方法。目前最好的解决方案是通过统计和机器学习来得到一个类似的技术。

在这里插入图片描述

从这个分布中采样,就可以得到一些数据。需要搞清楚的是PDF和样本之间的联系。

在这里插入图片描述

从正态分布中的采样

在这里插入图片描述
2维图像的PDF和采样。 PDF 用等高线图表示,样本点画在上面。

3.2 补全图像

首先考虑多变量正态分布, 以求得到一些启发。给定 x=1 , 那么 y 最可能的值是什么?我们可以固定x的值,然后找到使PDF最大的 y。
在这里插入图片描述
在多维正态分布中,给定x,得到最大可能的y

这个概念可以很自然地推广到图像概率分布。我们已知一些值,希望补全缺失值。这可以简单理解成一个最大化问题。我们搜索所有可能的缺失值,用于补全的图像就是可能性最大的值。
从正态分布的样本来看,只通过样本,我们就可以得出PDF。只需挑选你喜欢的 统计模型, 然后拟合数据即可。
然而,我们实际上并没有使用这种方法。对于简单分布来说,PDF很容易得出来。但是对于更复杂的图像分布来说,就十分困难,难以处理。之所以复杂,一部分原因是复杂的条件依赖:一个像素的值依赖于图像中其它像素的值。另外,最大化一个一般的PDF是一个非常困难和棘手的非凸优化问题。

3.3 快速生成假图像

在未知概率分布情况下,学习生成新样本

除了学 如何计算PDF之外,统计学中另一个成熟的想法是学 怎样用 生成模型
生成新的(随机)样本。生成模型一般很难训练和处理,但是后来深度学*社区在这个领域有了一个惊人的突破。Yann LeCun 在这篇 Quora
回答中对如何进行生成模型的训练进行了一番精彩的论述,并将它称为机器学习领域10年来最有意思的想法。

3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构

使用微步长卷积,对图像进行上采样

在这里插入图片描述
现在我们有了微步长卷积结构,可以得到G(z)的表达,以一个向量z∼pz 作为输入,输出一张 64x64x3 的RGB图像。

在这里插入图片描述

3.5 使用G(z)生成伪图像

基于DCGAN的人脸代数运算 DCGAN论文 。

在这里插入图片描述

4 在Tensorflow上构建DCGANs

部分代码:

def generator(self, z):
    self.z_, self.h0_w, self.h0_b = linear(z, self.gf_dim*8*4*4, 'g_h0_lin', with_w=True)

    self.h0 = tf.reshape(self.z_, [-1, 4, 4, self.gf_dim * 8])
    h0 = tf.nn.relu(self.g_bn0(self.h0))

    self.h1, self.h1_w, self.h1_b = conv2d_transpose(h0,
        [self.batch_size, 8, 8, self.gf_dim*4], name='g_h1', with_w=True)
    h1 = tf.nn.relu(self.g_bn1(self.h1))

    h2, self.h2_w, self.h2_b = conv2d_transpose(h1,
        [self.batch_size, 16, 16, self.gf_dim*2], name='g_h2', with_w=True)
    h2 = tf.nn.relu(self.g_bn2(h2))

    h3, self.h3_w, self.h3_b = conv2d_transpose(h2,
        [self.batch_size, 32, 32, self.gf_dim*1], name='g_h3', with_w=True)
    h3 = tf.nn.relu(self.g_bn3(h3))

    h4, self.h4_w, self.h4_b = conv2d_transpose(h3,
        [self.batch_size, 64, 64, 3], name='g_h4', with_w=True)

    return tf.nn.tanh(h4)

def discriminator(self, image, reuse=False):
    if reuse:
        tf.get_variable_scope().reuse_variables()

    h0 = lrelu(conv2d(image, self.df_dim, name='d_h0_conv'))
    h1 = lrelu(self.d_bn1(conv2d(h0, self.df_dim*2, name='d_h1_conv')))
    h2 = lrelu(self.d_bn2(conv2d(h1, self.df_dim*4, name='d_h2_conv')))
    h3 = lrelu(self.d_bn3(conv2d(h2, self.df_dim*8, name='d_h3_conv')))
    h4 = linear(tf.reshape(h3, [-1, 8192]), 1, 'd_h3_lin')

    return tf.nn.sigmoid(h4), h4

当我们初始化这个类的时候,将要用到这两个函数来构建模型。我们需要两个判别器,它们共享(复用)参数。一个用于来自数据分布的小批图像,另一个用于生成器生成的小批图像。

self.G = self.generator(self.z)
self.D, self.D_logits = self.discriminator(self.images)
self.D_, self.D_logits_ = self.discriminator(self.G, reuse=True)

接下来,我们定义损失函数。这里我们不用求和,而是用D的预测值和真实值之间的交叉熵(cross
entropy),因为它更好用。判别器希望对所有“真”数据的预测都是1,对所有生成器生成的“伪”数据的预测都是0。生成器希望判别器对两者的预测都是1 。

self.d_loss_real = tf.reduce_mean(
    tf.nn.sigmoid_cross_entropy_with_logits(self.D_logits,
                                            tf.ones_like(self.D)))
self.d_loss_fake = tf.reduce_mean(
    tf.nn.sigmoid_cross_entropy_with_logits(self.D_logits_,
                                            tf.zeros_like(self.D_)))
self.g_loss = tf.reduce_mean(
    tf.nn.sigmoid_cross_entropy_with_logits(self.D_logits_,
                                            tf.ones_like(self.D_)))
self.d_loss = self.d_loss_real + self.d_loss_fake

下面我们遍历数据。每一次迭代,我们采样一个小批数据,然后使用优化器来更新网络。有趣的是,如果G只更新一次,鉴别器的损失不会变成0。另外,我认为最后调用
d_loss_fake 和 d_loss_real 进行了一些不必要的计算, 因为这些值在 d_optim 和 g_optim 中已经计算过了。
作为Tensorflow 的一个联系,你可以试着优化这一部分,并发送PR到原始的repo。



    for epoch in xrange(config.epoch):
        ...
        for idx in xrange(0, batch_idxs):
            batch_images = ...
    
            batch_z = np.random.uniform(-1, 1, [config.batch_size, self.z_dim]) \
                        .astype(np.float32)
    
            # Update D network
            _, summary_str = self.sess.run([d_optim, self.d_sum],
                feed_dict={ self.images: batch_images, self.z: batch_z })


            # Update G network
            _, summary_str = self.sess.run([g_optim, self.g_sum],
                feed_dict={ self.z: batch_z })

            # Run g_optim twice to make sure that d_loss does not go to zero (different from paper)
            _, summary_str = self.sess.run([g_optim, self.g_sum],
                feed_dict={ self.z: batch_z })

            errD_fake = self.d_loss_fake.eval({self.z: batch_z})
            errD_real = self.d_loss_real.eval({self.images: batch_images})
            errG = self.g_loss.eval({self.z: batch_z})


最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/313720.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#编程-实现多线程

实现多线程 多线程帮助同时执行各种操作。这为用户节省时间。多线程程序包括一个主线程和其他用户定义的线程以同时执行多个任务。 微处理器为执行的进程分配内存。每个进程占有内存中它们自己的地址空间。但是,所有在进程中的线程占有相同的地址空间。多线程允许在一个程序…

美团2024届秋招笔试第一场编程真题(js版本)

1.小美的外卖订单 简单的加法逻辑,需要注意的是各个数据的边界问题 折扣价不能超过原价减的价格不能超过满的价格满减优惠仅限原价购入 const rl require("readline").createInterface({ input: process.stdin }); void (async function () {let count…

JavaScript保留字和预定义的全局变量及函数汇总

保留字也称关键字,每种语言中都有该语言本身规定的一些关键字,这些关键字都是该语言的语法实现基础,JavaScript中规定了一些标识符作为现行版本的关键字或者将来版本中可能会用到的关键字,所以当我们定义标识符时就不能使用这些关…

典型场景解析|PolarDB分布式版如何支撑SaaS多租户?

SaaS多租户背景 很多平台类应用或系统(如电商CRM平台、仓库订单平台等等),它们的服务模型是围绕用户维度(这里的用户维度可以是一个卖家或品牌,可以是一个仓库等)展开的。因此,这类型的平台业务…

文件上传漏洞(全网最详细)

目录 前言 文件上传漏洞介绍 文件上传漏洞危害 文件上传漏洞满足条件 文件检测流程 CTFSHOW 151关-170关 151关:前端验证绕过 152关:后端校验 Content-Type 校验文件格式 153关:filename字段文件后缀校验 154关:关键字过…

18_类加载

文章目录 类加载器类加载时机Java代码的3个阶段 反射关于Class配置文件(.properties)Properties类通过反射获取构造方法(Constructor)通过反射获取成员变量(Field)通过反射获取成员方法(Method) 其他API自定义类加载器反射的应用 类加载器 分类: Bootstrap ClassLo…

Visual Studio中项目添加链接文件

这个需求在VS里面使用还真不多见,只是最近在做项目的版本编号的时候遇到一个头大的问题,我一个解决方案下面有几十个类库,再发布的时候这几十个类库的版本号必须要统一,之前我们都是在单个的AssemblyInfo.cs里面去改相关的信息&am…

轻量级图床Imagewheel本地部署并结合内网穿透实现远程访问

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测…

Echarts的常用API,以及常用的写法

ECharts是一款基于JavaScript的开源可视化库,用于构建交互式的图表和可视化数据。它提供了丰富的API用于定制图表和处理数据。下面是一些常用的ECharts API和写法的简介: 初始化图表容器: var myChart echarts.init(document.getElementBy…

win11更改桌面默认存储路径

打开文件资源管理器 右击桌面点击属性 在属性中找到位置选项卡,在里面有一个移动,点击它选择你想要的位置 选好位置后点击应用,随后会出现一个进度条,跑完后点击确认 到这里就完成了桌面默认位置的转移

在windows11系统上利用docker搭建linux记录

我的windows11系统上,之前已经安装好了window版本的docker,没有安装的小伙伴需要去安装一下。 下面直接记录安装linux的步骤: 一、创建linux容器 1、拉取镜像 docker pull ubuntu 2、查看镜像 docker images 3、创建容器 docker run --…

2024 年 1 月安全更新修补了 58 个漏洞(Android )

谷歌发布了针对 Android 平台 58 个漏洞的补丁,并修复了 Pixel 设备中的 3 个安全漏洞,拉开了 2024 年的序幕。 Android 2024 年 1 月更新的第一部分以 2024 年 1 月 1 日安全补丁级别发布在设备上,解决了框架和系统组件中的 10 个安全漏洞&…

高级分布式系统-第6讲 分布式系统的容错性--故障/错误/失效/异常

分布式系统容错性的概念 分布式系统的容错性: 当发生故障时, 分布式系统应当在进行恢复的同时继续以可接受的方式进行操作, 并且可以从部分失效中自动恢复, 且不会严重影响整体性能。 具体包括以下4个方面的内容: 可…

redis — redis cluster集群模式下如何实现批量可重入锁?

一、redis cluster 集群版 在Redis 3.0版本以后,Redis发布了Redis Cluster。该集群主要支持搞并发和海量数据处理等优势,当 Redis 在集群模式下运行时,它处理数据存储的方式与作为单个实例运行时不同。这是因为它应该准备好跨多个节点分发数据,从而实现水平可扩展性。具体能…

【科研技巧】如何判断某个期刊是什么类别及影响因子?是否是顶会?如何期刊内检索?AI写综述?AI做PPT?

相关链接 查找和免费下载文献的方式汇总国内外各大期刊关系、如何查看期刊等级以及查看某篇论文属于哪个期刊登录和访问EI(Engineering Village)数据库查找文献 1 如何判断某个期刊是什么类别及影响因子 https://sci.justscience.cn/ IFold是影响因子 期刊类别为SCIE、查看…

在线ai扩图是什么?有什么工具?分享3个好用的工具。

在线ai扩图是什么?有什么工具?分享3个好用的工具。 在当今数字化的时代,图像处理成为了我们日常生活和工作中不可或缺的一部分。有时候,我们需要将图像放大以获取更多的细节,但传统的方法往往会导致图像质量的损失。幸…

Nginx服务配置文件

在Nginx服务器的主配置文件/usr/local/nginx/conf/nginx.conf 中,包括全局配置、I/O事件配置 和HTTP配置这三大块内容,配置语句的格式为“关键字 值:”(末尾以分号表示结束),以“#” 开始的部分表示注释。 …

小手也能用的高性能鼠标,自定义空间还挺高,雷柏VT9Pro mini上手

今年搭载PAW3395传感器的电竞鼠标很受欢迎,雷柏就出了不少型号,满足各种喜好的玩家选择,像是近期新出的搭载3395高定版的VT9Pro和VT9Pro mini,就在轻量化的基础上,满足了各种手型的玩家的使用需要,而且价格…

2024年美妆品牌如何突破营销困境,强势突围?

随着人们消费观念的升级,美妆护肤几乎成为人们的日常标配,不仅仅女性还有男性也开始注重管理,美妆产品的目标消费群体在不断扩大,对产品的要求也逐渐多元化,在这一趋势下,2024年美妆品牌怎么做才能突破营销…

《MCtalk·CEO对话》正式上线!首期对话高成资本

2015 年 10 月,网易智企发布第一款产品,正式踏上了 ToB 商业化之路。从那以后,我们每年举办不同主题的科技峰会,分享最新的行业体感和洞察;访谈各界企业领导者,记录他们的创新与创业经历;走过大…