[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(下)

spearhead_cai發表於2018-12-22

這是本文的最後一部分內容了,前兩部分內容的文章:

  1. [GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(上)
  2. [GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(中)

以及原文的地址:

bamos.github.io/2016/08/09/…

最後一部分的目錄如下:

  • 第三步:為影像修復尋找最佳的假圖片
    • 利用 DCGANs 實現影像修復
    • [ML-Heavy] 損失函式
    • [ML-Heavy] TensorFlow 實現 DCGANs 模型來實現影像修復
    • 修復你的圖片

第三步:為影像修復尋找最佳的假圖片

利用 DCGANs 實現影像修復

在第二步中,我們定義並訓練了判別器D(x)和生成器G(z),那接下來就是如何利用DCGAN網路模型來完成圖片的修復工作了。

在這部分,作者會參考論文"Semantic Image Inpainting with Perceptual and Contextual Losses" 提出的方法。

對於部分圖片y,對於缺失的畫素部分採用最大化D(y)這種看起來合理的做法並不成功,它會導致生成一些既不屬於真實資料分佈,也屬於生成資料分佈的畫素值。如下圖所示,我們需要一種合理的將y對映到生成資料分佈上。

[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(下)

[ML-Heavy] 損失函式

首先我們先定義幾個符號來用於影像修復。用M表示一個二值的掩碼(Mask),即只有 0 或者是 1 的數值。其中 1 數值表示圖片中要保留的部分,而 0 表示圖片中需要修復的區域。定義好這個 Mask 後,接下來就是定義如何通過給定一個 Mask 來修復一張圖片y,具體的方法就是讓yM的畫素對應相乘,這種兩個矩陣對應畫素的方法叫做哈大馬乘積,並且表示為 M ⊙ y ,它們的乘積結果會得到圖片中原始部分,如下圖所示:

[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(下)

接下來,假設我們從生成器G的生成結果找到一張圖片,如下圖公式所示,第二項表示的是DCGAN生成的修復部分:

[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(下)

根據上述公式,我們知道最重要的就是第二項生成部分,也就是需要實現很好修復圖片缺失區域的做法。為了實現這個目的,這就需要回顧在第一步提出的兩個重要的資訊,上下文和感知資訊。而這兩個資訊的獲取主要是通過損失函式來實現。損失函式越小,表示生成的G(z)越適合待修復的區域。

Contextual Loss

為了保證輸入圖片相同的上下文資訊,需要讓輸入圖片y(可以理解為標籤)中已知的畫素和對應在G(z)中的畫素儘可能相似,因此需要對產生不相似畫素的G(z)做出懲罰。該損失函式如下所示,採用的是 L1 正則化方法:

[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(下)

這裡還可以選擇採用 L2 正則化方法,但論文中通過實驗證明了 L1 正則化的效果更好。

理想的情況是yG(z)的所有畫素值都是相同的,也就是說它們是完全相同的圖片,這也就讓上述損失函式值為0

Perceptual Loss

為了讓修復後的圖片看起來非常逼真,我們需要讓判別器D具備正確分辨出真實圖片的能力。對應的損失函式如下所示:

[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(下)

因此,最終的損失函式如下所示:

[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(下)

這裡 λ 是一個超引數,用於控制兩個函式的各自重要性。

另外,論文還採用泊松混合(poisson blending) 方法來平滑重構後的圖片。

[ML-Heavy] TensorFlow 實現 DCGANs 模型來實現影像修復

程式碼實現的專案地址如下:

github.com/bamos/dcgan…

首先需要新新增的變數是表示用於修復的 mask,如下所示,其大小和輸入圖片一樣

self.mask = tf.placeholder(tf.float32, [None] + self.image_shape, name='mask')
複製程式碼

對於最小化損失函式的方法是採用常用的梯度下降方法,而在 TensorFlow 中已經實現了自動微分的方法,因此只需要新增待實現的損失函式程式碼即可。新增的程式碼如下所示:

self.contextual_loss = tf.reduce_sum(
    tf.contrib.layers.flatten(
        tf.abs(tf.mul(self.mask, self.G) - tf.mul(self.mask, self.images))), 1)
self.perceptual_loss = self.g_loss
self.complete_loss = self.contextual_loss + self.lam*self.perceptual_loss
self.grad_complete_loss = tf.gradients(self.complete_loss, self.z)
複製程式碼

接著,就是定義一個 mask。這裡作者實現的是位置在圖片中心部分的 mask,可以根據需求來新增需要的任意隨機位置的 mask,實際上程式碼中實現了多種 mask

if config.maskType == 'center':
    scale = 0.25
    assert(scale <= 0.5)
    mask = np.ones(self.image_shape)
    l = int(self.image_size*scale)
    u = int(self.image_size*(1.0-scale))
    mask[l:u, l:u, :] = 0.0
複製程式碼

因為採用梯度下降,所以採用一個 mini-batch 的帶有動量的對映梯度下降方法,將z對映到[-1,1]的範圍。程式碼如下:

for idx in xrange(0, batch_idxs):
    batch_images = ...
    batch_mask = np.resize(mask, [self.batch_size] + self.image_shape)
    zhats = np.random.uniform(-1, 1, size=(self.batch_size, self.z_dim))

    v = 0
    for i in xrange(config.nIter):
        fd = {
            self.z: zhats,
            self.mask: batch_mask,
            self.images: batch_images,
        }
        run = [self.complete_loss, self.grad_complete_loss, self.G]
        loss, g, G_imgs = self.sess.run(run, feed_dict=fd)
        # 對映梯度下降方法
        v_prev = np.copy(v)
        v = config.momentum*v - config.lr*g[0]
        zhats += -config.momentum * v_prev + (1+config.momentum)*v
        zhats = np.clip(zhats, -1, 1)
複製程式碼

修復你的圖片

選擇需要進行修復的圖片,並放在資料夾dcgan-completion.tensorflow/your-test-data/raw下面,然後根據之前第二步的做法來對人臉圖片進行對齊操作,然後將操作後的圖片放到資料夾dcgan-completion.tensorflow/your-test-data/aligned。作者隨機從資料集LFW中挑選圖片進行測試,並且保證其DCGAN模型的訓練集沒有包含LFW中的人臉圖片。

接著可以執行下列命令來進行修復工作了:

./complete.py ./data/your-test-data/aligned/* --outDir outputImages
複製程式碼

上面的程式碼會將修復圖片結果儲存在--outDir引數設定的輸出資料夾下,接著可以採用ImageMagick工具來生成動圖。這裡因為動圖太大,就只展示修復後的結果圖片:

[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(下)

而原始的輸入待修復圖片如下:

[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(下)


小結

最後,再給出前兩步的文章連結:

  1. [GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(上)
  2. [GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(中)

當然這個圖片修復方法由於也是2016年提出的方法了,所以效果不算特別好,這兩年其實已經新出了好多篇新的圖片修復方法的論文,比如:

  1. 2016CVPR Context encoders: Feature learning by inpainting

  2. Deepfill 2018--Generative Image Inpainting with Contextual Attention

  3. Deepfillv2--Free-Form Image Inpainting with Gated Convolution

  4. 2017CVPR--High-resolution image inpainting using multi-scale neural patch synthesis

  5. 2018年的 NIPrus收錄論文--Image Inpainting via Generative Multi-column Convolutional Neural Networks


歡迎關注我的微信公眾號--機器學習與計算機視覺,或者掃描下方的二維碼,在後臺留言,和我分享你的建議和看法,指正文章中可能存在的錯誤,大家一起交流,學習和進步!

[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(下)

我的個人部落格和 CSDN 部落格:

ccc013.github.io/

blog.csdn.net/lc013/artic…


往期精彩推薦

1.機器學習入門系列(1)--機器學習概覽(上)

2.機器學習入門系列(2)--機器學習概覽(下)

3.[GAN學習系列] 初識GAN

4.[GAN學習系列2] GAN的起源

5.[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(上)

6.[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(中)

相關文章