一文讀懂GAN, pix2pix, CycleGAN和pix2pixHD

本文翻譯、總結自朱儁彥的線上報告,主要講了如何用機器學習生成圖片。

來源Games2018 Webinar 64期 :Siggraph 2018優秀博士論文報告

人員信息

主講嘉賓

姓名朱儁彥(Jun-Yan Zhu)
現狀:麻省理工學院博士後(PostDoc at MIT),計算機科學與人工智能實驗室(Computer Science and Artificial Intelligence Laboratory, CSAIL)
個人主頁http://people.csail.mit.edu/junyanz/

主持人

周曉巍
現狀:浙江大學CAD&CG國家重點實驗室
個人主頁http://www.cad.zju.edu.cn/home/xzhou/

報告內容

這是機器學習滴時代!

計算機視覺(Computer Vision, CV)領域近年來發生了巨大的變化。在2012年之前,CV的主要研究方法是使用人工設計(hand-designed)的特徵完成各種任務(見下圖)。
這裏寫圖片描述

2012年使用深度神經網絡(Deep Neural Network, DNN)ImageNet的分類任務上取得了巨大成功(見下圖)。
這裏寫圖片描述

從此深度學習(Deep Learning)的相關研究如火如荼地展開了,比如說下面這三個栗子:
1. 物體識別(Object detection) [Redmon etal., 2018]
2. 對人體的理解(Human understanding) [Guler et al., 2018]
3. 自動駕駛(Autonomous driving) [Zhao et al., 2017]

這裏寫圖片描述

圖形學中的嘗試:趁手的武器 or 白費功夫?

在傳統的圖形學管線(pipeline)中,輸出圖像需要經過建模、材質貼圖、光照、渲染等一系列繁瑣的步驟(見下圖)。
這裏寫圖片描述

現在大家看到了Deep Learning的潛力,那我們自然的就有個想法:有沒有可能使用Deep Learning簡化計算機圖形學(Computer Graphics)的研究呢?

一個直接的想法是把DNN“倒過來用”。之前的DNN可能是輸入一幅圖像,輸出一個標籤(比如說貓),那我們能不能輸入“貓”這個字,輸出一張貓的照片呢?
這裏寫圖片描述

很遺憾,答案是No!因爲這種任務實在太複雜啦!我們很難讓DNN憑空輸出圖像這樣的高維數據(High dimensional data)(這裏的“高維”可以理解成數據量大)。實際上,在很長一段時間裏,DNN只能輸出數字這種簡單的、低分別率的小圖像,就像下面這樣:
這裏寫圖片描述

而想要生成想遊戲場景這類的圖片,這種方法根本沒用。所以,我們必須得想出更厲害滴東西完成這項任務(使命感爆棚)!

:這裏的“高維”可以理解成數據量大。

GAN就完了?Naive!

於是…在月黑風高的某一天(畫風逐漸跑偏),一個叫做生成對抗網絡(Generative Adversarial Network)——也就是大名鼎鼎的GAN——的東西橫空出世。作者是下面這位小哥和他的小夥伴們:
這裏寫圖片描述

那麼,我們該怎麼GAN出圖像呢?且聽我細細道來~

一般來說,GAN中包含兩種類型的網絡GD 。其中,GGenerator,它的作用是生成圖片,也就是說,在輸入一個隨機編碼(random code)z 之後,它將輸出一幅由神經網絡自動生成的、假的圖片G(z)

另外一個網絡DDiscriminator是用來判斷的,它接受G 輸出的圖像作爲輸入,然後判斷這幅圖像的真假,真的輸出1,假的輸出0。

這裏寫圖片描述

在兩個網絡互相博弈(金坷垃日本人:不邀噠架)的過程中,兩個網絡的能力都越來越高:G 生成的圖片越來越像真的圖片,D 也越來越會判斷圖片的真假。到了這一步,我們就能“卸磨殺驢”——丟掉D 不要了,把G 拿來用作圖片生成器。

正式一點兒講(上公式啦),我們就是要在最大化D 的能力的前提下,最小化DG 的判斷能力,這是一個最小最大值問題,它的學習目標是:

minGmaxDE[logD(G(z))+log(1D(x))]

爲了增強D 的能力,我們分別考慮輸入真的圖像和假的圖像的情況。上式中第一項的D(G(z)) 處理的是假圖像G(z) ,這時候評分D(G(z)) 需要盡力降低;第二項處理的是真圖像x ,這時候的評分要

GAN的侷限性

