网站建设信息介绍沈阳男科医院哪家正规的
网站建设信息介绍,沈阳男科医院哪家正规的,建设电子商务网站的好处,移动网站建设可信赖1 前言
Hi#xff0c;大家好#xff0c;这里是丹成学长#xff0c;今天向大家介绍
基于深度学的图像修复 图像补全
大家可用于 毕业设计
#x1f9ff; 选题指导, 项目分享#xff1a;见文末
2 什么是图像内容填充修复
内容识别填充(译注: Content-aware fill ,是 photosho…1 前言Hi大家好这里是丹成学长今天向大家介绍基于深度学的图像修复 图像补全大家可用于 毕业设计选题指导, 项目分享见文末2 什么是图像内容填充修复内容识别填充(译注: Content-aware fill ,是 photoshop 的一个功能)是一个强大的工具设计师和摄影师可以用它来填充图片中不想要的部分或者缺失的部分。在填充图片的缺失或损坏的部分时图像补全和修复是两种密切相关的技术。有很多方法可以实现内容识别填充图像补全和修复。首先我们将图像理解为一个概率分布的样本。基于这种理解学*如何生成伪图片。然后我们找到最适合填充回去的伪图片。自动删除不需要的部分海滩上的人最经典的人脸补充补充前补充后3 原理分析3.1 第一步将图像理解为一个概率分布的样本你是怎样补全缺失信息的呢在上面的例子中想象你正在构造一个可以填充缺失部分的系统。你会怎么做呢你觉得人类大脑是怎么做的呢你使用了什么样的信息呢在博文中我们会关注两种信息语境信息你可以通过周围的像素来推测缺失像素的信息。感知信息你会用“正常”的部分来填充比如你在现实生活中或其它图片上看到的样子。两者都很重要。没有语境信息你怎么知道填充哪一个进去没有感知信息通过同样的上下文可以生成无数种可能。有些机器学*系统看起来“正常”的图片人类看起来可能不太正常。如果有一种确切的、直观的算法可以捕获前文图像补全步骤介绍中提到的两种属性那就再好不过了。对于特定的情况构造这样的算法是可行的。但是没有一般的方法。目前最好的解决方案是通过统计和机器学习来得到一个类似的技术。从这个分布中采样就可以得到一些数据。需要搞清楚的是PDF和样本之间的联系。从正态分布中的采样2维图像的PDF和采样。 PDF 用等高线图表示样本点画在上面。3.2 补全图像首先考虑多变量正态分布 以求得到一些启发。给定 x1 , 那么 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部分代码defgenerator(self,z):self.z_,self.h0_w,self.h0_blinear(z,self.gf_dim*8*4*4,g_h0_lin,with_wTrue)self.h0tf.reshape(self.z_,[-1,4,4,self.gf_dim*8])h0tf.nn.relu(self.g_bn0(self.h0))self.h1,self.h1_w,self.h1_bconv2d_transpose(h0,[self.batch_size,8,8,self.gf_dim*4],nameg_h1,with_wTrue)h1tf.nn.relu(self.g_bn1(self.h1))h2,self.h2_w,self.h2_bconv2d_transpose(h1,[self.batch_size,16,16,self.gf_dim*2],nameg_h2,with_wTrue)h2tf.nn.relu(self.g_bn2(h2))h3,self.h3_w,self.h3_bconv2d_transpose(h2,[self.batch_size,32,32,self.gf_dim*1],nameg_h3,with_wTrue)h3tf.nn.relu(self.g_bn3(h3))h4,self.h4_w,self.h4_bconv2d_transpose(h3,[self.batch_size,64,64,3],nameg_h4,with_wTrue)returntf.nn.tanh(h4)defdiscriminator(self,image,reuseFalse):ifreuse:tf.get_variable_scope().reuse_variables()h0lrelu(conv2d(image,self.df_dim,named_h0_conv))h1lrelu(self.d_bn1(conv2d(h0,self.df_dim*2,named_h1_conv)))h2lrelu(self.d_bn2(conv2d(h1,self.df_dim*4,named_h2_conv)))h3lrelu(self.d_bn3(conv2d(h2,self.df_dim*8,named_h3_conv)))h4linear(tf.reshape(h3,[-1,8192]),1,d_h3_lin)returntf.nn.sigmoid(h4),h4当我们初始化这个类的时候将要用到这两个函数来构建模型。我们需要两个判别器它们共享复用参数。一个用于来自数据分布的小批图像另一个用于生成器生成的小批图像。self.Gself.generator(self.z)self.D,self.D_logitsself.discriminator(self.images)self.D_,self.D_logits_self.discriminator(self.G,reuseTrue)接下来我们定义损失函数。这里我们不用求和而是用D的预测值和真实值之间的交叉熵cross entropy因为它更好用。判别器希望对所有“真”数据的预测都是1对所有生成器生成的“伪”数据的预测都是0。生成器希望判别器对两者的预测都是1 。self.d_loss_realtf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(self.D_logits,tf.ones_like(self.D)))self.d_loss_faketf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(self.D_logits_,tf.zeros_like(self.D_)))self.g_losstf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(self.D_logits_,tf.ones_like(self.D_)))self.d_lossself.d_loss_realself.d_loss_fake下面我们遍历数据。每一次迭代我们采样一个小批数据然后使用优化器来更新网络。有趣的是如果G只更新一次鉴别器的损失不会变成0。另外我认为最后调用 d_loss_fake 和 d_loss_real 进行了一些不必要的计算 因为这些值在 d_optim 和 g_optim 中已经计算过了。 作为Tensorflow 的一个联系你可以试着优化这一部分并发送PR到原始的repo。forepochinxrange(config.epoch):...foridxinxrange(0,batch_idxs):batch_images...batch_znp.random.uniform(-1,1,[config.batch_size,self.z_dim])\.astype(np.float32)# Update D network_,summary_strself.sess.run([d_optim,self.d_sum],feed_dict{self.images:batch_images,self.z:batch_z})# Update G network_,summary_strself.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_strself.sess.run([g_optim,self.g_sum],feed_dict{self.z:batch_z})errD_fakeself.d_loss_fake.eval({self.z:batch_z})errD_realself.d_loss_real.eval({self.images:batch_images})errGself.g_loss.eval({self.z:batch_z}) 项目分享:大家可自取用于参考学习获取方式见文末!