圖像翻譯——pix2pix模型

NO IMAGE

1.介紹

圖像處理、計算機圖形學和計算機視覺中的許多問題都可以被視為將輸入圖像“翻譯”成相應的輸出圖像。 “翻譯”常用於語言之間的翻譯,比如中文和英文的之間的翻譯。但圖像翻譯的意思是圖像與圖像之間以不同形式的轉換。比如:一個圖像場景可以以RGB圖像、梯度場、邊緣映射、語義標籤映射等形式呈現,其效果如下圖。

圖像翻譯——pix2pix模型

傳統圖像轉換過程中都是針對具體問題採用特定算法去解決;而這些過程的本質都是根據像素點(輸入信息)對像素點做出預測(predict from pixels to pixels),Pix2pix的目標就是建立一個通用的架構去解決以上所有的圖像翻譯問題,使得我們不必要為每個功能都重新設計一個損失函數。

2. 核心思想

2.1 圖像建模的結構化損失

圖像到圖像的翻譯問題通常是根據像素分類或迴歸來解決的。這些公式將輸出空間視為**“非結構化”**,即在給定輸入圖像的情況下,每個輸出像素被視為與所有其他像素有條件地獨立。而cGANs( conditional-GAN)的不同之處在於學習結構化損失,並且理論上可以懲罰輸出和目標之間的任何可能結構。

2.2 cGAN

在此之前,許多研究者使用 GAN 在修復、未來狀態預測、用戶約束引導的圖像處理、風格遷移和超分辨率方面取得了令人矚目的成果,但每種方法都是針對特定應用而定製的。Pix2pix框架不同之處在於沒有特定應用。它在生成器和判別器的幾種架構選擇中也與先前的工作不同。對於生成器,我們使用基於“U-Net”的架構;對於鑑別器,我們使用卷積“PatchGAN”分類器,其僅在image patches(圖片小塊)的尺度上懲罰結構。

Pix2pix 是借鑑了 cGAN 的思想。cGAN 在輸入 G 網絡的時候不光會輸入噪音,還會輸入一個條件(condition),G 網絡生成的 fake images 會受到具體的 condition 的影響。那麼如果把一副圖像作為 condition,則生成的 fake images  就與這個 condition images 有對應關係,從而實現了一個 Image-to-Image Translation  的過程。Pixpix 原理圖如下:

圖像翻譯——pix2pix模型

Pix2pix 的網絡結構如上圖所示,生成器 G 用到的是 U-Net 結構,輸入的輪廓圖x編碼再解碼成真實圖片,判別器 D 用到的是作者自己提出來的條件判別器 PatchGAN ,判別器 D 的作用是在輪廓圖 x的條件下,對於生成的圖片G(x)判斷為假,對於真實圖片判斷為真。

2.3 cGAN 與 Pix2pix 對比

圖像翻譯——pix2pix模型

2.4 損失函數

一般的 cGANs 的目標函數如下:

圖像翻譯——pix2pix模型

其中 G 試圖最小化目標而 D 則試圖最大化目標,即:圖像翻譯——pix2pix模型

為了做對比,同時再去訓練一個普通的 GAN ,即只讓 D 判斷是否為真實圖像。

圖像翻譯——pix2pix模型

對於圖像翻譯任務而言,G 的輸入和輸出之間其實共享了很多信息,比如圖像上色任務、輸入和輸出之間就共享了邊信息。因而為了保證輸入圖像和輸出圖像之間的相似度、還加入了 L1 Loss:

圖像翻譯——pix2pix模型

生成的 fake images 與 真實的 real images 之間的 L1 距離,(imgB**’** 和imgB)保證了輸入和輸出圖像的相似度。

最終的損失函數:

圖像翻譯——pix2pix模型

3.網絡架構(網絡體系結構)

生成器和判別器都使用模塊 convolution-BatchNorm-ReLu

3.1 生成網絡G

圖像到圖像翻譯問題的一個定義特徵是它們將高分辨率輸入網格映射到高分辨率輸出網格。 另外,對於我們考慮的問題,輸入和輸出的表面外觀不同,但兩者應該共享一些信息。 因此,輸入中的結構與輸出中的結構大致對齊。 我們圍繞這些考慮設計了生成器架構。

圖像翻譯——pix2pix模型

U-Net 結構基於 Encoder-Decoder 模型,而 Encoder 和 Decoder 是對稱結構。 U-Net 的不同之處是將第 i 層和第 n-i 層連接起來,其中 n 是層的總數,這種連接方式稱為跳過連接(skip connections)。第 i 層和第 n-i 層的圖像大小是一致的,可以認為他們承載著類似的信息 。

3.2 判別網絡 D

