零門檻人像轉(zhuǎn)卡通、GIF表情包,這個(gè)項(xiàng)目不僅開源,還做成了小程序
之前開源的「人臉變卡通」項(xiàng)目往往可以提供很多鬼畜素材,要么嘴歪眼斜,要么臉型扭曲,甚至讓你的五官看上去是隨便放到臉盤里的,完全不像陽間該有的畫風(fēng)……但小視科技最近開源的一個(gè)項(xiàng)目似乎改變了這種印象,不僅可以生成逼真的卡通頭像,還能利用微信小程序做成動(dòng)圖表情包,普通人也可以零門檻上手。
這個(gè)項(xiàng)目名叫「人像卡通化 (Photo to Cartoon)」,已經(jīng)在 GitHub 上開源。但對(duì)于不想動(dòng)手下載各種軟件、數(shù)據(jù)集、訓(xùn)練模型的普通用戶,該公司開放了一個(gè)名為「AI 卡通秀」的小程序,可以生成各種風(fēng)格的卡通照片、gif 表情包,完全可以滿足社交需求。
先來看一下小程序的生成效果:
看上去好像還不錯(cuò)。但考慮到明星照可能會(huì)被用作訓(xùn)練數(shù)據(jù),機(jī)器之心小編決定用自己的照片試一下:
效果依然傳神!而且,除了常規(guī)卡通頭像之外,你還可以選擇生成圖像的濾鏡和風(fēng)格,如懷舊、字云、素描、剪紙、豹紋等。
小姐姐能完美轉(zhuǎn)換,那小哥哥呢?我們拿象牙山 F4 之一的謝廣坤測(cè)試了一下(眾所周知,廣坤叔的顏值還是很能打的):
由于照片中人物右側(cè)下巴的邊界不太明顯,生成的卡通頭像略有瑕疵,但還是一眼就能看出人物特征。當(dāng)然,這還不是最歡樂的。接下來,你還可以做表情包!
話說回來,這種需要上傳照片的應(yīng)用常常引發(fā)大家對(duì)于隱私問題的擔(dān)憂。有了「Zao」的前車之鑒,「AI 卡通秀」在《用戶協(xié)議》中表示,「除非為了改善我們?yōu)槟峁┑姆?wù)或另行取得您的再次同意,否則我們不會(huì)以其他形式或目的使用上述內(nèi)容(頭像照片等)」。
如果你還是擔(dān)心隱私問題,可以直接去 GitHub 上獲取開源數(shù)據(jù)和代碼,訓(xùn)練自己的模型進(jìn)行測(cè)試。
項(xiàng)目地址:https://github.com/minivision-ai/photo2cartoon
接下來,我們就來看看這一應(yīng)用背后的技術(shù)細(xì)節(jié)。
這么好玩的效果是怎么做到的呢?
人像卡通風(fēng)格渲染的目標(biāo)是,在保持原圖像 ID 信息和紋理細(xì)節(jié)的同時(shí),將真實(shí)照片轉(zhuǎn)換為卡通風(fēng)格的非真實(shí)感圖像。
但是圖像卡通化任務(wù)面臨著一些難題:
- 卡通圖像往往有清晰的邊緣,平滑的色塊和經(jīng)過簡(jiǎn)化的紋理,與其他藝術(shù)風(fēng)格有很大區(qū)別。使用傳統(tǒng)圖像處理技術(shù)生成的卡通圖無法自適應(yīng)地處理復(fù)雜的光照和紋理,效果較差;基于風(fēng)格遷移的方法無法對(duì)細(xì)節(jié)進(jìn)行準(zhǔn)確地勾勒。
- 數(shù)據(jù)獲取難度大。繪制風(fēng)格精美且統(tǒng)一的卡通畫耗時(shí)較多、成本較高,且轉(zhuǎn)換后的卡通畫和原照片的臉型及五官形狀有差異,因此不構(gòu)成像素級(jí)的成對(duì)數(shù)據(jù),難以采用基于成對(duì)數(shù)據(jù)的圖像翻譯(Paired Image Translation)方法。
- 照片卡通化后容易丟失身份信息?;诜浅蓪?duì)數(shù)據(jù)的圖像翻譯(Unpaired Image Translation)方法中的循環(huán)一致性損失(Cycle Loss)無法對(duì)輸入輸出的 id 進(jìn)行有效約束。
那么如何解決這些問題呢?
小視科技的研究團(tuán)隊(duì)提出了一種基于生成對(duì)抗網(wǎng)絡(luò)的卡通化模型,只需少量非成對(duì)訓(xùn)練數(shù)據(jù),就能獲得漂亮的結(jié)果??ㄍL(fēng)格渲染網(wǎng)絡(luò)是該解決方案的核心,它主要由特征提取、特征融合和特征重建三部分組成。
整體框架由下圖所示,該框架基于近期研究 U-GAT-IT(論文《U-GAT-IT: Unsupervised Generative Attentional Networks with Adaptive Layer-Instance Normalization for Image-to-Image Translation》。
模型結(jié)構(gòu)方面,在 U-GAT-IT 的基礎(chǔ)上,研究者在編碼器之前和解碼器之后各增加了 2 個(gè) hourglass 模塊,漸進(jìn)地提升模型特征抽象和重建能力。
特征提取
特征提取部分包含堆疊的 Hourglass 模塊、下采樣模塊和殘差模塊。
Hourglass 模塊常用于姿態(tài)估計(jì),它能夠在特征提取的同時(shí)保持語義信息位置不變。該方法采用堆疊的 Hourglass 模塊,漸進(jìn)地將輸入圖像抽象成易于編碼的形式。4 個(gè)殘差模塊則用于編碼特征并提取統(tǒng)計(jì)信息,用于后續(xù)的特征融合。
特征融合
近期論文 U-GAT-IT 提出了一種歸一化方法——AdaLIN,能夠自動(dòng)調(diào)節(jié) Instance Norm 和 Layer Norm 的比重,再結(jié)合注意力機(jī)制實(shí)現(xiàn)人像日漫風(fēng)格轉(zhuǎn)換。
研究人員基于此提出了 Soft-AdaLIN(Soft Adaptive Layer-Instance Normalization)歸一化方法。先將輸入圖像的編碼特征統(tǒng)計(jì)信息和卡通特征統(tǒng)計(jì)信息融合,再以 AdaLIN 的方式反歸一化解碼特征,使卡通畫結(jié)果更好地保持輸入圖像的語義內(nèi)容。
不同于原始的 AdaLIN,這里的「Soft」體現(xiàn)在不直接使用卡通特征統(tǒng)計(jì)量來反歸一化解碼特征,而是通過可學(xué)習(xí)的權(quán)重 w_μ 和 w_σ 來加權(quán)平均卡通特征和編碼特征的統(tǒng)計(jì)量,并以此對(duì)歸一化后的解碼特征進(jìn)行反歸一化。
編碼特征統(tǒng)計(jì)量 μ_en 和 σ_en 提取自特征提取階段中各 Resblock 的輸出特征,卡通特征統(tǒng)計(jì)量則通過全連接層提取自 CAM(Class Activation Mapping)模塊輸出的特征圖。加權(quán)后的統(tǒng)計(jì)量為:
Soft-AdaLIN 操作可以表示為:
特征重建
特征重建部分負(fù)責(zé)從編碼特征生成對(duì)應(yīng)的卡通圖像。
這部分采用與特征提取部分對(duì)稱的結(jié)構(gòu),通過解碼模塊、上采樣模塊和 Hourglass 模塊生成卡通畫結(jié)果。
損失函數(shù)
如上所述,照片卡通化后容易丟失身份信息。為了使輸出結(jié)果體現(xiàn)人物信息,除了常規(guī)的 Cycle Loss 和 GAN Loss,研究人員還引入了 ID Loss:使用預(yù)訓(xùn)練的人臉識(shí)別模型來提取輸入真人照和生成卡通畫的 id 特征,并用余弦距離來約束,使卡通畫的 id 信息與輸入照片盡可能相似。
如何實(shí)現(xiàn)?
安裝依賴庫
項(xiàng)目所需的主要依賴庫如下:
- python 3.6
- pytorch 1.4
- tensorflow-gpu 1.14
- face-alignment
- dlib
Clone
- git clone https://github.com/minivision-ailab/photo2cartoon.git
- cd ./photo2cartoon
下載資源
資源地址:
- https://drive.google.com/open?id=1eDNGZT3jszHLXQ9XGIUPtcu72HdBmHuX
- https://pan.baidu.com/s/1DxWWBAoaBpsei_rynZUZzw 提取碼:z2nm
- 人像卡通化預(yù)訓(xùn)練模型:photo2cartoon_weights.pt,存放在 models 路徑下。
- 頭像分割模型:seg_model_384.pb,存放在 utils 路徑下。
- 人臉識(shí)別預(yù)訓(xùn)練模型:model_mobilefacenet.pth,存放在 models 路徑下。(From: InsightFace_Pytorch)
- 卡通畫開源數(shù)據(jù):cartoon_data,包含 trainB 和 testB。
測(cè)試
將一張測(cè)試照片(亞洲年輕女性)轉(zhuǎn)換為卡通風(fēng)格:
- python test.py --photo_path ./images/photo_test.jpg --save_path ./images/cartoon_result.png
訓(xùn)練
1. 數(shù)據(jù)準(zhǔn)備
訓(xùn)練數(shù)據(jù)包括真實(shí)照片和卡通畫像,為降低訓(xùn)練復(fù)雜度,團(tuán)隊(duì)對(duì)兩類數(shù)據(jù)進(jìn)行了如下預(yù)處理:
- 檢測(cè)人臉及關(guān)鍵點(diǎn)。
- 根據(jù)關(guān)鍵點(diǎn)旋轉(zhuǎn)校正人臉。
- 將關(guān)鍵點(diǎn)邊界框按固定的比例擴(kuò)張并裁剪出人臉區(qū)域。
- 使用人像分割模型將背景置白。
團(tuán)隊(duì)開源了 204 張?zhí)幚砗蟮目ㄍó嫈?shù)據(jù),用戶還需準(zhǔn)備約 1000 張人像照片(為匹配卡通數(shù)據(jù),盡量使用亞洲年輕女性照片,人臉大小最好超過 200x200 像素),使用以下命令進(jìn)行預(yù)處理:
- python data_process.py --data_path YourPhotoFolderPath --save_path YourSaveFolderPath
將處理后的數(shù)據(jù)按照以下層級(jí)存放,trainA、testA 中存放照片頭像數(shù)據(jù),trainB、testB 中存放卡通頭像數(shù)據(jù)。
- ├── dataset
- └── photo2cartoon
- ├── trainA
- ├── xxx.jpg
- ├── yyy.png
- └── ...
- ├── trainB
- ├── zzz.jpg
- ├── www.png
- └── ...
- ├── testA
- ├── aaa.jpg
- ├── bbb.png
- └── ...
- └── testB
- ├── ccc.jpg
- ├── ddd.png
- └── ...
2. 訓(xùn)練
重新訓(xùn)練:
- python train.py --dataset photo2cartoon
加載預(yù)訓(xùn)練參數(shù):
- python train.py --dataset photo2cartoon --pretrained_weights models/photo2cartoon_weights.pt