即便如此,傳統的GAN也不是萬能的,它有下面兩個不足:

1. 沒有用戶控制(user control)能力

在傳統的GAN裏,輸入一個隨機噪聲,就會輸出一幅隨機圖像。
這裏寫圖片描述
但用戶是有想法滴,我們想輸出的圖像是我們想要的那種圖像,和我們的輸入是對應的、有關聯的。比如輸入一隻喵的草圖,輸出同一形態的喵的真實圖片(這裏對形態的要求就是一種用戶控制)。
這裏寫圖片描述

2. 低分辨率(Low resolution)和低質量(Low quality)問題

儘管生成的圖片看起來很不錯,但如果你放大看,就會發現細節相當模糊
這裏寫圖片描述

怎樣改善?

前面說過傳統的GAN的種種侷限,那麼現在,我們相應的目標就是:
- 提高GAN的用戶控制能力
- 提高GAN生成圖片的分辨率和質量

爲了達到這樣的目標,和把大象裝到冰箱裏一樣,總共分三步:
1. pix2pix:有條件地使用用戶輸入,它使用成對的數據(paired data)進行訓練。
2. CycleGAN:使用不成對的數據(unpaired data)的就能訓練。
3. pix2pixHD:生成高分辨率、高質量的圖像。
這裏寫圖片描述

下面分別進行詳細敘述~

pix2pix

pix2pix對傳統的GAN做了個小改動,它不再輸入隨機噪聲,而是輸入用戶給的圖片:

這裏寫圖片描述

但這也就產生了新的問題:我們怎樣建立輸入和輸出的對應關係。此時G 的輸出如果是下面這樣,D 會判斷是真圖:
這裏寫圖片描述
但如果G 的輸出是下面這樣的,D 拿來一看,也會**認爲是真的圖片**QAQ…也就是說,這樣做並不能訓練出輸入和輸出對應的網絡G ,因爲是否對應根本不影響D 的判斷。
這裏寫圖片描述

爲了體現這種對應關係,解決方案也很簡單,你可以也已經想到了:我們把G 的輸入和輸出一起作爲D 的輸入不就好了?於是現在的優化目標變成了這樣:
這裏寫圖片描述

這項研究還是挺成功的,大家可以去這裏在線體驗一下demo,把草圖(sketch)變成圖片。

這裏寫圖片描述

當然,有些比較皮的用戶輸入了奇形怪狀的草圖,然後畫風就變成了這樣:
這裏寫圖片描述

應用

pix2pix的核心是有了對應關係,這種網絡的應用範圍還是比較廣泛的,比如:

  1. 草圖變圖片[Isola, Zhu, Zhou, Efros, 2016]:
    這裏寫圖片描述
  2. 灰度圖變彩色圖[Isola, Zhu, Zhou, Efros, 2016]:
    這裏寫圖片描述
  3. 自動着色 Data from [Russakovsky et al. 2015]:
    這裏寫圖片描述
  4. 交互式着色[Zhang*, Zhu*, Isola, Geng, Lin, Yu, Efros, 2017]:
    這裏寫圖片描述

CycleGAN

pix2pix必須使用成對的數據進行訓練。
這裏寫圖片描述
但很多情況下成對數據是很難獲取到的,比如說,我們想把馬變成斑馬,現實生活中是不存在對應的真實照片的:
這裏寫圖片描述

現在我們就用Cycle-constraint Adversarial Network也就是CycleGAN解決這個問題。這種網絡不需要成對的數據,只需要輸入數據的一個集合(比如一堆馬的照片)和輸出數據的一個集合(比如一堆斑馬的照片)就可以了。

這裏寫圖片描述

但是(沒錯我又要說但是了),直接使用不成對的數據是不奏效的。網絡會直接忽略輸入,隨機產生輸出!所以,我們還得對網絡增加限制(constraint)才行。

那怎麼加限制呢?我們來思考一個現實問題。馬克吐溫認爲,如果一把一段話從英文翻譯成法文,再從法文翻譯回英文,那麼你應該得到跟之前原始輸入的英文一樣的內容。這裏也是一樣,如果我們把馬變成斑馬,然後再變回馬,那麼最後的馬和開始輸入的馬應該是一樣的。
這裏寫圖片描述

下面講一下具體技術細節。除了之前提到的把馬變成斑馬的網絡G ,我們還需要一個把斑馬變回馬的網絡F
那麼,一匹馬xG 變成斑馬s=G(x) ,然後再用F 把它變回馬F(s) ,得到的馬和一開始的馬應該是一樣的,也就是x=F(G(x))