用損失函數 L1 和 L2 重建的圖像很模糊,也就是說L1和L2並不能很好的恢復圖像的高頻部分(圖像中的邊緣等),但能較好地恢復圖像的低頻部分(圖像中的色塊)。

圖像的高低頻是對圖像各個位置之間強度變化的一種度量方法,低頻分量:主要對整副圖像的強度的綜合度量。高頻分量:主要是對圖像邊緣和輪廓的度量。如果一副圖像的各個位置的強度大小相等,則圖像只存在低頻分量,從圖像的頻譜圖上看,只有一個主峰,且位於頻率為零的位置。如果一副圖像的各個位置的強度變化劇烈,則圖像不僅存在低頻分量,同時也存在多種高頻分量,從圖像的頻譜上看,不僅有一個主峰,同時也存在多個旁峰。

為了能更好得對圖像的局部做判斷,Pix2pix 判別網絡採用 patchGAN 結構,也就是說把圖像等分成多個固定大小的 Patch,分別判斷每個Patch的真假,最後再取平均值作為 D 最後的輸出。這樣做的好處:

  • D  的輸入變小,計算量小,訓練速度快。
  • 因為 G 本身是全卷積的,對圖像尺度沒有限制。而D如果是按照Patch去處理圖像,也對圖像大小沒有限制。就會讓整個 Pix2pix 框架對圖像大小沒有限制,增大了框架的擴展性。

論文中將 PatchGAN 看成另一種形式的紋理損失或樣式損失。在具體實驗時,採用不同尺寸的 patch,發現 70×70 的尺寸比較合適。

3.3 優化和推理

訓練使用的是標準的方法:交替訓練 D 和 G;並使用了 minibatch SGD 和 Adam 優化器。

在推理的時候,我們用訓練階段相同的方式來運行生成器。在測試階段使用 dropout 和 batch normalization,這裡我們使用 test batch 的統計值而不是 train batch 的。

4.源碼解讀

該部分主要是解讀論文源碼:github.com/junyanz/pyt… 。

圖像翻譯——pix2pix模型

  • 文件 train:

通用的訓練腳本,可以通過傳參指定訓練不同的模型和不同的數據集。

--model: e.g.,pix2pix,cyclegan,colorization

--dataset_mode: e.g.,aligned,unaligned,single,colorization)

  • 文件test:

通用的測試腳本,通過傳參來加載模型 -- checkpoints_dir,保存輸出的結果 --results_dir

4.1 文件夾data:

該目錄中的文件包含數據的加載和處理以及用戶可製作自己的數據集。下面詳細說明data下的文件:

  • __init__.py: 實現包和train、test腳本之間的接口。train.py 和 test.py 根據給定的 opt 選項調包來創建數據集 from data import create_datasetdataset = create_dataset(opt)
  • **base_dataset.py:**繼承了 torch 的 dataset 類和抽象基類,該文件還包括了一些常用的圖片轉換方法,方便後續子類使用。
  • **image_folder.py:**更改了官方pytorch的image folder的代碼,使得從當前目錄和子目錄都能加載圖片。
  • **template_dataset.py:**為製作自己數據集提供了模板和參考,裡面註釋一些細節信息。
  • aligned_dataset.py 和 **unaligned_dataset.py:**區別在於前者從同一個文件夾中加載的是一對圖片 {A,B} ,後者是從兩個不同的文件夾下分別加載 {A},{B} 。
  • **single_dataset.py:**只加載指定路徑下的一張圖片。
  • **colorization_dataset.py:**加載一張 RGB 圖片並轉化成(L,ab)對在 Lab 彩色空間,pix2pix用來繪製彩色模型。

4.2 文件夾models:

models 包含的模塊有:目標函數,優化器,網絡架構。下面詳細說明models下的文件:

  • __init__.py: 為了實現包和train、test腳本之間的接口。train.py 和 test.py 根據給定的 opt 選項調包來創建模型 from models import create_model 和 model = create_model(opt)
  • base_model.py: 繼承了抽象類,也包括一些其他常用的函數:setuptestupdate_learning_ratesave_networksload_networks,在子類中會被使用。
  • template_model.py: 實現自己模型的一個模板,裡面註釋了一些細節。
  • pix2pix_model.py: 實現了pix2pix 模型,模型訓練數據集--dataset_mode aligned,默認情況下--netG unet256 --netD basicdiscriminator (PatchGAN)。 --gan_mode vanillaGAN loss (標準交叉熵)。
  • **colorization_model.py:**繼承了pix2pix_model,模型所做的是:將黑白圖片映射為彩色圖片。-dataset_model colorization dataset。默認情況下,colorization dataset會自動設置--input_nc 1and--output_nc 2
  • **cycle_gan_model.py:**來實現cyclegan模型。--dataset_mode unaligneddataset,--netG resnet_9blocksResNet generator,--netD basicdiscriminator (PatchGAN introduced by pix2pix),a least-square GANsobjective(--gan_mode lsgan )
  • **networks.py:**包含生成器和判別器的網絡架構,normalization layers,初始化方法,優化器結構(learning rate policy)GAN的目標函數(vanilla,lsgan,wgangp)。
  • **test_model.py:**用來生成cyclegan的結果,該模型自動設置--dataset_mode single

