自GAN誕生以來,在計(jì)算機(jī)視覺領(lǐng)域中表現(xiàn)可謂是驚艷連連:文本-圖像轉(zhuǎn)換、域遷移、圖像修復(fù)/拓展、人臉合成甚至是細(xì)微表情的改變,無所不能。本文對此進(jìn)行了盤點(diǎn),并且作者表示:GAN很快就可能替代現(xiàn)有的攝影技術(shù)了!
AI生成的圖像可能會取代現(xiàn)有的攝影技術(shù)。
許多人當(dāng)聽到“人工智能”、“機(jī)器學(xué)習(xí)”或者“bot”的時(shí)候,首先浮現(xiàn)在腦海當(dāng)中的應(yīng)當(dāng)是科幻片中經(jīng)常出現(xiàn)、未來感十足的既會走路又會說話的機(jī)器人。
但事實(shí)并非如此!人工智能已經(jīng)“潛伏”在我們身邊很多年了?,F(xiàn)在就有可能在你的智能手機(jī)里(Siri/谷歌語音助手)、汽車GPS系統(tǒng)里。
然而,在過去幾年中,沒有哪個(gè)域比計(jì)算機(jī)視覺更受其影響。
隨著科技的發(fā)展,具有超高分辨率視覺吸引力的圖像變得越來越普遍。人們不再需要學(xué)習(xí)如何使用Photoshop和CorelDRAW等工具來增強(qiáng)和修改圖像,因?yàn)锳I可以在這些方面產(chǎn)生最佳效果的圖像。然而,最新提出的想法實(shí)際上是綜合使用AI來生成圖像。
以往我們所看到的所有圖像,其生成過程肯定都或多或少有“人”的參與。但是試想一下,一個(gè)計(jì)算機(jī)程序可以從零開始繪制你想要它繪制的任何內(nèi)容,在不久的將來,你只需要給它一些指令,例如“我想要一張站在埃菲爾鐵塔旁邊的照片”,然后圖像就生成了(當(dāng)然,你的輸入要準(zhǔn)確)!
生成對抗網(wǎng)絡(luò)(GAN)
“在機(jī)器學(xué)習(xí)過去的10年里,GAN是最有趣的一個(gè)想法?!?/p>
——Yann LeCun
生成這種合成圖像的基礎(chǔ)就是生成對抗網(wǎng)絡(luò)(GAN)。
自從Ian Goodfellow和他的同事在2014年發(fā)現(xiàn)并推出他們的研究論文以來,GAN一直是深度學(xué)習(xí)中最迷人且被最廣泛使用的技術(shù)之一。這項(xiàng)技術(shù)無窮無盡的應(yīng)用,也就是所謂對抗性訓(xùn)練的核心,不僅包括計(jì)算機(jī)視覺,還包括數(shù)據(jù)分析、機(jī)器人技術(shù)和預(yù)測模型。
那么,GAN有什么了不起的呢?
生成性對抗網(wǎng)絡(luò)屬于一組生成模型。 這意味著他們的工作是在完全自動化的過程中創(chuàng)建或“生成”新數(shù)據(jù)的。
lan Goodfellow論文中生成的圖像。
地址:https://arxiv.org/abs/1406.2661
顧名思義,GAN實(shí)際上由兩個(gè)相互競爭的獨(dú)立神經(jīng)網(wǎng)絡(luò)組成(以對抗的方式)。其中一個(gè)神經(jīng)網(wǎng)絡(luò)稱為生成器,從隨機(jī)噪聲中生成新的數(shù)據(jù)實(shí)例;另一個(gè)神經(jīng)網(wǎng)絡(luò)稱為鑒別器,它會對這些實(shí)例進(jìn)行真實(shí)性評估。換言之,鑒別器決定它檢查的每個(gè)數(shù)據(jù)實(shí)例是否屬于實(shí)際的訓(xùn)練數(shù)據(jù)集。
一個(gè)簡單的例子
假設(shè)你的任務(wù)就是高仿一幅著名畫作。但不幸的是,你并不知道這位藝術(shù)家是誰,也沒有見過他的畫作。但你的任務(wù)就是高仿它,并作為原作之一在拍賣會上展出。
你只有一些顏料和畫布。但是拍賣商不希望隨意出售作品,所以他們雇了一名偵探來對畫作辨別真?zhèn)?。偵探手中有這幅名作的真跡,所以若是你隨意拿出一個(gè)作品,偵探立刻就能知道你的畫作是贗品(甚至完全不同)。
當(dāng)偵探拒絕了一次之后,你會再去創(chuàng)作一個(gè)作品。但是通過這次經(jīng)驗(yàn),你會通過偵探得到一些提示(這些提示有關(guān)真跡畫作應(yīng)該是什么樣子)。
當(dāng)你再次嘗試的時(shí)候,畫作會比第一次好一些。此時(shí),偵探還是不相信這是真跡,于是你在又得到一些提示的情況下,再次嘗試,以此類推。直到你畫了1000次,偵探拿著你的高仿作品,已然不知道哪幅畫是真跡了。
GAN的工作流程是什么?
將上述的思維過程應(yīng)用于神經(jīng)網(wǎng)絡(luò)組合,GAN的訓(xùn)練過程包括以下步驟:
GAN的基本框架。
地址:https://medium.freecodecamp.org/an-intuitive-introduction-to-generative-adversarial-networks-gans-7a2264a81394
最開始,發(fā)生器接收一些隨機(jī)噪聲并將其傳遞給鑒別器;
因?yàn)殍b別器已經(jīng)訪問了真實(shí)圖像的數(shù)據(jù)集,所以它將這些真實(shí)數(shù)據(jù)集與從生成器接收到的圖像進(jìn)行比較,并評估其真實(shí)性;
由于初始圖像只是隨機(jī)噪聲,它將被評估為“假”;
生成器通過不斷改變參數(shù),開始生成更好的圖像;
隨著訓(xùn)練的進(jìn)行,生成假圖像的生成器和檢測它們的鑒別器會變得越發(fā)的智能;
最后,生成器設(shè)法創(chuàng)建一個(gè)與真實(shí)圖像數(shù)據(jù)集中的圖像難以區(qū)分的圖像。此時(shí),鑒別器便無法分辨給定的圖像是真還是假;
此時(shí),訓(xùn)練結(jié)束,生成的圖像就是我們想要的最終結(jié)果。
我們自己的GAN生成汽車標(biāo)志圖像的過程。
現(xiàn)在,讓我們來看一下代碼吧!
下面是用Pytorch實(shí)現(xiàn)的一個(gè)基本生成網(wǎng)絡(luò):
1importargparse 2importos 3importnumpyasnp 4importmath 5 6importtorchvision.transformsastransforms 7fromtorchvision.utilsimportsave_image 8 9fromtorch.utils.dataimportDataLoader 10fromtorchvisionimportdatasets 11fromtorch.autogradimportVariable 12 13importtorch.nnasnn 14importtorch.nn.functionalasF 15importtorch 16 17os.makedirs('images',exist_ok=True) 18 19parser=argparse.ArgumentParser() 20parser.add_argument('--n_epochs',type=int,default=200,help='numberofepochsoftraining') 21parser.add_argument('--batch_size',type=int,default=64,help='sizeofthebatches') 22parser.add_argument('--lr',type=float,default=0.0002,help='adam:learningrate') 23parser.add_argument('--b1',type=float,default=0.5,help='adam:decayoffirstordermomentumofgradient') 24parser.add_argument('--b2',type=float,default=0.999,help='adam:decayoffirstordermomentumofgradient') 25parser.add_argument('--n_cpu',type=int,default=8,help='numberofcputhreadstouseduringbatchgeneration') 26parser.add_argument('--latent_dim',type=int,default=100,help='dimensionalityofthelatentspace') 27parser.add_argument('--img_size',type=int,default=28,help='sizeofeachimagedimension') 28parser.add_argument('--channels',type=int,default=1,help='numberofimagechannels') 29parser.add_argument('--sample_interval',type=int,default=400,help='intervalbetwenimagesamples') 30opt=parser.parse_args() 31print(opt) 32 33img_shape=(opt.channels,opt.img_size,opt.img_size) 34 35cuda=Trueiftorch.cuda.is_available()elseFalse 36 37classGenerator(nn.Module): 38def__init__(self): 39super(Generator,self).__init__() 40 41defblock(in_feat,out_feat,normalize=True): 42layers=[nn.Linear(in_feat,out_feat)] 43ifnormalize: 44layers.append(nn.BatchNorm1d(out_feat,0.8)) 45layers.append(nn.LeakyReLU(0.2,inplace=True)) 46returnlayers 47 48self.model=nn.Sequential( 49*block(opt.latent_dim,128,normalize=False), 50*block(128,256), 51*block(256,512), 52*block(512,1024), 53nn.Linear(1024,int(np.prod(img_shape))), 54nn.Tanh() 55) 56 57defforward(self,z): 58img=self.model(z) 59img=img.view(img.size(0),*img_shape) 60returnimg 61 62classDiscriminator(nn.Module): 63def__init__(self): 64super(Discriminator,self).__init__() 65 66self.model=nn.Sequential( 67nn.Linear(int(np.prod(img_shape)),512), 68nn.LeakyReLU(0.2,inplace=True), 69nn.Linear(512,256), 70nn.LeakyReLU(0.2,inplace=True), 71nn.Linear(256,1), 72nn.Sigmoid() 73) 74 75defforward(self,img): 76img_flat=img.view(img.size(0),-1) 77validity=self.model(img_flat) 78 79returnvalidity 80 81#Lossfunction 82adversarial_loss=torch.nn.BCELoss() 83 84#Initializegeneratoranddiscriminator 85generator=Generator() 86discriminator=Discriminator() 87 88ifcuda: 89generator.cuda() 90discriminator.cuda() 91adversarial_loss.cuda() 92 93#Configuredataloader 94os.makedirs('../../data/mnist',exist_ok=True) 95dataloader=torch.utils.data.DataLoader( 96datasets.MNIST('../../data/mnist',train=True,download=True, 97transform=transforms.Compose([ 98transforms.ToTensor(), 99transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))100])),101batch_size=opt.batch_size,shuffle=True)102103#Optimizers104optimizer_G=torch.optim.Adam(generator.parameters(),lr=opt.lr,betas=(opt.b1,opt.b2))105optimizer_D=torch.optim.Adam(discriminator.parameters(),lr=opt.lr,betas=(opt.b1,opt.b2))106107Tensor=torch.cuda.FloatTensorifcudaelsetorch.FloatTensor108109#----------110#Training111#----------112113forepochinrange(opt.n_epochs):114fori,(imgs,_)inenumerate(dataloader):115116#Adversarialgroundtruths117valid=Variable(Tensor(imgs.size(0),1).fill_(1.0),requires_grad=False)118fake=Variable(Tensor(imgs.size(0),1).fill_(0.0),requires_grad=False)119120#Configureinput121real_imgs=Variable(imgs.type(Tensor))122123#-----------------124#TrainGenerator125#-----------------126127optimizer_G.zero_grad()128129#Samplenoiseasgeneratorinput130z=Variable(Tensor(np.random.normal(0,1,(imgs.shape[0],opt.latent_dim))))131132#Generateabatchofimages133gen_imgs=generator(z)134135#Lossmeasuresgenerator'sabilitytofoolthediscriminator136g_loss=adversarial_loss(discriminator(gen_imgs),valid)137138g_loss.backward()139optimizer_G.step()140141#---------------------142#TrainDiscriminator143#---------------------144145optimizer_D.zero_grad()146147#Measurediscriminator'sabilitytoclassifyrealfromgeneratedsamples148real_loss=adversarial_loss(discriminator(real_imgs),valid)149fake_loss=adversarial_loss(discriminator(gen_imgs.detach()),fake)150d_loss=(real_loss+fake_loss)/2151152d_loss.backward()153optimizer_D.step()154155print("[Epoch%d/%d][Batch%d/%d][Dloss:%f][Gloss:%f]"%(epoch,opt.n_epochs,i,len(dataloader),156d_loss.item(),g_loss.item()))157158batches_done=epoch*len(dataloader)+i159ifbatches_done%opt.sample_interval==0:160save_image(gen_imgs.data[:25],'images/%d.png'%batches_done,nrow=5,normalize=True)
優(yōu)點(diǎn)和缺點(diǎn)
與其它技術(shù)一樣,GAN也有自身的優(yōu)缺點(diǎn)。
下面是GAN的一些潛在優(yōu)勢:
GAN并不總是需要帶標(biāo)簽的樣本來訓(xùn)練;
它們更容易訓(xùn)練依賴于蒙特卡羅(Monte Carlo)近似的對數(shù)分割函數(shù)梯度的生成模型。由于蒙特卡羅方法在高維空間中不能很好地工作,這樣的生成模型不能很好地執(zhí)行像使用ImageNet進(jìn)行訓(xùn)練的現(xiàn)實(shí)任務(wù)。
他們沒有引入任何確定性偏差。 像變分自動編碼器這樣的某些生成方法會引入確定性偏差,因?yàn)樗鼈儍?yōu)化了對數(shù)似然的下界,而不是似然本身。
同樣,GAN也有它的缺點(diǎn):
GAN特別難訓(xùn)練。這些網(wǎng)絡(luò)試圖優(yōu)化的函數(shù)是一個(gè)本質(zhì)上沒有封閉形式的損失函數(shù)。因此,優(yōu)化這一損失函數(shù)是非常困難的,需要在網(wǎng)絡(luò)結(jié)構(gòu)和訓(xùn)練協(xié)議方面進(jìn)行大量的反復(fù)試驗(yàn);
(特別是)對于圖像生成,沒有適當(dāng)?shù)拇胧﹣碓u估準(zhǔn)確性。 由于合成圖像可以通過計(jì)算機(jī)本身來實(shí)現(xiàn),因此實(shí)際結(jié)果是一個(gè)非常主觀的主題,并且取決于人類觀察者。 相反,我們有起始分?jǐn)?shù)和Frechet初始距離等功能來衡量他們的表現(xiàn)。
GAN的應(yīng)用
最有趣的部分來了!
我們可以用GAN做的所有驚人的東西。 在它所有潛在用途中,GAN已經(jīng)在計(jì)算機(jī)視覺領(lǐng)域中實(shí)現(xiàn)了大量應(yīng)用。
文本-圖像轉(zhuǎn)換
這個(gè)概念有許多實(shí)驗(yàn)的方法,例如TAC-GAN(文本條件輔助分類器生成對抗網(wǎng)絡(luò))。
左:TAC-GAN的結(jié)構(gòu)示意圖。右:將一行文本輸入網(wǎng)絡(luò)所產(chǎn)生的結(jié)果。
域遷移(Domain Transfer)
它包括使用稱為CGAN(條件生成對抗網(wǎng)絡(luò))的特殊類型的GAN進(jìn)行圖像到圖像的轉(zhuǎn)換。
繪畫和概念設(shè)計(jì)從未如此簡單。
然而,雖然GAN可以從它的草圖中完成像錢包這樣簡單的繪圖,但繪制更復(fù)雜的東西,如完美的人臉,目前還不是GAN的強(qiáng)項(xiàng)。
CGAN pix2pix的實(shí)驗(yàn)結(jié)果
Image Inpaintinng(圖像修復(fù))/Image Outpainting(圖像拓展)
生成網(wǎng)絡(luò)的兩個(gè)非常激動人心的應(yīng)用是:圖像修復(fù)(Inpainting)和圖像拓展(Outpainting)。
第一種包括在圖像中填充或噪聲,這可以看作是圖像的修復(fù)。例如,給定一個(gè)殘缺的圖像,GAN能夠以“passable”的方式對其進(jìn)行糾正它。
另一方面,圖像拓展涉及到使用網(wǎng)絡(luò)自身的學(xué)習(xí)來想象一個(gè)圖像在當(dāng)前邊界之外可能會是什么樣子。
左:圖像修復(fù)結(jié)果;右:圖像拓展結(jié)果。
人臉合成
由于生成網(wǎng)絡(luò)的存在,使得人臉合成成為了可能,這涉及到從不同角度生成單個(gè)人臉圖像。
這就是為什么面部識別不需要數(shù)百個(gè)人臉樣本,只需要用一個(gè)樣本就能識別出來的原因。
不僅如此,生成“人造人臉”也變得可能。 NVIDIA最近使用他們的GAN 2.0在Celeba Hq數(shù)據(jù)集上生成了高清分辨率的人造人臉,這是高分辨率合成圖像生成的第一個(gè)例子。
用Progressive GAN生成想象中的名人面孔。
GANimation
GAN使得諸如改變面部運(yùn)動這樣的事情也成為可能。GANimation是一項(xiàng)使用PyTorch的研究成果,它將自己定義為“從一張圖像中提取具有解剖學(xué)意義的面部動畫”。
GANimation官方實(shí)現(xiàn)。
地址:https://www.albertpumarola.com/research/GANimation/index.html
繪畫-照片轉(zhuǎn)換
利用GAN使圖像變得更逼真的另一個(gè)例子是簡單地將繪畫變成照片。
這是使用稱為CycleGAN的特殊類型的GAN完成的,它使用兩個(gè)發(fā)生器和兩個(gè)鑒別器。
我們把一個(gè)發(fā)生器稱為G,它把圖像從X域轉(zhuǎn)換成Y域。另一個(gè)生成器稱為F,它將圖像從Y轉(zhuǎn)換為X。每個(gè)生成器都有一個(gè)對應(yīng)的鑒別器,該鑒別器試圖將其合成的圖像與真實(shí)圖像區(qū)分開來。
CycleGAN的結(jié)果。
地址:https://github.com/junyanz/CycleGAN
GAN是一把雙刃劍
機(jī)器學(xué)習(xí)和GAN肯定會在不久的將來對成像和攝影產(chǎn)生巨大影響。
目前,該技術(shù)能夠從文本輸入生成簡單圖像。然而,在可預(yù)見的未來,它不僅能夠創(chuàng)建高分辨率的精確圖像,還能夠創(chuàng)建完整的視頻。
想象一下,只需要簡單地將腳本輸入到GAN中,便可以生成一部電影。不僅如此,每個(gè)人都可以使用簡單的交互式應(yīng)用程序來創(chuàng)建自己的電影(甚至可以自己主演?。?。
當(dāng)然,技術(shù)是一把雙刃劍。
若是這么好的技術(shù)被壞人利用,后果是不堪設(shè)想的。完美的假圖像還需要一種方法來識別和檢測它們,我們需要對這類圖像的產(chǎn)生進(jìn)行管制。
目前,GAN已經(jīng)被用于制作虛假視頻或“Deepfakes”,這些視頻正以消極的方式被使用著,例如生成名人假的不良視頻或讓人們在不知情的情況下“被發(fā)表言論”。
音頻、視頻合成技術(shù)使用不良手段造成傳播后的結(jié)果將是非常可怕的。
-
AI
+關(guān)注
關(guān)注
87文章
32456瀏覽量
271662 -
GaN
+關(guān)注
關(guān)注
19文章
2080瀏覽量
75060 -
計(jì)算機(jī)視覺
+關(guān)注
關(guān)注
8文章
1703瀏覽量
46249
原文標(biāo)題:為什么說GAN很快就要替代現(xiàn)有攝影技術(shù)了?
文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
AI作畫大受追捧,生成式AI技術(shù)的機(jī)會與挑戰(zhàn)!
基于擴(kuò)散模型的圖像生成過程

現(xiàn)有的技術(shù)能實(shí)現(xiàn)嗎?
電動汽車會取代燃油汽車嗎?
你知道哪些高科技可能會含有的小功率模塊電源嗎
MRAM實(shí)現(xiàn)對車載MCU中嵌入式存儲器的取代
解碼會占用多少內(nèi)存?使用vpp進(jìn)行圖像處理最大可能會消耗多少內(nèi)存?
未來AI可能會更替180萬個(gè)崗位,你該如何應(yīng)對?
人工智能可能會替代人類嗎
智慧城市AI軟件市場在2025可能會怎樣
Stability AI開源圖像生成模型Stable Diffusion
虹軟圖像深度恢復(fù)技術(shù)與生成式AI的創(chuàng)新 生成式AI助力
在線研討會 | 9 月 19 日,利用 GPU 加速生成式 AI 圖像內(nèi)容生成

評論