1. 程式人生 > >計算機視覺與深度學習(12)

計算機視覺與深度學習(12)

  • 簡介
  • 第一步:將影象理解為一個概率分佈的樣本
    • 你是怎樣補全缺失資訊的呢?
    • 但是怎樣著手統計呢?這些都是影象啊。
    • 那麼我們怎樣補全影象?
  • 第二步:快速生成假影象
    • 在未知概率分佈情況下,學習生成新樣本
    • [ML-Heavy] 生成對抗網路(Generative Adversarial Net, GAN) 的架構
    • 使用G(z)生成偽影象
    • [ML-Heavy] 訓練DCGAN
    • 現有的GAN和DCGAN實現
    • [ML-Heavy] 在Tensorflow上構建DCGANs
    • 在圖片集上跑DCGAN
  • 第三步:找到用於影象補全最好的偽影象
    • 使用 DCGAN 進行影象補全
    • [ML-Heavy] 到 pgpg 的投影的損失函式
    • [ML-Heavy] 使用tensorflow來進行DCGAN影象補全
    • 補全影象
  • 結論

簡介

內容識別填充(譯註: Content-aware fill ,是 photoshop 的一個功能)是一個強大的工具,設計師和攝影師可以用它來填充圖片中不想要的部分或者缺失的部分。在填充圖片的缺失或損壞的部分時,影象補全和修復是兩種密切相關的技術。有很多方法可以實現內容識別填充,影象補全和修復。在這篇部落格中,我會介紹 Raymond Yeh 和 Chen Chen 等人的一篇論文,“基於感知和語境損失的影象語義修補(Semantic Image Inpainting with Perceptual and Contextual Losses

)”。論文在2016年7月26號釋出於 arXiv 上,介紹瞭如何使用 DCGAN 網路來進行影象補全。博文面向一般技術背景的讀者,部分內容需要有機器學習的背景。我在相關章節標註了[ML-Heavy]標籤,如果你不想了解太多細節,可以跳過這些章節。我們只會涉及到填充人臉影象缺失部分的情況。博文相關 Tensorflow 程式碼已經發布到 GitHub 上:bamos/dcgan-completion.tensorflow
影象補全分為三個步驟。

  • 首先我們將影象理解為一個概率分佈的樣本。
  • 基於這種理解,學習如何生成偽圖片。
  • 然後我們找到最適合填充回去的偽圖片。

使用photoshop來對影象缺失部分補全
使用photoshop來對影象缺失部分補全

使用photoshop自動刪除不要的部分
使用photoshop自動刪除不要的部分

影象補全
下文將要介紹到的影象補全。影象的中心是自動生成的。原始碼可以從此處下載。
這些影象是我從 LFW 資料集中取得的一個隨機樣本。

第一步:將影象理解為一個概率分佈的樣本

你是怎樣補全缺失資訊的呢?

在上面的例子中,想象你正在構造一個可以填充缺失部分的系統。你會怎麼做呢?你覺得人類大腦是怎麼做的呢?你使用了什麼樣的資訊呢?
在博文中,我們會關注兩種資訊:
語境資訊:你可以通過周圍的畫素來推測缺失畫素的資訊。
感知資訊:你會用“正常”的部分來填充,比如你在現實生活中或其它圖片上看到的樣子。
兩者都很重要。沒有語境資訊,你怎麼知道填充哪一個進去?沒有感知資訊,通過同樣的上下文可以生成無數種可能。有些機器學習系統看起來“正常”的圖片,人類看起來可能不太正常。
如果有一種確切的、直觀的演算法,可以捕獲前文影象補全步驟介紹中提到的兩種屬性,那就再好不過了。對於特定的情況,構造這樣的演算法是可行的。但是沒有一般的方法。目前最好的解決方案是通過統計和機器學習來得到一個近似的技術。

但是怎樣著手統計呢?這些都是影象啊。

為了激發大家的思考,我們從一個很好理解、可以寫成簡潔形式的概率分佈開始:一個正態分佈。這是正態分佈的概率密度函式(PDF)。你可以將PDF理解成在輸入空間橫向移動,縱軸表示某個值出現的概率。(如果你感興趣,繪製這幅圖的程式碼可以從 bamos/dcgan-completion.tensorflow:simple-distributions.py 下載。)

正態分佈的PDF

從這個分佈中取樣,就可以得到一些資料。需要搞清楚的是PDF和樣本之間的聯絡。

