[GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复(上)
在之前的兩篇 GAN 系列文章–[GAN學習系列1]初識GAN以及[GAN學習系列2] GAN的起源中簡單介紹了 GAN 的基本思想和原理,這次就介紹利用 GAN 來做一個圖片修復的應用,主要采用的也是 GAN 在網絡結構上的升級版–DCGAN,最初始的 GAN 采用的還是神經網絡,即全連接網絡,而 DCGAN 則是換成卷積神經網絡(CNNs)了,這可以很好利用 CNN 強大的特征提取能力,更好的生成質量更好的圖片。
原文是:
http://bamos.github.io/2016/08/09/deep-completion/
由于原文比較長,所以會分為 3 篇來介紹。
這篇文章的目錄如下:
- 介紹
- 第一步:將圖像解釋為概率分布中的樣本
- 如何填充缺失的信息?
- 對于圖片在哪里適配這些統計數據?
- 我們如何修復圖片呢?
- 第二步:快速生成假的圖片
- 從未知的概率分布中學習生成新的樣本
- [ML-Heavy] 建立 GAN 模型
- 采用 G(z) 生成假的圖片
- [ML-Heavy] 訓練 DCGAN
- 目前的 GAN 和 DCGAN 實現
- [ML-Heavy] TensorFlow 實現 DCGAN
- 在你的數據集上運行 DCGAN 模型
- 第三步:為圖像修復尋找最佳的假圖片
- 利用 DCGANs 實現圖像修復
- [ML-Heavy] 損失函數
- [ML-Heavy] TensorFlow 實現 DCGANs 模型來實現圖像修復
- 修復你的圖片
- 結論
- 對本文/項目的引用
- 供進一步閱讀的部分參考書目
- 一些未實現的對于 TensorFlow 和 Torch 的想法
本文會先講述背景和第一步的工作內容。
介紹
設計師和攝像師習慣使用一個非常強有力的工具–內容感知填充,來修復圖片中不需要或者缺失的部分。圖像修復是指用于修復圖像中缺失或者毀壞的部分區域。實現圖像的修復有很多種方法。在本文中,介紹的是在 2016年7月26日發表在 arXiv 上的論文“Semantic Image Inpainting with Perceptual and Contextual Losses”,這篇論文介紹如何采用 DCGAN 來實現圖像修復。這篇文章會即兼顧非機器學習背景和有機器學習背景的讀者,帶有 [ML-Heavy] 標簽的標題內容表示可以跳過這部分細節內容。我們只考慮有限制的修復帶有缺失像素的人臉圖片的例子。TensorFlow 實現的源代碼可以在下面的 Github 地址上查看:
https://github.com/bamos/dcgan-completion.tensorflow
我們將從以下三個步驟來完成圖片修復工作:
下面是兩張修復前和修復后的圖片例子:
下面是本文將用到的帶有缺失區域的人臉例子:
第一步:將圖像解釋為概率分布中的樣本
如何填充缺失的信息?
對于上述幾張圖片例子,假設你正在設計一個系列來填充這些缺失的區域,你會選擇如何做?你認為人腦會怎么處理它呢?你需要使用哪些信息來實現這個修復工作呢?
本文會主要關注下面兩種信息:
這兩種信息都非常重要。沒有上下文信息,你怎么知道填充什么信息呢?沒有感知信息,對于一個上下文來說會有很多種有效的填充方式。比如一些對于機器學習系統來說看上去是“正常”的填充信息,但對于我們人類來說其實就是非常奇怪的填充內容。
因此,有一個即精確又直觀的捕獲這兩種屬性,并且可以解釋說明如何一步步實現圖像修復的算法是再好不過了。創造出這樣的算法可能只會適用于特殊的例子,但通常都沒有人知道如何創造這樣的算法。現在最佳的做法是使用統計數據和機器學習方法來實現一種近似的技術。
對于圖片在哪里適配這些統計數據?
為了解釋這個問題,首先介紹一個非常好理解而且能簡明表示的概率分布:正態分布。下面是一個正態分布的概率密度函數(probability density function, PDF)的圖示。你可以這么理解 PDF,它是水平方向表示輸入空間的數值,在垂直方向上表示默寫數值發生的概率。
上面這張圖的繪制代碼如下:
# !/usr/bin/env python3import numpy as np from scipy.stats import normimport matplotlib as mplmpl.use('Agg') import matplotlib.pyplot as pltplt.style.use('bmh') import matplotlib.mlab as mlabnp.random.seed(0) ### 繪制一個正態分布的概率密度函數圖### # 生成數據 X范圍是(-3,3),步進為0.001, Y的范圍是(0,1) X = np.arange(-3, 3, 0.001) Y = norm.pdf(X, 0, 1) # 繪制 fig = plt.figure() plt.plot(X, Y) plt.tight_layout() plt.savefig("./images/normal-pdf.png")接著可以從上述分布中采樣得到一些樣本數據,如下圖所示:
繪制代碼如下:
### 繪制從正態分布采樣的 1D 散點圖例子 ### nSamples = 35 # np.random.normal 是從正態分布中隨機采樣指定數量的樣本,這里指定 35個 X = np.random.normal(0, 1, nSamples) Y = np.zeros(nSamples) fig = plt.figure(figsize=(7, 3)) # 繪制散點圖 plt.scatter(X, Y, color='k') plt.xlim((-3, 3)) frame = plt.gca() frame.axes.get_yaxis().set_visible(False) plt.savefig("./images/normal-samples.png")這是 1 維概率分布的例子,因為輸入數據就只是一維數據,我們也可以實現二維的例子,如下圖所示:
繪制代碼如下:
### 繪制從正態分布采樣的 2D 散點圖例子###delta = 0.025 # 設置 X,Y 的數值范圍和步長值,分別生成 240個數 x = np.arange(-3.0, 3.0, delta) y = np.arange(-3.0, 3.0, delta) print('x shape', x.shape) # 根據坐標向量來生成坐標矩陣 X, Y = np.meshgrid(x, y) # X, Y shape: (240, 240)print('X shape', X.shape) print('Y shape', Y.shape) # Bivariate Gaussian distribution for equal shape *X*, *Y* # 等形狀的雙變量高斯分布 Z = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) # Z shape (240, 240) print('Z shape', Z.shape)plt.figure() # 繪制環形圖輪廓 CS = plt.contour(X, Y, Z) plt.clabel(CS, inline=1, fontsize=10)nSamples = 200 mean = [0, 0] cov = [[1, 0], [0, 1]] # 從多元正態分布中采樣,得到結果圖中的黑點例子 X, Y = np.random.multivariate_normal(mean, cov, nSamples).T plt.scatter(X, Y, color='k')plt.savefig("./images/normal-2d.png")繪制上述三張圖的完整代碼如下所示,代碼地址為:
https://github.com/bamos/dcgan-completion.tensorflow/blob/master/simple-distributions.py
圖片和統計學之間的關鍵關系就是我們可以將圖片解釋為高維概率分布的樣本。概率分布就體現在圖片的像素上。假設你正采用你的相機進行拍照,照片的像素數量是有限的,當你用相機拍下一張照片的時候,就相當于從這個復雜的概率分布中進行采樣的操作。而這個分布也是我們用來定義一張圖片是否正常。和正態分布不同的是,只有圖片,我們是不知道真實的概率分布,只是在收集樣本而已。
在本文中,我們采用 RGB 顏色模型表示的彩色圖片。我們采用的是寬和高都是 64 像素的圖片,所以概率分布的維度應該是 64×64×3≈12k。
我們如何修復圖片呢?
首先為了更加直觀,我們先考慮之前介紹的多元正態分布。給定x=1時,y最有可能的取值是什么呢?這可以通過固定x=1,然后最大化 PDF 的值來找到所有可能的y的取值。如下圖所示:
上圖中垂直的黑色直線經過的黑點就是符合要求的y值。
這個概念可以延伸到我們的圖像概率分布中,當我們知道某些數值,然后想填補完成缺失的數值的時候。只需要將它當做尋找所有可能缺失數值的最大問題,那么找到的結果就是最有可能的圖片。
從視覺上觀察由正態分布采樣得到的樣本,僅憑它們就找到概率密度函數是一件似乎很合理的事情。我們只需要選擇最喜歡的統計模型并將其與數據相適應即可。
然而,我們并不會應用這個方法。雖然從簡單分布中恢復概率密度函數是很簡單,但這對于圖像的復雜分布是非常困難和棘手的事情。其復雜性一定程度上是來自于復雜的條件獨立性:圖像中的每個像素值之間都是相互依賴的。因此,最大化一個通用的概率密度函數是一個極其困難而且往往難以解決的非凸優化問題。
小結
第一篇主要介紹了圖像修復的簡單背景,然后就是開始實現的第一步,也是比較偏理論,將我們待處理的圖片數據作為一個概率分布的樣本,并簡單用代碼實現了一維和二維的正態分布函數圖。
在下一篇將介紹第二步內容,也就是快速生成假數據的工作。
歡迎關注我的微信公眾號–機器學習與計算機視覺,或者掃描下方的二維碼,在后臺留言,和我分享你的建議和看法,指正文章中可能存在的錯誤,大家一起交流,學習和進步!
總結
以上是生活随笔為你收集整理的[GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win7主题制作教程 电脑主题制作图文方
- 下一篇: 都说dlib是人脸识别的神器,那到底能不