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