摘要:這篇就介紹利用生成式對(duì)抗網(wǎng)絡(luò)的兩個(gè)基本駕駛技能去除愛情動(dòng)作片中的馬賽克給愛情動(dòng)作片中的女孩穿衣服生成式模型上一篇用生成二維樣本的小例子中已經(jīng)簡(jiǎn)單介紹了,這篇再簡(jiǎn)要回顧一下生成式模型,算是補(bǔ)全一個(gè)來(lái)龍去脈。
作為一名久經(jīng)片場(chǎng)的老司機(jī),早就想寫一些探討駕駛技術(shù)的文章。這篇就介紹利用生成式對(duì)抗網(wǎng)絡(luò)(GAN)的兩個(gè)基本駕駛技能:
1) 去除(愛情)動(dòng)作片中的馬賽克
2) 給(愛情)動(dòng)作片中的女孩穿(tuo)衣服
生成式模型
上一篇《用GAN生成二維樣本的小例子》中已經(jīng)簡(jiǎn)單介紹了GAN,這篇再簡(jiǎn)要回顧一下生成式模型,算是補(bǔ)全一個(gè)來(lái)龍去脈。
生成模型就是能夠產(chǎn)生指定分布數(shù)據(jù)的模型,常見的生成式模型一般都會(huì)有一個(gè)用于產(chǎn)生樣本的簡(jiǎn)單分布。例如一個(gè)均勻分布,根據(jù)要生成分布的概率密度函數(shù),進(jìn)行建模,讓均勻分布中的樣本經(jīng)過變換得到指定分布的樣本,這就可以算是最簡(jiǎn)單的生成式模型。比如下面例子:
圖中左邊是一個(gè)自定義的概率密度函數(shù),右邊是相應(yīng)的1w個(gè)樣本的直方圖,自定義分布和生成這些樣本的代碼如下:
from functools import partial
import numpy
from matplotlib import pyplot
# Define a PDF
x_samples = numpy.arange(-3, 3.01, 0.01)
PDF = numpy.empty(x_samples.shape)
PDF[x_samples < 0] = numpy.round(x_samples[x_samples < 0] + 3.5) / 3
PDF[x_samples >= 0] = 0.5 * numpy.cos(numpy.pi * x_samples[x_samples >= 0]) + 0.5
PDF /= numpy.sum(PDF)
# Calculate approximated CDF
CDF = numpy.empty(PDF.shape)
cumulated = 0
for i in range(CDF.shape[0]):
? ? cumulated += PDF[i]
? ? CDF[i] = cumulated
# Generate samples
generate = partial(numpy.interp, xp=CDF, fp=x_samples)
u_rv = numpy.random.random(10000)
x = generate(u_rv)
# Visualization
fig, (ax0, ax1) = pyplot.subplots(ncols=2, figsize=(9, 4))
ax0.plot(x_samples, PDF)
ax0.axis([-3.5, 3.5, 0, numpy.max(PDF)*1.1])
ax1.hist(x, 100)
pyplot.show()
對(duì)于一些簡(jiǎn)單的情況,我們會(huì)假設(shè)已知有模型可以很好的對(duì)分布進(jìn)行建模,缺少的只是合適的參數(shù)。這時(shí)候很自然只要根據(jù)觀測(cè)到的樣本,學(xué)習(xí)參數(shù)讓當(dāng)前觀測(cè)到的樣本下的似然函數(shù)較大,這就是較大似然估計(jì)(Maximum Likelihood Estimation):
MLE是一個(gè)最基本的思路,實(shí)踐中用得很多的還有KL散度(Kullback–Leibler divergence),假設(shè)真實(shí)分布是P,采樣分布是Q,則KL散度為:
從公式也能看出來(lái),KL散度描述的是兩個(gè)分布的差異程度。換個(gè)角度來(lái)看,讓產(chǎn)生的樣本和原始分布接近,也就是要讓這倆的差異減小,所以最小化KL散度就等同于MLE。從公式上來(lái)看的話,我們考慮把公式具體展開一下:
公式的第二項(xiàng)就是熵,先不管這項(xiàng),用H(P)表示。接下來(lái)考慮一個(gè)小trick:從Q中抽樣n個(gè)樣本,來(lái)估算P(x)的經(jīng)驗(yàn)值(empirical density function):
其中是狄拉克函數(shù),把這項(xiàng)替換到上面公式的P(x):
因?yàn)槭请x散的采樣值,所以中只有的時(shí)候狄拉克函數(shù)才為1,所以考慮時(shí)這項(xiàng)接化為1:
第一項(xiàng)正是似然的負(fù)對(duì)數(shù)形式。
說了些公式似乎跑得有點(diǎn)遠(yuǎn)了,其實(shí)要表達(dá)還是那個(gè)簡(jiǎn)單的意思:通過減小兩個(gè)分布的差異可以讓一個(gè)分布逼近另一個(gè)分布。仔細(xì)想想,這正是GAN里面adversarial loss的做法。
很多情況下我們面臨的是更為復(fù)雜的分布,比如上篇文章中的例子,又或是實(shí)際場(chǎng)景中更復(fù)雜的情況,比如生成不同人臉的圖像。這時(shí)候,作為具有universal approximation性質(zhì)的神經(jīng)網(wǎng)絡(luò)是一個(gè)看上去不錯(cuò)的選擇[1]:
所以雖然GAN里面同時(shí)包含了生成網(wǎng)絡(luò)和判別網(wǎng)絡(luò),但本質(zhì)來(lái)說GAN的目的還是生成模型。從生成式模型的角度,Ian Goodfellow總結(jié)過一個(gè)和神經(jīng)網(wǎng)絡(luò)相關(guān)生成式方法的“家譜”[1]:
在這其中,當(dāng)下最流行的就是GAN和Variational AutoEncoder(VAE),兩種方法的一個(gè)簡(jiǎn)明示意如下[3]:
本篇不打算展開講什么是VAE,不過通過這個(gè)圖,和名字中的autoencoder也大概能知道,VAE中生成的loss是基于重建誤差的。而只基于重建誤差的圖像生成,都或多或少會(huì)有圖像模糊的缺點(diǎn),因?yàn)檎`差通常都是針對(duì)全局。比如基于MSE(Mean Squared Error)的方法用來(lái)生成超分辨率圖像,容易出現(xiàn)下面的情況[4]:
在這個(gè)二維示意中,真實(shí)數(shù)據(jù)分布在一個(gè)U形的流形上,而MSE系的方法因?yàn)閘oss的形式往往會(huì)得到一個(gè)接近平均值所在的位置(藍(lán)色框)。
GAN在這方面則完爆其他方法,因?yàn)槟繕?biāo)分布在流形上。所以只要大概收斂了,就算生成的圖像都看不出是個(gè)啥,清晰度常常是有保證的,而這正是去除女優(yōu)身上馬賽克的理想特性!
馬賽克->清晰畫面:超分辨率(Super Resolution)問題
說了好些鋪墊,終于要進(jìn)入正題了。首先明確,去馬賽克其實(shí)是個(gè)圖像超分辨率問題,也就是如何在低分辨率圖像基礎(chǔ)上得到更高分辨率的圖像:
視頻中超分辨率實(shí)現(xiàn)的一個(gè)套路是通過不同幀的低分辨率畫面猜測(cè)超分辨率的畫面,有興趣了解這個(gè)思想的朋友可以參考我之前的一個(gè)答案:如何通過多幀影像進(jìn)行超分辨率重構(gòu)??
不過基于多幀影像的方法對(duì)于女優(yōu)身上的馬賽克并不是很適用,所以這篇要講的是基于單幀圖像的超分辨率方法。
SRGAN
說到基于GAN的超分辨率的方法,就不能不提到SRGAN[4]:《Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network》。這個(gè)工作的思路是:基于像素的MSE loss往往會(huì)得到大體正確,但是高頻成分模糊的結(jié)果。所以只要重建低頻成分的圖像內(nèi)容,然后靠GAN來(lái)補(bǔ)全高頻的細(xì)節(jié)內(nèi)容,就可以了:
這個(gè)思路其實(shí)和最早基于深度網(wǎng)絡(luò)的風(fēng)格遷移的思路很像(有興趣的讀者可以參考我之前文章瞎談CNN:通過優(yōu)化求解輸入圖像的最后一部分),其中重建內(nèi)容的content loss是原始圖像和低分辨率圖像在VGG網(wǎng)絡(luò)中的各個(gè)ReLU層的激活值的差異:
生成細(xì)節(jié)adversarial loss就是GAN用來(lái)判別是原始圖還是生成圖的loss:
把這兩種loss放一起,取個(gè)名叫perceptual loss。訓(xùn)練的網(wǎng)絡(luò)結(jié)構(gòu)如下:
正是上篇文章中講過的C-GAN,條件C就是低分辨率的圖片。SRGAN生成的超分辨率圖像雖然PSNR等和原圖直接比較的傳統(tǒng)量化指標(biāo)并不是較好,但就視覺效果,尤其是細(xì)節(jié)上,勝過其他方法很多。比如下面是作者對(duì)比bicubic插值和基于ResNet特征重建的超分辨率的結(jié)果:
可以看到雖然很多細(xì)節(jié)都和原始圖片不一樣,不過看上去很和諧,并且細(xì)節(jié)的豐富程度遠(yuǎn)勝于SRResNet。這些栩栩如生的細(xì)節(jié),可以看作是GAN根據(jù)學(xué)習(xí)到的分布信息“聯(lián)想”出來(lái)的。
對(duì)于更看重“看上去好看”的超分辨率應(yīng)用,SRGAN顯然是很合適的。當(dāng)然對(duì)于一些更看重重建指標(biāo)的應(yīng)用,比如超分辨率恢復(fù)嫌疑犯面部細(xì)節(jié),SRGAN就不可以了。
pix2pix
雖然專門用了一節(jié)講SRGAN,但本文用的方法其實(shí)是pix2pix[5]。這項(xiàng)工作剛在arxiv上發(fā)布就引起了不小的關(guān)注,它巧妙的利用GAN的框架解決了通用的Image-to-Image translation的問題。舉例來(lái)說,在不改變分辨率的情況下:把照片變成油畫風(fēng)格;把白天的照片變成晚上;用色塊對(duì)圖片進(jìn)行分割或者倒過來(lái);為黑白照片上色;…每個(gè)任務(wù)都有專門針對(duì)性的方法和相關(guān)研究,但其實(shí)總體來(lái)看,都是像素到像素的一種映射啊,其實(shí)可以看作是一個(gè)問題。這篇文章的巧妙,就在于提出了pix2pix的方法,一個(gè)框架,解決所有這些問題。方法的示意圖如下:
就是一個(gè)Conditional GAN,條件C是輸入的圖片。除了直接用C-GAN,這項(xiàng)工作還有兩個(gè)改進(jìn):
1)利用U-Net結(jié)構(gòu)生成細(xì)節(jié)更好的圖片[6]
U-Net是德國(guó)Freiburg大學(xué)模式識(shí)別和圖像處理組提出的一種全卷積結(jié)構(gòu)。和常見的先降采樣到低維度,再升采樣到原始分辨率的編解碼(Encoder-Decoder)結(jié)構(gòu)的網(wǎng)絡(luò)相比,U-Net的區(qū)別是加入skip-connection,對(duì)應(yīng)的feature maps和decode之后的同樣大小的feature maps按通道拼(concatenate)一起,用來(lái)保留不同分辨率下像素級(jí)的細(xì)節(jié)信息。U-Net對(duì)提升細(xì)節(jié)的效果非常明顯,下面是pix2pix文中給出的一個(gè)效果對(duì)比:
可以看到,各種不同尺度的信息都得到了很大程度的保留。
2)利用馬爾科夫性的判別器(PatchGAN)
pix2pix和SRGAN的一個(gè)異曲同工的地方是都有用重建解決低頻成分,用GAN解決高頻成分的想法。在pix2pix中,這個(gè)思想主要體現(xiàn)在兩個(gè)地方。一個(gè)是loss函數(shù),加入了L1 loss用來(lái)讓生成的圖片和訓(xùn)練的目標(biāo)圖片盡量相似,而圖像中高頻的細(xì)節(jié)部分則交由GAN來(lái)處理:
還有一個(gè)就是PatchGAN,也就是具體的GAN中用來(lái)判別是否生成圖的方法。PatchGAN的思想是,既然GAN只負(fù)責(zé)處理低頻成分,那么判別器就沒必要以一整張圖作為輸入,只需要對(duì)NxN的一個(gè)圖像patch去進(jìn)行判別就可以了。這也是為什么叫Markovian discriminator,因?yàn)樵趐atch以外的部分認(rèn)為和本patch互相獨(dú)立。
具體實(shí)現(xiàn)的時(shí)候,作者使用的是一個(gè)NxN輸入的全卷積小網(wǎng)絡(luò),最后一層每個(gè)像素過sigmoid輸出為真的概率,然后用BCEloss計(jì)算得到最終loss。這樣做的好處是因?yàn)檩斎氲木S度大大降低,所以參數(shù)量少,運(yùn)算速度也比直接輸入一張快,并且可以計(jì)算任意大小的圖。作者對(duì)比了不同大小patch的結(jié)果,對(duì)于256x256的輸入,patch大小在70x70的時(shí)候,從視覺上看結(jié)果就和直接把整張圖片作為判別器輸入沒什么區(qū)別了:
生成帶局部馬賽克的訓(xùn)練數(shù)據(jù)
利用pix2pix,只要準(zhǔn)備好無(wú)碼和相應(yīng)的有碼圖片就可以訓(xùn)練去馬賽克的模型了,就是這么簡(jiǎn)單。那么問題是,如何生成有馬賽克的圖片?
有毅力的話,可以手動(dòng)加馬賽克,這樣更為精準(zhǔn)。這節(jié)介紹一個(gè)不那么準(zhǔn),但是比隨機(jī)強(qiáng)的方法:利用分類模型的激活區(qū)域進(jìn)行自動(dòng)馬賽克標(biāo)注。
基本思想是利用一個(gè)可以識(shí)別需要打碼圖像的分類模型,提取出這個(gè)模型中對(duì)應(yīng)類的CAM(Class Activation Map)[7],然后用馬賽克遮住響應(yīng)較高的區(qū)域即可。這里簡(jiǎn)單說一下什么是CAM,對(duì)于最后一層是全局池化(平均或較大都可以)的CNN結(jié)構(gòu),池化后的feature map相當(dāng)于是做了個(gè)加權(quán)相加來(lái)計(jì)算最終的每個(gè)類別進(jìn)入softmax之前的激活值。CAM的思路是,把這個(gè)權(quán)重在池化前的feature map上按像素加權(quán)相加,最后得到的單張的激活圖就可以攜帶激活當(dāng)前類別的一些位置信息,這相當(dāng)于一種弱監(jiān)督(classification-->localization):
上圖是一個(gè)CAM的示意,用澳洲梗類別的CAM,放大到原圖大小,可以看到小狗所在的區(qū)域大致是激活響應(yīng)較高的區(qū)域。
那么就缺一個(gè)可以識(shí)別XXX圖片的模型了,網(wǎng)上還恰好就有個(gè)現(xiàn)成的,yahoo于2016年發(fā)布的開源色情圖片識(shí)別模型Open NSFW(Not Safe For Work):
yahoo/open_nsfw
CAM的實(shí)現(xiàn)并不難,結(jié)合Open NSFW自動(dòng)打碼的代碼和使用放在了這里:
給XX圖片生成馬賽克
去除(愛情)動(dòng)作片中的馬賽克
這沒什么好說的了,一行代碼都不用改,只需要按照前面的步驟把數(shù)據(jù)準(zhǔn)備好,然后按照pix2pix官方的使用方法訓(xùn)練就可以了:
Torch版pix2pix:phillipi/pix2pix
pyTorch版pix2pix(Cycle-GAN二合一版):junyanz/pytorch-CycleGAN-and-pix2pix
從D盤里隨隨便便找了幾千張圖片,用來(lái)執(zhí)行了一下自動(dòng)打碼和pix2pix訓(xùn)練(默認(rèn)參數(shù)),效果是下面這樣:
什么?你問說好給女優(yōu)去馬賽克呢?女優(yōu)照片呢?
還是要說一下,在真人照片上的效果比蘑菇和花強(qiáng)。
對(duì)偶學(xué)習(xí)(Dual Learning)
去馬賽克已經(jīng)講完了,接下來(lái)就是給女孩穿(tuo)衣服了,動(dòng)手之前,還是先講一下鋪墊:對(duì)偶學(xué)習(xí)和Cycle-GAN。
對(duì)偶學(xué)習(xí)是MSRA于2016年提出的一種用于機(jī)器翻譯的增強(qiáng)學(xué)習(xí)方法[8],目的是解決海量數(shù)據(jù)配對(duì)標(biāo)注的難題,個(gè)人覺得算是一種弱監(jiān)督方法(不過看到大多數(shù)文獻(xiàn)算作無(wú)監(jiān)督)。以機(jī)器翻譯為例,對(duì)偶學(xué)習(xí)基本思想如下圖[9]:
左邊的灰衣男只懂英語(yǔ),右邊的黑衣女只懂中文,現(xiàn)在的任務(wù)就是,要學(xué)習(xí)如何翻譯英語(yǔ)到中文。對(duì)偶學(xué)習(xí)解決這個(gè)問題的思路是:給定一個(gè)模型一上來(lái)無(wú)法知道翻譯得是否正確,但是如果考慮上的對(duì)偶問題,那么我可以嘗試翻譯一個(gè)英文句子到中文,再翻譯回來(lái)。這種轉(zhuǎn)了一圈的結(jié)果,灰衣男是可以用一個(gè)標(biāo)準(zhǔn)(BLEU)判斷x"和x是否一個(gè)意思,并且把結(jié)果的一致性反饋給這兩個(gè)模型進(jìn)行改進(jìn)。同樣的,從中文取個(gè)句子,這樣循環(huán)翻譯一遍,兩個(gè)模型又能從黑衣女那里獲取反饋并改進(jìn)模型。其實(shí)這就是強(qiáng)化學(xué)習(xí)的過程,每次翻譯就是一個(gè)action,每個(gè)action會(huì)從環(huán)境(灰衣男或黑衣女)中獲取reward,對(duì)模型進(jìn)行改進(jìn),直至收斂。
也許有的人看到這里會(huì)覺得和上世紀(jì)提出的Co-training很像,這個(gè)在知乎上也有討論:
如何理解劉鐵巖老師團(tuán)隊(duì)在NIPS 2016上提出的對(duì)偶學(xué)習(xí)(Dual Learning)?
個(gè)人覺得還是不一樣的,Co-Training是一種multi-view方法,比如一個(gè)輸入x,如果看作是兩個(gè)拼一起的特征,并且假設(shè)和互相獨(dú)立,那么這時(shí)候訓(xùn)練兩個(gè)分類器和。對(duì)于任意樣本x應(yīng)該有。這對(duì)沒有標(biāo)注的樣本是很有用的,相當(dāng)于利用了同一個(gè)樣本分類結(jié)果就應(yīng)該一樣的隱含約束。所以Co-Training的典型場(chǎng)景是少量標(biāo)注+大量未標(biāo)注的半監(jiān)督場(chǎng)景。并且和其實(shí)是兩個(gè)不同,但是domain指向相同的任務(wù)。而Dual Learning中和是對(duì)偶任務(wù),利用的隱含約束是的cycle consistency。對(duì)輸入的特征也沒有像Co-Training有那么明確的假設(shè),學(xué)習(xí)方法上也不一樣,Dual Learning算是強(qiáng)化學(xué)習(xí)。
CycleGAN和未配對(duì)圖像翻譯(Unpaired Image-to-Image Translation)
CycleGAN,翻譯過來(lái)就是:輪著干,是結(jié)合了對(duì)偶學(xué)習(xí)和GAN一個(gè)很直接而巧妙的想法[10],示意圖如下:
X和Y分別是兩種不同類型圖的集合,比如穿衣服的女優(yōu)和沒穿衣服的女優(yōu)。所以給定一張穿了衣服的女優(yōu),要變成沒穿衣服的樣子,就是個(gè)圖片翻譯問題。CycleGAN示意圖中(b)和(c)就是Dual Learning:
在Dual Learning基礎(chǔ)上,又加入了兩個(gè)判別器和用來(lái)進(jìn)行對(duì)抗訓(xùn)練,讓翻譯過來(lái)的圖片盡量逼近當(dāng)前集合中的圖片:
全考慮一起,最終的loss是:
也許有人會(huì)問,那不加cycle-consistency,直接用GAN學(xué)習(xí)一個(gè)的映射,讓生成的Y的樣本盡量畢竟Y里本身的樣本可不可以呢?這個(gè)作者在文中也討論了,會(huì)產(chǎn)生GAN訓(xùn)練中容易發(fā)生的mode collapse問題。mode collapse問題的一個(gè)簡(jiǎn)單示意如下[1]:
上邊的是真實(shí)分布,下邊的是學(xué)習(xí)到的分布,可以看到學(xué)習(xí)到的分布只是完整分布的一部分,這個(gè)叫做partial mode collapse,是訓(xùn)練不收斂情況中常見的一種。如果是完全的mode collapse,就是說生成模型得到的都是幾乎一樣的輸出。而加入Cycle-consistency會(huì)讓一個(gè)domain里不同的樣本都盡量映射到另一個(gè)domain里不同的地方,理想情況就是雙射(bijection)。直觀來(lái)理解,如果通過都映射在Y中同一個(gè)點(diǎn),那么這個(gè)點(diǎn)y通過映射回來(lái)顯然不可能是多個(gè)不同的x,所以加入cycle-consistency就幫助避免了mode collapse。這個(gè)問題在另一篇和CycleGAN其實(shí)本質(zhì)上沒什么不同的方法DiscoGAN中有更詳細(xì)的討論[11],有興趣的話可以參考。
有一點(diǎn)值得注意的是,雖然名字叫CycleGAN,并且套路也和C-GAN很像,但是其實(shí)只有adversarial,并沒有g(shù)enerative。因?yàn)閲?yán)格來(lái)說只是學(xué)習(xí)了X ightarrow Y和Y ightarrow X的mapping,所謂的generative network里并沒有隨機(jī)性。有一個(gè)和CycleGAN以及DiscoGAN其實(shí)本質(zhì)上也沒什么不同的方法叫DualGAN[12],倒是通過dropout把隨機(jī)性加上了。不過所有加了隨機(jī)性產(chǎn)生的樣本和原始樣本間的cycle-consistency用的還是l1 loss,總覺得這樣不是很對(duì)勁。當(dāng)然現(xiàn)在GAN這么熱門,其實(shí)只要是用了adversarial loss的基本都會(huì)取個(gè)名字叫XXGAN,也許是可以增加投稿命中率。
另外上節(jié)中提到了Co-Training,感覺這里也應(yīng)該提一下CoGAN[13],因?yàn)槊钟行┫嗨疲⑶乙部梢杂糜谖磁鋵?duì)的圖像翻譯。CoGAN的大體思想是:如果兩個(gè)Domain之間可以互相映射,那么一定有一些特征是共有的。比如男人和女人,雖然普遍可以從長(zhǎng)相區(qū)分,但不變的是都有兩個(gè)眼睛一個(gè)鼻子一張嘴等等。所以可以在生成的時(shí)候,把生成共有特征和各自特征的部分分開,示意圖如下:
其實(shí)就是兩個(gè)GAN結(jié)構(gòu),其中生成網(wǎng)絡(luò)和判別網(wǎng)絡(luò)中比較高層的部分都采用了權(quán)值共享(虛線相連的部分),沒有全職共享的部分分別處理不同的domain。這樣每次就可以根據(jù)訓(xùn)練的domain生成一個(gè)樣本在兩個(gè)domain中不同的對(duì)應(yīng),比如戴眼鏡和沒戴眼鏡:
分別有了共有特征和各自domain特征,那么做mapping的思路也就很直接了[14]:
在GAN前邊加了個(gè)domain encoder,然后對(duì)每個(gè)domain能得到三種樣本給判別器區(qū)分:直接采樣,重建采樣,從另一個(gè)domain中transfer后的重建采樣。訓(xùn)練好之后,用一個(gè)domain的encoder+另一個(gè)domain的generator就很自然的實(shí)現(xiàn)了不同domain的轉(zhuǎn)換。用在圖像翻譯上的效果如下:
還有個(gè)巧妙的思路,是把CoGAN拆開,不同domain作為C-GAN條件的更加顯式的做法[15]:
第一步用噪聲Z作為和domain無(wú)關(guān)的共享表征對(duì)應(yīng)的latent noise,domain信息作為條件C訓(xùn)練一個(gè)C-GAN。第二步,訓(xùn)練一個(gè)encoder,利用和常見的encode-decode結(jié)構(gòu)相反的decode(generate)-encode結(jié)構(gòu)。學(xué)習(xí)好的encoder可以結(jié)合domain信息,把輸入圖像中和domain無(wú)關(guān)的共享特征提取出來(lái)。第三步,把前兩步訓(xùn)練好的encoder和decoder(generator)連一起,就可以根據(jù)domain進(jìn)行圖像翻譯了。
CoGAN一系的方法雖然結(jié)構(gòu)看起來(lái)更復(fù)雜,但個(gè)人感覺理解起來(lái)要比dual系的方法更直接,并且有l(wèi)atent space,可解釋性和屬性對(duì)應(yīng)也好一些。
又扯遠(yuǎn)了,還是回到正題。
給女優(yōu)穿上衣服
其實(shí)同樣沒什么好說的,Cycle-GAN和pix2pix的作者是一撥人,文檔都寫得非常棒,準(zhǔn)備好數(shù)據(jù),分成穿衣服的和沒穿衣服的兩組,按照文檔的步驟訓(xùn)練就可以:
Torch版Cycle-GAN:junyanz/CycleGAN
pyTorch版Cycle-GAN(pix2pix二合一版):junyanz/pytorch-CycleGAN-and-pix2pix
Cycle-GAN收斂不易,我用了128x128分辨率訓(xùn)練了穿衣服和沒穿衣服的女優(yōu)各一千多張,同樣是默認(rèn)參數(shù)訓(xùn)練了120個(gè)epoch,最后小部分成功“穿衣服”的結(jié)果如下:
雖然都有些突兀,但好歹是穿上衣服了。注意馬賽克不是圖片里就有的,是我后來(lái)加上去的。
那么,脫衣服的例子在哪里?
參考文獻(xiàn)
[1] I. Goodfellow. Nips 2016 tutorial: Generative adversarial networks. arXiv preprint arXiv:1701.00160, 2016.
[2] A. B. L. Larsen, S. K. S?nderby, Generating Faces with Torch. Torch | Generating Faces with Torch
[3] A. B. L. Larsen, S. K. S?nderby, H. Larochelle, and O. Winther. Autoencoding beyond pixels using a learned similarity metric. In ICML, pages 1558–1566, 2016.
[4] C. Ledig, L. Theis, F. Huszar, J. Caballero, A. Aitken, A. Tejani, J. Totz, Z. Wang, and W. Shi. Photo-realistic single image super-resolution using a generative adversarial network. arXiv:1609.04802, 2016.
[5] P. Isola, J.-Y. Zhu, T. Zhou, and A. A. Efros. Image-to-image translation with conditional adversarial networks. arxiv, 2016.
[6] O. Ronneberger, P. Fischer, and T. Brox. U-net: Convolutional networks for biomedical image segmentation. In MICCAI, pages 234–241. Springer, 2015.
[7] B. Zhou, A. Khosla, A. Lapedriza, A. Oliva, and A. Torralba. Learning deep features for discriminative localization. arXiv preprint arXiv:1512.04150, 2015.
[8] He, D., Xia, Y., Qin, T., Wang, L., Yu, N., Liu, T.-Y., and Ma, W.-Y. (2016a). Dual learning for machine translation. In the Annual Conference on Neural Information Processing Systems (NIPS), 2016.
[9] Tie-Yan Liu, Dual Learning: Pushing the New Frontier of Artificial Intelligence, MIFS 2016
[10] J.-Y. Zhu, T. Park, P. Isola, and A. A. Efros. Unpaired image-to-image translation using cycle-consistent adversarial networkss. arXiv preprint arXiv:1703.10593, 2017.
[11] T. Kim, M. Cha, H. Kim, J. Lee, and J. Kim. Learning to Discover Cross-Domain Relations with Generative Adversarial Networks. ArXiv e-prints, Mar. 2017.
[12] Z. Yi, H. Zhang, P. T. Gong, et al. DualGAN: Unsupervised dual learning for image-to-image translation. arXiv preprint arXiv:1704.02510, 2017.
[13] M.-Y. Liu and O. Tuzel. Coupled generative adversarial networks. In Advances in Neural Information Processing Systems (NIPS), 2016.
[14] M.-Y. Liu, T. Breuel, and J. Kautz. Unsupervised image-to-image translation networks. arXiv preprint arXiv:1703.00848, 2017.
[15] Dong, H., Neekhara, P., Wu, C., Guo, Y.: Unsupervised image-to-image translation with generative adversarial networks. arXiv preprint arXiv:1701.02676, 2017.
歡迎加入本站公開興趣群商業(yè)智能與數(shù)據(jù)分析群
興趣范圍包括各種讓數(shù)據(jù)產(chǎn)生價(jià)值的辦法,實(shí)際應(yīng)用案例分享與討論,分析工具,ETL工具,數(shù)據(jù)倉(cāng)庫(kù),數(shù)據(jù)挖掘工具,報(bào)表系統(tǒng)等全方位知識(shí)
QQ群:81035754
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/4589.html
摘要:用離散信一文清晰講解機(jī)器學(xué)習(xí)中梯度下降算法包括其變式算法無(wú)論是要解決現(xiàn)實(shí)生活中的難題,還是要?jiǎng)?chuàng)建一款新的軟件產(chǎn)品,我們最終的目標(biāo)都是使其達(dá)到最優(yōu)狀態(tài)。 提高駕駛技術(shù):用GAN去除(愛情)動(dòng)作片中的馬賽克和衣服 作為一名久經(jīng)片場(chǎng)的老司機(jī),早就想寫一些探討駕駛技術(shù)的文章。這篇就介紹利用生成式對(duì)抗網(wǎng)絡(luò)(GAN)的兩個(gè)基本駕駛技能: 1) 去除(愛情)動(dòng)作片中的馬賽克 2) 給(愛情)動(dòng)作片中...
摘要:最近,這就是街舞第二季開播,又一次燃起了全民熱舞的風(fēng)潮。然而,真要自己跳起來(lái),實(shí)際與想象之間,估計(jì)差了若干個(gè)羅志祥。系統(tǒng)映射結(jié)果展示對(duì)于系統(tǒng)的結(jié)果,研究人員表示還不完美。谷歌在和跳舞的結(jié)合上也花了心思。好了,先不說了,我要去跟學(xué)跳舞了。 最近,《這!就是街舞》第二季開播,又一次燃起了全民熱舞的風(fēng)潮。 剛開播沒多久,這個(gè)全程高能的節(jié)目,就在豆瓣上就得到了 9.6 的高分。舞者們?cè)诒荣愔芯?..
摘要:最近,谷歌發(fā)布了一種把低分辨率圖像復(fù)原為高分辨率圖像的方法,參見機(jī)器之心文章學(xué)界谷歌新論文提出像素遞歸超分辨率利用神經(jīng)網(wǎng)絡(luò)消滅低分辨率圖像馬賽克。像素遞歸超分辨率像素獨(dú)立超分辨率方法被指出有局限性之后,它的解釋被逐漸給出。 最近,谷歌發(fā)布了一種把低分辨率圖像復(fù)原為高分辨率圖像的方法,參見機(jī)器之心文章《學(xué)界 | 谷歌新論文提出像素遞歸超分辨率:利用神經(jīng)網(wǎng)絡(luò)消滅低分辨率圖像馬賽克》。與較先進(jìn)的方...
摘要:此前有工作將像素?fù)p失和生成對(duì)抗損失整合為一種新的聯(lián)合損失函數(shù),訓(xùn)練圖像轉(zhuǎn)換模型產(chǎn)生分辨率更清的結(jié)果。一般來(lái)說,結(jié)合使用多種損失函數(shù)的效果通常比單獨(dú)使用一種要好。結(jié)合感知對(duì)抗損失和生成對(duì)抗損失,提出了感知對(duì)抗網(wǎng)絡(luò)這一框架,處理圖像轉(zhuǎn)換任務(wù)。 近來(lái),卷積神經(jīng)網(wǎng)絡(luò)的發(fā)展,結(jié)合對(duì)抗生成網(wǎng)絡(luò)(GAN)等嶄新的方法,為圖像轉(zhuǎn)換任務(wù)帶來(lái)了很大的提升,包括圖像超分辨率、去噪、語(yǔ)義分割,還有自動(dòng)補(bǔ)全,都有亮眼...
閱讀 1418·2021-09-22 15:52
閱讀 1458·2019-08-30 15:44
閱讀 895·2019-08-30 14:24
閱讀 2705·2019-08-30 13:06
閱讀 2700·2019-08-26 13:45
閱讀 2782·2019-08-26 13:43
閱讀 1015·2019-08-26 12:01
閱讀 1436·2019-08-26 11:56