1. 程式人生 > >一文讀懂GAN, pix2pix, CycleGAN和pix2pixHD

一文讀懂GAN, pix2pix, CycleGAN和pix2pixHD

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

人員資訊

主講嘉賓

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

主持人

報告內容

這是機器學習滴時代!

計算機視覺(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中包含兩種型別的網路GGDD。其中,GGGenerator,它的作用是生成圖片,也就是說,在輸入一個隨機編碼(random code)zz之後,它將輸出一幅由神經網路自動生成的、假的圖片G(z)G(z)

另外一個網路DDDiscriminator是用來判斷的,它接受GG輸出的影象作為輸入,然後判斷這幅影象的真假,真的輸出1,假的輸出0。

這裡寫圖片描述

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

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

minGmaxDE[logD(G(z))+log(1D(x))]\min\limits_{G} \max\limits_D \mathbb{E} [\log D(G(z)) + \log (1- D(x))]

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

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做了個小改動,它不再輸入隨機噪聲,而是輸入使用者給的圖片:

這裡寫圖片描述

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

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

這項研究還是挺成功的,大家可以去這裡線上體驗一下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)**才行。

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

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

這裡寫圖片描述
反過來,斑馬變馬再變回斑馬也要滿足要求,注意這一步最好不要省略。雖然理論上只用一個條件是可以的,但是現實實現中,有很多因素,比如計算的準備度,優化的問題,應用中都是把所有約束都加上。比如說a=b=ca=b=c,理論上我們只要要求$(a-b)2+(a-c)2=0 ,但現實中我們都是做(a-b)2+(a-c)2+(b-c)^2=0$。
這裡寫圖片描述

我們同時優化GGFF,最後就能拿到一個想要的網路GG

CycleGAN為什麼有效

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

效果展示

下面是效果展示環節~

馬變斑馬

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

橘子變蘋果:

這裡寫圖片描述
這裡寫圖片描述

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

影象風格的遷移:

這裡寫圖片描述

這裡寫圖片描述

遊戲場景替換

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

失敗例子

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

這是因為,訓練影象裡並沒有騎馬的人,所以網路就傻掉了。

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

原始碼

這是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還有許多有趣的應用。

比如用草圖生成高解析度人臉:
這裡寫圖片描述
這裡寫圖片描述

再比如:

其他問題

目前生成的斑馬視訊幀與幀之間的紋理變化較大,為了解決幀之間的連續性問題,新的研究工作應運而生:Video-to-Video Synthesis
它主要的解決思路有下面三個:

  1. 輸入一段視訊中的幾幀,檢查真假
  2. 把前面的幀當做後面幀的輸入
  3. 使用“optical flow”,具體請看paper

總結

本文介紹了怎樣用神經網路生成圖片,我們使用pix2pix完成了基本任務,使用CycleGAN解決了輸入資料不成對的問題,最後用pix2pixHD解決了影象解析度和影象質量的問題。

相關推薦

GAN, pix2pix, CycleGANpix2pixHD

