asp c 網(wǎng)站開發(fā)百度發(fā)視頻步驟
文章目錄
- 0 前言
- 2 什么是圖像內(nèi)容填充修復(fù)
- 3 原理分析
- 3.1 第一步:將圖像理解為一個(gè)概率分布的樣本
- 3.2 補(bǔ)全圖像
- 3.3 快速生成假圖像
- 3.4 生成對(duì)抗網(wǎng)絡(luò)(Generative Adversarial Net, GAN) 的架構(gòu)
- 3.5 使用G(z)生成偽圖像
- 4 在Tensorflow上構(gòu)建DCGANs
- 最后
0 前言
🔥 優(yōu)質(zhì)競(jìng)賽項(xiàng)目系列,今天要分享的是
🚩 深度學(xué)圖像修復(fù)算法
該項(xiàng)目較為新穎,適合作為競(jìng)賽課題方向,學(xué)長(zhǎng)非常推薦!
🥇學(xué)長(zhǎng)這里給一個(gè)題目綜合評(píng)分(每項(xiàng)滿分5分)
- 難度系數(shù):3分
- 工作量:3分
- 創(chuàng)新點(diǎn):4分
🧿 更多資料, 項(xiàng)目分享:
https://gitee.com/dancheng-senior/postgraduate
2 什么是圖像內(nèi)容填充修復(fù)
內(nèi)容識(shí)別填充(譯注: Content-aware fill ,是 photoshop
的一個(gè)功能)是一個(gè)強(qiáng)大的工具,設(shè)計(jì)師和攝影師可以用它來(lái)填充圖片中不想要的部分或者缺失的部分。在填充圖片的缺失或損壞的部分時(shí),圖像補(bǔ)全和修復(fù)是兩種密切相關(guān)的技術(shù)。有很多方法可以實(shí)現(xiàn)內(nèi)容識(shí)別填充,圖像補(bǔ)全和修復(fù)。
- 首先我們將圖像理解為一個(gè)概率分布的樣本。
- 基于這種理解,學(xué)*如何生成偽圖片。
- 然后我們找到最適合填充回去的偽圖片。
自動(dòng)刪除不需要的部分(海灘上的人)
最經(jīng)典的人臉補(bǔ)充
補(bǔ)充前:
補(bǔ)充后:
3 原理分析
3.1 第一步:將圖像理解為一個(gè)概率分布的樣本
你是怎樣補(bǔ)全缺失信息的呢?
在上面的例子中,想象你正在構(gòu)造一個(gè)可以填充缺失部分的系統(tǒng)。你會(huì)怎么做呢?你覺得人類大腦是怎么做的呢?你使用了什么樣的信息呢?
在博文中,我們會(huì)關(guān)注兩種信息:
語(yǔ)境信息:你可以通過(guò)周圍的像素來(lái)推測(cè)缺失像素的信息。
感知信息:你會(huì)用“正?!钡牟糠謥?lái)填充,比如你在現(xiàn)實(shí)生活中或其它圖片上看到的樣子。
兩者都很重要。沒有語(yǔ)境信息,你怎么知道填充哪一個(gè)進(jìn)去?沒有感知信息,通過(guò)同樣的上下文可以生成無(wú)數(shù)種可能。有些機(jī)器學(xué)*系統(tǒng)看起來(lái)“正?!钡膱D片,人類看起來(lái)可能不太正常。
如果有一種確切的、直觀的算法,可以捕獲前文圖像補(bǔ)全步驟介紹中提到的兩種屬性,那就再好不過(guò)了。對(duì)于特定的情況,構(gòu)造這樣的算法是可行的。但是沒有一般的方法。目前最好的解決方案是通過(guò)統(tǒng)計(jì)和機(jī)器學(xué)習(xí)來(lái)得到一個(gè)類似的技術(shù)。
從這個(gè)分布中采樣,就可以得到一些數(shù)據(jù)。需要搞清楚的是PDF和樣本之間的聯(lián)系。
從正態(tài)分布中的采樣
2維圖像的PDF和采樣。 PDF 用等高線圖表示,樣本點(diǎn)畫在上面。
3.2 補(bǔ)全圖像
首先考慮多變量正態(tài)分布, 以求得到一些啟發(fā)。給定 x=1 , 那么 y 最可能的值是什么?我們可以固定x的值,然后找到使PDF最大的 y。
在多維正態(tài)分布中,給定x,得到最大可能的y
這個(gè)概念可以很自然地推廣到圖像概率分布。我們已知一些值,希望補(bǔ)全缺失值。這可以簡(jiǎn)單理解成一個(gè)最大化問(wèn)題。我們搜索所有可能的缺失值,用于補(bǔ)全的圖像就是可能性最大的值。
從正態(tài)分布的樣本來(lái)看,只通過(guò)樣本,我們就可以得出PDF。只需挑選你喜歡的 統(tǒng)計(jì)模型, 然后擬合數(shù)據(jù)即可。
然而,我們實(shí)際上并沒有使用這種方法。對(duì)于簡(jiǎn)單分布來(lái)說(shuō),PDF很容易得出來(lái)。但是對(duì)于更復(fù)雜的圖像分布來(lái)說(shuō),就十分困難,難以處理。之所以復(fù)雜,一部分原因是復(fù)雜的條件依賴:一個(gè)像素的值依賴于圖像中其它像素的值。另外,最大化一個(gè)一般的PDF是一個(gè)非常困難和棘手的非凸優(yōu)化問(wèn)題。
3.3 快速生成假圖像
在未知概率分布情況下,學(xué)習(xí)生成新樣本
除了學(xué) 如何計(jì)算PDF之外,統(tǒng)計(jì)學(xué)中另一個(gè)成熟的想法是學(xué) 怎樣用 生成模型
生成新的(隨機(jī))樣本。生成模型一般很難訓(xùn)練和處理,但是后來(lái)深度學(xué)*社區(qū)在這個(gè)領(lǐng)域有了一個(gè)驚人的突破。Yann LeCun 在這篇 Quora
回答中對(duì)如何進(jìn)行生成模型的訓(xùn)練進(jìn)行了一番精彩的論述,并將它稱為機(jī)器學(xué)習(xí)領(lǐng)域10年來(lái)最有意思的想法。
3.4 生成對(duì)抗網(wǎng)絡(luò)(Generative Adversarial Net, GAN) 的架構(gòu)
使用微步長(zhǎng)卷積,對(duì)圖像進(jìn)行上采樣
現(xiàn)在我們有了微步長(zhǎng)卷積結(jié)構(gòu),可以得到G(z)的表達(dá),以一個(gè)向量z~pz 作為輸入,輸出一張 64x64x3 的RGB圖像。
3.5 使用G(z)生成偽圖像
基于DCGAN的人臉代數(shù)運(yùn)算 DCGAN論文 。
4 在Tensorflow上構(gòu)建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
當(dāng)我們初始化這個(gè)類的時(shí)候,將要用到這兩個(gè)函數(shù)來(lái)構(gòu)建模型。我們需要兩個(gè)判別器,它們共享(復(fù)用)參數(shù)。一個(gè)用于來(lái)自數(shù)據(jù)分布的小批圖像,另一個(gè)用于生成器生成的小批圖像。
?
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)
接下來(lái),我們定義損失函數(shù)。這里我們不用求和,而是用D的預(yù)測(cè)值和真實(shí)值之間的交叉熵(cross
entropy),因?yàn)樗糜?。判別器希望對(duì)所有“真”數(shù)據(jù)的預(yù)測(cè)都是1,對(duì)所有生成器生成的“偽”數(shù)據(jù)的預(yù)測(cè)都是0。生成器希望判別器對(duì)兩者的預(yù)測(cè)都是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
下面我們遍歷數(shù)據(jù)。每一次迭代,我們采樣一個(gè)小批數(shù)據(jù),然后使用優(yōu)化器來(lái)更新網(wǎng)絡(luò)。有趣的是,如果G只更新一次,鑒別器的損失不會(huì)變成0。另外,我認(rèn)為最后調(diào)用
d_loss_fake 和 d_loss_real 進(jìn)行了一些不必要的計(jì)算, 因?yàn)檫@些值在 d_optim 和 g_optim 中已經(jīng)計(jì)算過(guò)了。
作為Tensorflow 的一個(gè)聯(lián)系,你可以試著優(yōu)化這一部分,并發(fā)送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})
最后
🧿 更多資料, 項(xiàng)目分享:
https://gitee.com/dancheng-senior/postgraduate