這裏寫圖片描述
反過來,斑馬變馬再變回斑馬也要滿足要求,注意這一步不能省(請讀者自己想一想爲什麼)!
這裏寫圖片描述

我們同時優化GF ,最後就能拿到一個想要的網絡G

CycleGAN爲什麼有效

CycleGAN成功的原因在於它分離了風格(Style)內容(content)。人工設計這種分離的算法是很難的,但有了神經網絡,我們很容易讓它學習者去自動保持內容而改變風格

效果展示

下面是效果展示環節~

馬變斑馬

兩張圖片分別是原來的馬和G duang的一下變出的斑馬:
這裏寫圖片描述
這裏寫圖片描述

橘子變蘋果:

這裏寫圖片描述
這裏寫圖片描述

可以看到,CycleGAN能夠比較準確的找到橘子的位置,並把它變成蘋果。

圖像風格的遷移:

這裏寫圖片描述

這裏寫圖片描述

遊戲場景替換

這個應用就很酷了,它以一些德國城市的照片作爲輸入,成功替換了遊戲GTA5中的場景!
這裏寫圖片描述
這裏寫圖片描述

失敗例子

在輸入騎馬的普京大帝照片時,輸出圖像裏把普京也變成了斑馬。
這裏寫圖片描述

這是因爲,訓練圖像裏並沒有騎馬的人,所以網絡就傻掉了。

目前暫且的解決辦法是先用Mask R-CNN做圖像分割之後再針對馬進行變化,不過這個效果也不好,因爲人和馬在圖像上有重疊的部分。這個問題需要未來解決。

源代碼

這裏給出CycleGAN和pix2pix的github項目

這是2017年github最受歡迎的項目之一,截止到本文寫作時間(2018年9月),已經有5000+ Star了:
這裏寫圖片描述

課程

CycleGAN現在非常火,以致於很多大學和在線平臺都開設了它的課程:
這裏寫圖片描述

用戶的結果

下面是這些課程裏的一些學生作業:
這裏寫圖片描述
Twitter上也有一些很有趣的應用,比如把狗變成貓@itok_msi:
這裏寫圖片描述
或者把貓變成狗:
這裏寫圖片描述

再比如“吃雞”遊戲的風格轉換@Cahintan Trivedi:
這裏寫圖片描述
這裏寫圖片描述
不過這裏存在一個嚴重的問題:CycleGAN只能輸出256p/512p的低分辨率圖像

pix2pixHD

是的,我們還剩一個懸而未決的問題:分辨率和圖像質量。pix2pixHD就是用來解決這個問題的!

假設我們輸入一張高分辨率的草圖:
這裏寫圖片描述
使用pix2pix,結果很差(之前說過,讓網絡產生高維數據輸出很難):
這裏寫圖片描述

pix2pixHD採取了金字塔式的方法:
1. 先輸出低分辨率的圖片。
2. 將之前輸出的低分辨率圖片作爲另一個網絡的輸入,然後生成分辨率更高的圖片。
這裏寫圖片描述

這樣,就把一個困難的問題拆分成了兩個相對簡單的問題~

最終的效果是,給定下面的高分辨率草圖:
這裏寫圖片描述
pix2pixHD可以實時(real time)產生這樣的效果:
這裏寫圖片描述

pix2pixHD也支持用戶交互,比如加一輛車、添幾棵樹之類的:
這裏寫圖片描述
這裏寫圖片描述

pix2pixHD還有許多有趣的應用。

比如用草圖生成高分辨率人臉:
這裏寫圖片描述
這裏寫圖片描述

再比如:
- 圖像增強(Image Enhancement)
- 圖像去霧(Image Dehazing)
- 非監督動作重定向Neural Kinematic Networks for Unsupervised Motion Retargetting

其他問題

目前生成的斑馬視頻幀與幀之間的紋理變化較大,爲了解決幀之間的連續性問題,新的研究工作應運而生:Video-to-Video Synthesis
它主要的解決思路有下面三個:
1. 輸入一段視頻中的幾幀,檢查真假
2. 把前面的幀當做後面幀的輸入
3. 使用“optical flow”,具體請看paper

總結

本文介紹了怎樣用神經網絡生成圖片,我們使用pix2pix完成了基本任務,使用CycleGAN解決了輸入數據不成對的問題,最後用pix2pixHD解決了圖像分辨率和圖像質量的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章