從正態分佈中的取樣
從正態分佈中的取樣
2維影象的PDF和取樣
2維影象的PDF和取樣。 PDF 用等高線圖表示,樣本點畫在上面。

這是1維分佈,因為輸入只能沿著一個維度。在兩個維度上也可以這麼做。
在影象和統計學之間,最關鍵的聯絡就是,我們可以將影象看作是從一個高維概率分佈中得到的取樣。概率分佈對應的是影象的畫素。想象你在用相機拍照。得到的影象是由有限個數的畫素組成。當你通過相機拍照的時候,你就在從這個複雜的概率分佈中進行取樣。這個概率分佈就決定了我們判斷一張圖片是正常的,還是不正常的。對於圖片而言,與正態分佈不同的是,我們無法得知真實的概率分佈,我們只能去收集樣本。
在這篇文章中,我們會使用彩色影象,它用 RGB顏色 表示。 我們的影象寬64畫素, 高64畫素, 所以我們的概率分佈是 64⋅64⋅3≈12k 維的。

那麼我們怎樣補全影象?

首先考慮多變數正態分佈, 以求得到一些啟發。給定 x=1 , 那麼 y 最可能的值是什麼?我們可以固定x的值,然後找到使PDF最大的 y。
在多維概率分佈中,給定x,得到最大可能的y
在多維正態分佈中,給定x,得到最大可能的y

這個概念可以很自然地推廣到影象概率分佈。我們已知一些值,希望補全缺失值。這可以簡單理解成一個最大化問題。我們搜尋所有可能的缺失值,用於補全的影象就是可能性最大的值。
從正態分佈的樣本來看,只通過樣本,我們就可以得出PDF。只需挑選你喜歡的 統計模型, 然後擬合數據即可。
然而,我們實際上並沒有使用這種方法。對於簡單分佈來說,PDF很容易得出來。但是對於更復雜的影象分佈來說,就十分困難,難以處理。之所以複雜,一部分原因是複雜的條件依賴:一個畫素的值依賴於影象中其它畫素的值。另外,最大化一個一般的PDF是一個非常困難和棘手的非凸優化問題。

第二步:快速生成假影象

在未知概率分佈情況下,學習生成新樣本

除了學習如何計算PDF之外,統計學中另一個成熟的想法是學習怎樣用 生成模型 生成新的(隨機)樣本。生成模型一般很難訓練和處理,但是後來深度學習社群在這個領域有了一個驚人的突破。Yann LeCun 在這篇 Quora 回答中對如何進行生成模型的訓練進行了一番精彩的論述,並將它稱為機器學習領域近10年來最有意思的想法。

Yann LeCun 對 生成對抗網路的介紹
Yann LeCun 對 生成對抗網路的介紹

街機類比
將生成對抗網路類比為街機遊戲。兩個網路相互對抗,共同進步。就像兩個人類在遊戲中對抗一樣。

其它的深度學習方法,比如 Variational Autoencoders(VAEs),也可以用來訓練生成模型。在這篇博文中,我們用的是生成對抗網路(Generative Adversarial Nets,GANs)。

[ML-Heavy] 生成對抗網路(Generative Adversarial Net, GAN) 的架構

這個想法是 Ian Goodfellow 等人在2014年Neural Information Processing Systems (NIPS) 研討會上發表的里程碑式論文“生成對抗網路”(Generative Adversarial Nets,GANs)中提出的。主要思想是,我們定義一個簡單、常用的分佈,用pzpdatapgz()Gpg==pdata 是五維的,我們可以通過一行python的 numpy 程式碼來進行取樣:

z = np.random.uniform(-1, 1, 5)
array([ 0.77356483,  0.95258473, -0.18345086,  0.69224724, -0.34718733])
  • 1
  • 2
  • 3

現在有了一個用於取樣的簡單分佈,我們定義一個函式 G(z) 來從我們的原始概率分佈中取樣。

def G(z):
   ...
   return imageSample
z = np.random.uniform(-1, 1, 5)
imageSample = G(z)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

構造一個基於深度學習的 G(z)有很多種方式。原始的 GAN 論文提出了一個想法, 一個訓練過程,以及一個初步的實驗結果。這個想法已經被極大地發揚了,其中一個想法在論文“基於深度卷積生成對抗網路的無監督表徵學習(Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks)”中提出,作者是 Alec Radford, Luke Metz, 和 Soumith Chintala, 發表在 2016 International Conference on Learning Representations (ICLR, 讀作 “eye-clear”)上。這篇論文提出了深度卷積GANS(叫做DCGANs),使用微步長卷積來對影象進行上取樣。