本文翻譯、總結自朱儁彥的線上報告,主要講了如何用機器學習生成圖片。 人員資訊 主講嘉賓 姓名:朱儁彥(Jun-Yan Zhu) 現狀:麻省理工學院博士後(PostDoc at MIT),電腦科學與人工智慧實驗室(Computer Science and A

深度 | 生成對抗網路初學入門:GAN的基本原理(附資源)

選自 Sigmoidal 作者:Roman Trusov 機器之心編譯 參與:Panda 生成對抗網路是現在人工智慧領域的當紅技術之一。近日,Sigmoidal.io 的部落格發表了一篇入門級介紹文章,對 GAN 的原理進行了解釋說明。另外,在該文章的最後還附帶了一些能幫助初學者自己

夯實Java基礎系列7:Java 程式碼塊執行順序

目錄 Java中的構造方法 構造方法簡介 構造方法例項 例 1 例 2 Java中的幾種構造方法詳解 普通構造方法 預設構造方法 過載構造方法 java子類構造方法呼叫父類構造方法 Java中的程式碼塊簡介 Java程式碼塊使用 區域性程式碼塊 構造程式碼塊 靜態程式碼塊 Java程式碼塊、

Java GC原理調優

概述 本文介紹GC基礎原理和理論,GC調優方法思路和方法,基於Hotspot jdk1.8,學習之後將瞭解如何對生產系統出現的G

夯實Java基礎系列22:Java序列化反序列化

本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到我的倉庫裡檢視 https://github.com/h2pl/Java-Tutorial 喜歡的話麻煩點下Star哈 文章首發於我的個人部落格: www.how2playlife.com 本文參考 http://www

Spring Boot、微服務架構大數據治理之間的故事

Springboot微服務架構 微服務的誕生並非偶然,它是在互聯網高速發展,技術日新月異的變化以及傳統架構無法適應快速變化等多重因素的推動下誕生的產物。互聯網時代的產品通常有兩類特點:需求變化快和用戶群體龐大,在這種情況下,如何從系統架構的角度出發,構建靈活、易擴展的系統,快速應對需求的變化;同時,隨著用戶的

從HTTP/0.9到HTTP/2:HTTP協議的歷史演變設計思路

eight 結果 key 視頻 this sso單點登陸 會有 研究 patch 本文原作者阮一峰,作者博客:ruanyifeng.com。 1、引言 HTTP 協議是最重要的互聯網基礎協議之一,它從最初的僅為瀏覽網頁的目的進化到現在,已經是短連接通信的事實工業標準,最新版

塊狀元素內聯元素

很多剛入坑前端的同學一直不懂div和span兩個標籤有什麼區別。那麼,有什麼區別呢?答案就是div是塊狀元素,span是內聯元素。 那麼,塊狀元素(block)和內聯元素(inline)又有什麼區別呢?塊狀元素: 後面的元素會從另起一行開始 高度,行高以及頂、底邊距都可

spring boot 微服務的關係

歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 Spring Boot 和微服務沒關係, Java 微服務治理框架普遍用的是 Spring Cloud。 Spring Boot 產生的背景,是開發人員對 Spring 框架越來越複雜的配置吐槽越來越多,Pivotal 設計 Spring

JavaScriptECMAScript的區別

一文讀懂JavaScript和ECMAScript的區別 這篇文章代表了我目前對 JavaScript 和 ECMAScript 之間差異的理解。文章適合那些熟悉 JavaScript 但又想更加清楚地瞭解其與 ECMAScript、web 瀏覽器、Babel 等是何種關係的人。你還

java物件引用

Java物件及其引用  關於物件與引用之間的一些基本概念。         初學Java時,在很長一段時間裡,總覺得基本概念很模糊。後來才知道,在許多Java書中,把物件和物件的引用混為一談。可是,如果我分不清物件與

對抗生成學習(Generative Adversarial Nets)[GAN]

一文讀懂對抗生成學習(Generative Adversarial Nets)[GAN] 0x00 推薦論文 https://arxiv.org/pdf/1406.2661.pdf 0x01什麼是gan Generative model G用來生成樣本 Discriminative mo

HDMIVGA介面針腳定義

一文讀懂HDMI和VGA介面針腳定義 摘自:http://www.elecfans.com/yuanqijian/jiekou/20180423666604.html   HDMI概述   HDMI是高清晰度多媒體介面(High DefiniTIon MulTImedia Interface)

SAFe、DevOps、ITILCMMI:互斥還是互補?

本文轉自微訊號EAWorld。掃描下方二維碼,關注成功後,回覆“普元方法+”,將會獲得熱門課堂免費學習機會!本文轉自微訊號EAWorld。若您試圖使企業以更加精簡、高效的方式運作,您可利用幾種框架來達到這一目的。但是,首先,這些框架是否能協同工作,是互補或是互斥

Spring Boot、微服務架構大資料治理三者之間的故事

微服務架構 微服務的誕生並非偶然,它是在網際網路高速發展,技術日新月異的變化以及傳統架構無法適應快速變化等多重因素的推動下誕生的產物。網際網路時代的產品通常有兩類特點:需求變化快和使用者群體龐大,在這種情況下,如何從系統架構的角度出發,構建靈活、易擴充套件的系統,快速應對需求的變化;同時,隨著使用者的增加,如

遷移學習預訓練

轉載:https://zhuanlan.zhihu.com/p/27657264 引言 跟傳統的監督式機器學習演算法相比,深度神經網路目前最大的劣勢是什麼? 貴。 尤其是當我們在嘗試處理現實生活中諸如影象識別、聲音辨識等實際問題的時候。一旦你的模型中包含一些隱藏層時,增

比特幣私鑰、公鑰、錢包地址的來歷關係

對比特幣熟悉的朋友一定都知道,買賣比特幣最後都是通過一個錢包地址來實現的,就像我們日常使用的銀行卡卡號,我們隨便找一個比特幣的錢包地址,大家看一下:1QCXRuoxWo5Bya9NxHaVBArBQYhatHJrU7但是當談到比特幣的錢包地址是如何算出來的時候,可能就很少有人

「Java基本功」Java內部類的用法原理

實現接口 tcl 一點 print 定義 做成 這一 system clas 內部類初探 一、什麽是內部類?   內部類是指在一個外部類的內部再定義一個類。內部類作為外部類的一個成員,並且依附於外部類而存在的。內部類可為靜態,可用protected和private修飾(

機器學習、資料科學、深度學習統計學之間的區別

  明晰了資料科學家所具有的不同角色,以及資料科學與機器學習、深度學習、人工智慧、統計學等領域的區別。這些概念的區別也一直是人工智慧領域熱烈討論的一個話題,Quora、多個技術部落格都曾有過解答。機器之心之前編譯的一篇文章《人工智慧、機器學習、深度學習,三者之間的同心圓關係》也對此問題進行了探討,但似乎業內

複雜網路(應用、模型研究歷史)

出處:https://yq.aliyun.com/articles/231424?do=login#摘要: 隨著近幾年關於複雜網路(Complex network)理論及其應用研究的不斷深入,已有大量關於複雜網路的文章發表在Science,ature,RL,NAS等國際一流的