圖像處理、計算機圖形學和計算機視覺中的許多問題均可以被視爲將輸入圖像「翻譯」成相應的輸出圖像。 「翻譯」經常使用於語言之間的翻譯,好比中文和英文的之間的翻譯。但圖像翻譯的意思是圖像與圖像之間以不一樣形式的轉換。好比:一個圖像場景能夠以RGB圖像、梯度場、邊緣映射、語義標籤映射等形式呈現,其效果以下圖。html
傳統圖像轉換過程當中都是針對具體問題採用特定算法去解決;而這些過程的本質都是根據像素點(輸入信息)對像素點作出預測(predict from pixels to pixels),Pix2pix的目標就是創建一個通用的架構去解決以上全部的圖像翻譯問題,使得咱們沒必要要爲每一個功能都從新設計一個損失函數。前端
圖像到圖像的翻譯問題一般是根據像素分類或迴歸來解決的。這些公式將輸出空間視爲「非結構化」,即在給定輸入圖像的狀況下,每一個輸出像素被視爲與全部其餘像素有條件地獨立。而cGANs( conditional-GAN)的不一樣之處在於學習結構化損失,而且理論上能夠懲罰輸出和目標之間的任何可能結構。python
在此以前,許多研究者使用 GAN 在修復、將來狀態預測、用戶約束引導的圖像處理、風格遷移和超分辨率方面取得了使人矚目的成果,但每種方法都是針對特定應用而定製的。Pix2pix框架不一樣之處在於沒有特定應用。它在生成器和判別器的幾種架構選擇中也與先前的工做不一樣。對於生成器,咱們使用基於「U-Net」的架構;對於鑑別器,咱們使用卷積「PatchGAN」分類器,其僅在image patches(圖片小塊)的尺度上懲罰結構。git
Pix2pix 是借鑑了 cGAN 的思想。cGAN 在輸入 G 網絡的時候不光會輸入噪音,還會輸入一個條件(condition),G 網絡生成的 fake images 會受到具體的 condition 的影響。那麼若是把一副圖像做爲 condition,則生成的 fake images 就與這個 condition images 有對應關係,從而實現了一個 Image-to-Image Translation 的過程。Pixpix 原理圖以下:github
Pix2pix 的網絡結構如上圖所示,生成器 G 用到的是 U-Net 結構,輸入的輪廓圖x編碼再解碼成真實圖片,判別器 D 用到的是做者本身提出來的條件判別器 PatchGAN ,判別器 D 的做用是在輪廓圖 x的條件下,對於生成的圖片G(x)判斷爲假,對於真實圖片判斷爲真。算法
通常的 cGANs 的目標函數以下:網絡
$L_{cGAN}(G, D) =E_{x,y}[log D(x, y)]+E_{x,z}[log(1 − D(x, G(x, z))]$架構
其中 G 試圖最小化目標而 D 則試圖最大化目標,即:$\rm G^∗ =arg; min_G; max_D ;L_{cGAN}(G, D)$app
爲了作對比,同時再去訓練一個普通的 GAN ,即只讓 D 判斷是否爲真實圖像。框架
$\rm L_{cGAN}(G, D) = E_y[log D(y)]+ E_{x,z}[log(1 − D(G(x, z))]$
對於圖像翻譯任務而言,G 的輸入和輸出之間其實共享了不少信息,好比圖像上色任務、輸入和輸出之間就共享了邊信息。於是爲了保證輸入圖像和輸出圖像之間的類似度、還加入了 L1 Loss:
$\rm L_{L1}(G) = E_{x,y,z}[||y − G(x, z)||_1] $
即生成的 fake images 與 真實的 real images 之間的 L1 距離,(imgB' 和imgB)保證了輸入和輸出圖像的類似度。
最終的損失函數:
$\rm G^∗ = arg;\underset{G}{min};\underset{D}{max}; L_{cGAN}(G, D) + λL_{L1}(G)$
生成器和判別器都使用模塊 convolution-BatchNorm-ReLu
圖像到圖像翻譯問題的一個定義特徵是它們將高分辨率輸入網格映射到高分辨率輸出網格。 另外,對於咱們考慮的問題,輸入和輸出的表面外觀不一樣,但二者應該共享一些信息。 所以,輸入中的結構與輸出中的結構大體對齊。 咱們圍繞這些考慮設計了生成器架構。
U-Net 結構基於 Encoder-Decoder 模型,而 Encoder 和 Decoder 是對稱結構。 U-Net 的不一樣之處是將第 i 層和第 n-i 層鏈接起來,其中 n 是層的總數,這種鏈接方式稱爲跳過鏈接(skip connections)。第 i 層和第 n-i 層的圖像大小是一致的,能夠認爲他們承載着相似的信息 。
用損失函數 L1 和 L2 重建的圖像很模糊,也就是說L1和L2並不能很好的恢復圖像的高頻部分(圖像中的邊緣等),但能較好地恢復圖像的低頻部分(圖像中的色塊)。
圖像的高低頻是對圖像各個位置之間強度變化的一種度量方法,低頻份量:主要對整副圖像的強度的綜合度量。高頻份量:主要是對圖像邊緣和輪廓的度量。若是一副圖像的各個位置的強度大小相等,則圖像只存在低頻份量,從圖像的頻譜圖上看,只有一個主峯,且位於頻率爲零的位置。若是一副圖像的各個位置的強度變化劇烈,則圖像不只存在低頻份量,同時也存在多種高頻份量,從圖像的頻譜上看,不只有一個主峯,同時也存在多個旁峯。
爲了能更好得對圖像的局部作判斷,Pix2pix 判別網絡採用 patchGAN 結構,也就是說把圖像等分紅多個固定大小的 Patch,分別判斷每一個Patch的真假,最後再取平均值做爲 D 最後的輸出。這樣作的好處:
論文中將 PatchGAN 當作另外一種形式的紋理損失或樣式損失。在具體實驗時,採用不一樣尺寸的 patch,發現 70x70 的尺寸比較合適。
訓練使用的是標準的方法:交替訓練 D 和 G;並使用了 minibatch SGD 和 Adam 優化器。
在推理的時候,咱們用訓練階段相同的方式來運行生成器。在測試階段使用 dropout 和 batch normalization,這裏咱們使用 test batch 的統計值而不是 train batch 的。
該部分主要是解讀論文源碼:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix 。
通用的訓練腳本,能夠經過傳參指定訓練不一樣的模型和不一樣的數據集。
--model
: e.g.,pix2pix
,cyclegan
,colorization
--dataset_mode
: e.g.,aligned
,unaligned
,single
,colorization
)
通用的測試腳本,經過傳參來加載模型 -- checkpoints_dir
,保存輸出的結果 --results_dir
。
該目錄中的文件包含數據的加載和處理以及用戶可製做本身的數據集。下面詳細說明data下的文件:
__init__.py
: 實現包和train、test腳本之間的接口。train.py 和 test.py 根據給定的 opt 選項調包來建立數據集 from data import create_dataset
和dataset = 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用來繪製彩色模型。models 包含的模塊有:目標函數,優化器,網絡架構。下面詳細說明models下的文件:
__init__.py
: 爲了實現包和train、test腳本之間的接口。train.py
和 test.py
根據給定的 opt 選項調包來建立模型 from models import create_model
和 model = create_model(opt)
。setup
、test
、update_learning_rate
、save_networks
、load_networks
,在子類中會被使用。--dataset_mode aligned
,默認狀況下--netG unet256 --netD basic
discriminator (PatchGAN)。 --gan_mode vanilla
GAN loss (標準交叉熵)。-dataset_model colorization
dataset。默認狀況下,colorization
dataset會自動設置--input_nc 1
and--output_nc 2
。--dataset_mode unaligned
dataset,--netG resnet_9blocks
ResNet generator,--netD basic
discriminator (PatchGAN introduced by pix2pix),a least-square GANsobjective(--gan_mode lsgan
)vanilla
,lsgan
,wgangp
)。--dataset_mode single
。包含訓練模塊,測試模塊的設置TrainOptions和TestOptions
都是 BaseOptions
的子類。詳細說明options下的文件。
主要包含一些有用的工具,如數據的可視化。詳細說明utils下的文件:
Pix2pix模型是 x到y之間的一對一映射**。也就說,pix2pix就是對ground truth的重建:輸入輪廓圖→通過Unet編碼解碼成對應的向量→解碼成真實圖。這種一對一映射的應用範圍十分有限,當咱們輸入的數據與訓練集中的數據差距較大時,生成的結果極可能就沒有意義,這就要求咱們的數據集中要儘可能涵蓋各類類型。
本文將Pix2Pix論文中的全部要點都表述了出來,主要包括:
目前,您能夠在 Mo 平臺的應用中心中找到 pix2pixGAN,能夠體驗論文實驗部分圖像建築標籤→照片( Architectural labels→photo),即將您繪製的建築圖片草圖生成爲你心目中的小屋 。您在學習的過程當中,遇到困難或者發現咱們的錯誤,能夠隨時聯繫咱們。
經過本文,您應該初步瞭解Pix2pix模型的網絡結構和實現原理,以及關鍵部分代碼的初步實現。若是您對深度學習tensorflow比較瞭解,能夠參考tensorflow版實現Pix2pix;若是您對pytorch框架比較熟悉,能夠參考pytorch實現Pix2pix;若是您想更深刻的學習瞭解starGAN原理,能夠參考論文。
1.論文:https://arxiv.org/pdf/1611.07004.pdf
2.Pix2pix官網:https://phillipi.github.io/pix2pix/
3.代碼PyTorch版本:https://github.com/phillipi/pix2pix
4.代碼tensorflow版本:https://github.com/yenchenlin/pix2pix-tensorflow
5.代碼tensorflow版本:https://github.com/affinelayer/pix2pix-tensorflow
6.知乎:https://zhuanlan.zhihu.com/p/38411618
7.知乎:https://zhuanlan.zhihu.com/p/55059359
8.博客:https://blog.csdn.net/qq_16137569/article/details/79950092
9.博客:https://blog.csdn.net/infinita_LV/article/details/85679195
10.博客:https://blog.csdn.net/weixin_36474809/article/details/89004841
Mo(網址:momodel.cn)是一個支持 Python 的人工智能在線建模平臺,能幫助你快速開發、訓練並部署模型。
Mo 人工智能俱樂部 是由網站的研發與產品設計團隊發起、致力於下降人工智能開發與使用門檻的俱樂部。團隊具有大數據處理分析、可視化與數據建模經驗,已承擔多領域智能項目,具有從底層到前端的全線設計開發能力。主要研究方向爲大數據管理分析與人工智能技術,並以此來促進數據驅動的科學研究。
目前俱樂部每週六在杭州舉辦以機器學習爲主題的線下技術沙龍活動,不按期進行論文分享與學術交流。但願能匯聚來自各行各業對人工智能感興趣的朋友,不斷交流共同成長,推進人工智能民主化、應用普及化。