那麼什麼是微步長卷積,以及它是怎樣對影象進行上取樣的呢? Vincent Dumoulin 和 Francesco Visin 的論文“深度學習卷積運算指南(A guide to convolution arithmetic for deep learning)”和卷積運算專案是對深度學習中的卷積運算的一個非常好的介紹。 圖例非常棒,可以讓我們對微步長卷積的工作方式有一個直觀的理解。首先,確保你搞懂了一般卷積如何將核心滑過輸入空間(藍色),得到輸出空間(綠色)。此處,輸出比輸入要小。(如果不理解,參閱 CS231n CNN sectionthe convolution arithmetic guide
卷積運算圖示
卷積運算圖示,藍色是輸入,綠色是輸出。

接下來,假設你有一個3X3的輸入。我們的目標是進行上取樣(upsample),這樣,得到一個更大的輸出。你可以將微步長卷積理解為將輸入影象放大,然後在畫素間插入0。 然後在這個放大後的影象上進行卷積操作,得到一個較大的輸出。此處,輸出為5X5。
微步長卷積
微步長卷積運算圖示,藍色是輸入,綠色是輸出。

插一段邊注:進行上取樣的卷積層有很多名字: 全卷積( full convolution), 網內上取樣(in-network upsampling), 微步長卷積(fractionally-strided convolution), 反向卷積(backwards convolution), 反捲積(deconvolution),上卷積(upconvolution), 或者轉置卷積(transposed convolution)。非常不推薦使用術語“反捲積”, 因為這個術語已經有其他含義了: 在某種數學運算,以及計算機視覺的其它應用中,這個術語有完全不同的含義。

現在我們有了微步長卷積結構,可以得到G(z)的表達,以一個向量zpz 作為輸入,輸出一張 64x64x3 的RGB影象。

使用 DCGAN 構造生成器的一種方法。
使用 DCGAN 構造生成器的一種方法。影象來自DCGAN論文

DCGAN 論文也提出了其他的在訓練 DCGANs 時的技巧和調整,比如批量正則化(batch normalization)以及 leaky RELUs。

使用G(z)生成偽影象

讓我們先停下來欣賞一下 G(z) 多麼強大吧!DCGAN 論文給出了DCGAN在臥室資料集訓練出來的樣子。然後 G(z) 可以給出下面的偽影象,生成器認為的臥室是什麼樣子的。下面的圖片都不在原始資料集裡哦!

使用DCGAN生成臥室影象
另外,你也可以在輸入空間z進行代數運算。下面是一個生成人臉的網路。

人臉運算
基於DCGAN的人臉代數運算 DCGAN論文 。

[ML-Heavy] 訓練DCGAN

現在我們已經定義了G(z), 並見識了它多麼強大。那麼我們怎麼訓練它呢?我們有很多未知的變數(引數),需要找到它們。 此時,我們就要用到對抗網路了。
首先我們要定義一些符號。資料的概率分佈(未知的)記作pdata

概率分佈

pzpdatapgz()Gpg==pdata

判別器網路D(x)輸入影象x,返回影象x是從pdata取樣得到的影象時,判別器輸出一個接近0的值。在DCGANs中,D(x)是一個傳統的卷積神經網路。

判別器卷積神經網路
判別器卷積神經網路, 圖片來自 影象恢復論文

訓練判別器的目標是:

  • 1、對於真實資料分佈xpdata的每一張圖片,最大化D(x)。
  • 2、對於不是真實資料分佈xpdata的每一張圖片,最小化D(x)。

生成器G(z)的訓練目標是生成可以迷惑D的樣本。輸出是一張影象,可以作為判別器的輸入。因此,生成器希望最大化D(G(z)),也就是最小化(1-D(G(z))),因為D是一個概率,取值在0和1之間。

論文中提出,對抗網路是通過下面的最小最大策略實現的。第一項中的數學期望遍歷了真實資料分佈,第二項的數學期望遍歷了pz

minGmaxDExpdatalog(D(x)+Ezpz[log(1D(G(z)))] \min_G \max_D E_{x \sim p_{data}} log(D(x)+E_{z∼pz}[log(1−D(G(z)))]

通過這個表示式關於D和G的引數的梯度,可以訓練它們。我們知道如何快速計算這個表示式的每一個部分。數學期望可以通過大小為m的小批資料來估計,內側的最大化可以通過k步梯度來估計。已經證明,k=1是比較適合訓練的值。

我們用θd分佈的樣本。

GAN 論文中的訓練演算法
GAN 論文中的訓練演算法

現有的GAN和DCGAN實現

[ML-Heavy] 在Tensorflow上構建DCGANs

大部分實現程式碼在model.py中的一個python類,DCGAN中。把所有東西放進一個類中是有很多好處的,這樣我們可以在訓練結束後保留住中間過程, 並在之後的使用中載入。

首先我們定義生成器和判別器結構。linear, conv2d_transpose, conv2d, 和 lrelu 函式在 ops.py 中定義。

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

當我們初始化這個類的時候,將要用到這兩個函式來構建模型。我們需要兩個判別器,它們共享(複用)引數。一個用於來自資料分佈的小批影象,另一個用於生成器生成的小批影象。


            
           

相關推薦

計算機視覺深度學習12

簡介 第一步:將影象理解為一個概率分佈的樣本 你是怎樣補全缺失資訊的呢? 但是怎樣著手統計呢?這些都是影象啊。 那麼我們怎樣補全影象? 第二步:快速生成假影象 在未知概率分佈情況下,學習生成新樣本 [ML-Heavy] 生成對抗網路(Genera

計算機視覺深度學習5

1. 引言 其實一開始要講這部分內容,我是拒絕的,原因是我覺得有一種寫高數課總結的感覺。而一般直觀上理解反向傳播演算法就是求導的一個鏈式法則而已。但是偏偏理解這部分和其中的細節對於神經網路的設計和調整優化又是有用的,所以硬著頭皮寫寫吧。 問題描述與

[神經網絡深度學習]使用神經網絡識別手寫數字

線性 部分 logs 結構 這一 可用 調整 重復 http 1.1 感知器 感知器的輸出為: wj為權重,表示相應輸入對輸出的重要性; threshold為閾值,決定神經元的輸出為0或1。 也可用下式表示: 其中b=-threshold,稱為感知器的偏置

斯坦福大學-自然語言處理深度學習CS224n 筆記 第三課 詞向量2

一、word2vec 1、回顧:skip-grams word2vec的主要步驟是遍歷整個語料庫,利用每個視窗的中心詞來預測上下文的單詞,然後對每個這樣的視窗利用SGD來進行引數的更新。 對於每一個視窗而言,我們只有2m+1個單詞(其中m表示視窗的半徑),因此我們計算出來的梯度向量是

斯坦福大學-自然語言處理深度學習CS224n 筆記 第二課 詞向量word vector

課程概要 1、單詞含義 2、word2vec介紹 3、word2vec目標函式的梯度推導 4、目標函式優化:梯度下降法 一、單詞含義 含義(meaning)指的是由單詞表達的觀點。我們一般使用單詞含義的方法是,使用像WordNet那樣的分類詞典,給每個單詞對應的上下義關係以及同義

分享《神經網路深度學習Michael Nielsen 著》中文版PDF+英文版PDF+原始碼

下載:https://pan.baidu.com/s/18_Y7fJMaKwFRKKuGjYIreg 更多資料分享:http://blog.51cto.com/3215120 《神經網路與深度學習(美)Michael Nielsen 著》中文版PDF+英文版PDF+原始碼中文版PDF,206頁,帶書籤目錄

分享《神經網絡深度學習Michael Nielsen 著》中文版PDF+英文版PDF+源代碼

核心 資料 images 學習 核心概念 shadow 圖片 lse 出了 下載:https://pan.baidu.com/s/18_Y7fJMaKwFRKKuGjYIreg 更多資料分享:http://blog.51cto.com/3215120 《神經網絡與深度學習(

計算機視覺模式識別色彩遷移

色彩遷移 這一個學期任務量比較大,主要是計算機視覺這門課和計算機圖形學任務量有點大,所以暑假才有時間更新這系列部落格,這系列部落格主要是利用CImg這個庫來實現一些演算法,而不是應用一些演算法。 下面開始本期的介紹! 1.什麼是色彩遷移? 對於搞CV(Compu

斯坦福大學-自然語言處理深度學習CS224n筆記 第八課 迴圈神經網路

課程概要 1、傳統語言模型 2、迴圈神經網路 3、例項(python) 4、RNN處理的一些技巧 5、針對其他任務的序列模型 6、總結 一、傳統語言模型 語言模型可以計算一些系列的單詞的概率P(w1,…,wT) 可以用來進行機器翻譯 單詞順序:p(the

斯坦福大學-自然語言處理深度學習CS224n筆記 第十課 神經機器翻譯neural machine translationattention模型

本課概要 1、機器翻譯(MT) 2、帶attention的序列模型 3、序列模型解碼器(decoder) 一、機器翻譯(MT) 機器翻譯是一個十分經典的語言理解的測試,涉及語言分析(language analysis)與語言生成(language generat

《神經網路深度學習Michael Nielsen 著》中文版PDF+英文版PDF+原始碼下載

《神經網路和深度學習》是一本免費的線上書。本書會教會你: • 神經網路,一種美妙的受生物學啟發的程式設計正規化,可以讓計算機從觀測資料中進行學習 • 深度學習,一個強有力的用於神經網路絡學習的眾多技術的集合 神經網路和深度學習目前給出了在影象識別、語音識別和自然語言處理領

深入淺出神經網路深度學習-neuroph介紹

1.1   Neuroph如果你是神經網路的初學者,你只是想嘗試一下他們如何工作而不需要複雜的理論和實施,或者你需要他們快速的為你的研究專案,neuroph是很好的選擇。它是小型的,文件化的,易於使用,並且非常靈活的神經網路框架.1.1.1 下載2.9版本下載地址:解壓jav

ARCore之路-計算機視覺之機器學習

一、人腦機制   人腦是一個複雜且功能強大的生物結構,其最主要的神經細胞是構成神經系統的基本單元,稱之為生物神經元,簡稱神經元。神經元主要由三部分構成:   (1)細胞體;   (2)軸突;   (3)樹突。 如下圖所示:   突觸是神經元之間相互連線的介面部分,

ARCore之路-計算機視覺之機器學習

  機器學習遇到的第一個模型便是線性迴歸,而且是一元線性迴歸,但這個最簡單的模型卻包含了很多的知識點,如矩陣計算、最小二乘、梯度下降等等。這是機器學習的入門,理解這些基本概念對後面的學習有極其重要的影響。在這篇文章中,我們主要對迴歸模型進行闡述,然後還會討論梯度下降演算法。我們力求通俗易

ARCore之路-計算機視覺之機器學習

  在前面的章節中,我們看到了我們的裝置如何在ARCore的幫助下,跟蹤使用者,瞭解使用者的世界,併疊加虛擬的物體到真實世界中。ARCore使用裝置的感測器和攝像頭作為輸入,不斷更新對環境的理解,營造出了良好的虛擬現實混合的效果。但是,我們也提及到,如果我們僅僅停留在這一層面,將無法形成

人工智慧AI、機器學習ML深度學習DL概念

人工智慧 電腦科學家們設計可以學習和模仿人類行為的演算法。 機器學習 一種實現人工智慧的方法。機器學習最基本的做法,是使用演算法來解析資料、從中學習,然後對真實世界中的事件做出決策和預測。指通過資料訓練出能完成一定功能的模型,是實現人工智慧的手段之一,

計算機視覺影象處理——卷積opencv

VideoCapture cap(0); //開啟預設攝像頭裝置 //1.VideoCapture cap(in device); 如果只有一個裝置,device只通過0

計算機視覺深度相機--TOF總結

TOF技術採用主動光探測方式,與一般光照需求不一樣的是,TOF照射單元的目的不是照明,而是利用入射光訊號與反射光訊號的變化來進行距離測量,所以,TOF的照射單元都是對光進行高頻調製之後再進行發射,比如下圖所示的採用LED或鐳射二極體發射的脈衝光,脈衝可達到100MHz。與普通相機類似,TOF相機晶片前端需要一

非監督特徵學習深度學習----使用卷積進行特徵提取

使用卷積進行特徵提取(Feature Extraction Using Convolution) 概覽(Overview) 在之前的練習中的圖片解析度都偏低,如手寫數字影象。在本節中將會學到一種方法,能夠用在實際中更大的影象資料集上。

斯坦福大學-自然語言處理深度學習CS224n 筆記 第六課 依存句法分析

課程概要 1、句法結構:成分句法、依存句法 2、依存語法 3、 Transition-based依存句法分析 4、神經網路的依存句法分析 一、句法結構:成分句法、依存句法 二、依存語法 三、Transition-based依存句法分析 四、神經網路的依存句