4.3 文件夾options:

包含訓練模塊,測試模塊的設置TrainOptions和TestOptions都是 BaseOptions的子類。詳細說明options下的文件。

  • **init.py:**該文件起到讓python解釋器將options文件夾當做包來處理。
  • **base_options.py:**除了training,test都用到的option,還有一些helper 方法:parsing,printing,saving options。
  • **train_options.py:**訓練需要的options。
  • test_options.py:測試需要的options。

4.4 文件夾utils:

主要包含一些有用的工具,如數據的可視化。詳細說明utils下的文件:

  • **init.py:**該文件起到讓python解釋器將utils文件夾當做包來處理。
  • **get_data.py:**用來下載數據集的腳本。
  • **html.py:**保存圖片寫成html。基於diminate中的DOM API。
  • **image_pool.py:**實現一個緩衝來存放之前生成的圖片。
  • **visualizer.py:**保存圖片,展示圖片。
  • **utils.py:**包含一些輔助函數:tensor2numpy轉換,mkdir診斷網絡梯度等。

5. 總結與展望

5.1 pix2pix的優缺點

Pix2pix模型是 x到y之間的一對一映射**。也就說,pix2pix就是對ground truth的重建:輸入輪廓圖→經過Unet編碼解碼成對應的向量→解碼成真實圖。這種一對一映射的應用範圍十分有限,當我們輸入的數據與訓練集中的數據差距較大時,生成的結果很可能就沒有意義,這就要求我們的數據集中要儘量涵蓋各種類型。

本文將Pix2Pix論文中的所有要點都表述了出來,主要包括:

  • cGAN,輸入為圖像而不是隨機向量
  • U-Net,使用skip-connection來共享更多的信息
  • Pair輸入到D來保證映射
  • Patch-D來降低計算量提升效果
  • L1損失函數的加入來保證輸入和輸出之間的一致性

5.2 總結

目前,您可以在  Mo 平臺的應用中心中找到 pix2pixGAN,可以體驗論文實驗部分圖像建築標籤→照片( Architectural labels→photo),即將您繪製的建築圖片草圖生成為你心目中的小屋 。您在學習的過程中,遇到困難或者發現我們的錯誤,可以隨時聯繫我們。

通過本文,您應該初步瞭解Pix2pix模型的網絡結構和實現原理,以及關鍵部分代碼的初步實現。如果您對深度學習tensorflow比較瞭解,可以參考tensorflow版實現Pix2pix;如果您對pytorch框架比較熟悉,可以參考pytorch實現Pix2pix;如果您想更深入的學習瞭解starGAN原理,可以參考論文

6.參考:

1.論文:arxiv.org/pdf/1611.07…

2.Pix2pix官網:phillipi.github.io/pix2pix/

3.代碼PyTorch版本:github.com/phillipi/pi…

4.代碼tensorflow版本:github.com/yenchenlin/…

5.代碼tensorflow版本:github.com/affinelayer…

6.知乎:zhuanlan.zhihu.com/p/38411618

7.知乎:zhuanlan.zhihu.com/p/55059359

8.博客:blog.csdn.net/qq_16137569…

9.博客:blog.csdn.net/infinita_LV…

10.博客:blog.csdn.net/weixin_3647…

關於我們

Mo(網址:momodel.cn)是一個支持 Python 的人工智能在線建模平臺,能幫助你快速開發、訓練並部署模型。


Mo 人工智能俱樂部 是由網站的研發與產品設計團隊發起、致力於降低人工智能開發與使用門檻的俱樂部。團隊具備大數據處理分析、可視化與數據建模經驗,已承擔多領域智能項目,具備從底層到前端的全線設計開發能力。主要研究方向為大數據管理分析與人工智能技術,並以此來促進數據驅動的科學研究。

目前俱樂部每週六在杭州舉辦以機器學習為主題的線下技術沙龍活動,不定期進行論文分享與學術交流。希望能匯聚來自各行各業對人工智能感興趣的朋友,不斷交流共同成長,推動人工智能民主化、應用普及化。

圖像翻譯——pix2pix模型

相關文章

電商購物評論的情感分析

積神經網絡GoogLeNet

殘差網絡

卷積神經網絡AlexNet