本文翻譯、總結自朱儁彥的線上報告,主要講了如何用機器學習生成圖片。
來源: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中包含兩種類型的網絡 和 。其中, 爲Generator,它的作用是生成圖片,也就是說,在輸入一個隨機編碼(random code) 之後,它將輸出一幅由神經網絡自動生成的、假的圖片 。
另外一個網絡 爲Discriminator是用來判斷的,它接受 輸出的圖像作爲輸入,然後判斷這幅圖像的真假,真的輸出1,假的輸出0。
在兩個網絡互相博弈(金坷垃日本人:不邀噠架)的過程中,兩個網絡的能力都越來越高: 生成的圖片越來越像真的圖片, 也越來越會判斷圖片的真假。到了這一步,我們就能“卸磨殺驢”——丟掉 不要了,把 拿來用作圖片生成器。
正式一點兒講(上公式啦),我們就是要在最大化 的能力的前提下,最小化 對 的判斷能力,這是一個最小最大值問題,它的學習目標是:
爲了增強 的能力,我們分別考慮輸入真的圖像和假的圖像的情況。上式中第一項的 處理的是假圖像 ,這時候評分 需要盡力降低;第二項處理的是真圖像 ,這時候的評分要高。
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做了個小改動,它不再輸入隨機噪聲,而是輸入用戶給的圖片:
但這也就產生了新的問題:我們怎樣建立輸入和輸出的對應關係。此時 的輸出如果是下面這樣, 會判斷是真圖:
但如果 的輸出是下面這樣的, 拿來一看,也會**認爲是真的圖片**QAQ…也就是說,這樣做並不能訓練出輸入和輸出對應的網絡 ,因爲是否對應根本不影響 的判斷。
爲了體現這種對應關係,解決方案也很簡單,你可以也已經想到了:我們把 的輸入和輸出一起作爲 的輸入不就好了?於是現在的優化目標變成了這樣:
這項研究還是挺成功的,大家可以去這裏在線體驗一下demo,把草圖(sketch)變成圖片。
當然,有些比較皮的用戶輸入了奇形怪狀的草圖,然後畫風就變成了這樣:
應用
pix2pix的核心是有了對應關係,這種網絡的應用範圍還是比較廣泛的,比如:
- 草圖變圖片[Isola, Zhu, Zhou, Efros, 2016]:
- 灰度圖變彩色圖[Isola, Zhu, Zhou, Efros, 2016]:
- 自動着色 Data from [Russakovsky et al. 2015]:
- 交互式着色[Zhang*, Zhu*, Isola, Geng, Lin, Yu, Efros, 2017]:
CycleGAN
pix2pix必須使用成對的數據進行訓練。
但很多情況下成對數據是很難獲取到的,比如說,我們想把馬變成斑馬,現實生活中是不存在對應的真實照片的:
現在我們就用Cycle-constraint Adversarial Network也就是CycleGAN解決這個問題。這種網絡不需要成對的數據,只需要輸入數據的一個集合(比如一堆馬的照片)和輸出數據的一個集合(比如一堆斑馬的照片)就可以了。
但是(沒錯我又要說但是了),直接使用不成對的數據是不奏效的。網絡會直接忽略輸入,隨機產生輸出!所以,我們還得對網絡增加限制(constraint)才行。
那怎麼加限制呢?我們來思考一個現實問題。馬克吐溫認爲,如果一把一段話從英文翻譯成法文,再從法文翻譯回英文,那麼你應該得到跟之前原始輸入的英文一樣的內容。這裏也是一樣,如果我們把馬變成斑馬,然後再變回馬,那麼最後的馬和開始輸入的馬應該是一樣的。
下面講一下具體技術細節。除了之前提到的把馬變成斑馬的網絡 ,我們還需要一個把斑馬變回馬的網絡 。
那麼,一匹馬 用 變成斑馬 ,然後再用 把它變回馬 ,得到的馬和一開始的馬應該是一樣的,也就是 。
反過來,斑馬變馬再變回斑馬也要滿足要求,注意這一步不能省(請讀者自己想一想爲什麼)!
我們同時優化 和 ,最後就能拿到一個想要的網絡 。
CycleGAN爲什麼有效
CycleGAN成功的原因在於它分離了風格(Style)和內容(content)。人工設計這種分離的算法是很難的,但有了神經網絡,我們很容易讓它學習者去自動保持內容而改變風格。
效果展示
下面是效果展示環節~
馬變斑馬
兩張圖片分別是原來的馬和 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解決了圖像分辨率和圖像質量的問題。