這個項目名叫「人像卡通化 (Photo to Cartoon)」,已經在 GitHub 上開源。但對於不想動手下載各種軟件、數據集、訓練模型的普通用戶,該公司開放了一個 名爲「AI 卡通秀」的小程序,可以生成各種風格的卡通照片、gif 表情包,完全可以滿足社交需求

先來看一下小程序的生成效果:

看上去好像還不錯。但考慮到明星照可能會被用作訓練數據,機器之心小編決定用自己的照片試一下:

效果依然傳神!而且,除了常規卡通頭像之外,你還可以選擇生成圖像的濾鏡和風格,如懷舊、字雲、素描、剪紙、豹紋等。

小姐姐能完美轉換,那小哥哥呢?我們拿象牙山 F4 之一的謝廣坤測試了一下(衆所周知,廣坤叔的顏值還是很能打的):

由於照片中人物右側下巴的邊界不太明顯,生成的卡通頭像略有瑕疵,但還是一眼就能看出人物特徵。當然,這還不是最歡樂的。接下來, 你還可以做表情包

話說回來,這種需要上傳照片的應用常常引發大家對於隱私問題的擔憂。有了「Zao」的前車之鑑,「AI 卡通秀」在《用戶協議》中表示,「 除非爲了改善我們爲您提供的服務或另行取得您的再次同意,否則我們不會以其他形式或目的使用上述內容(頭像照片等) 」。

如果你還是擔心隱私問題,可以直接去 GitHub 上獲取開源數據和代碼,訓練自己的模型進行測試。

項目地址:https://github.com/minivision-ai/photo2cartoon

接下來,我們就來看看這一應用背後的技術細節。

這麼好玩的效果是怎麼做到的呢?

人像卡通風格渲染的目標是,在保持原圖像 ID 信息和紋理細節的同時,將真實照片轉換爲卡通風格的非真實感圖像。

但是圖像卡通化任務面臨着一些難題:

  1. 卡通圖像往往有清晰的邊緣,平滑的色塊和經過簡化的紋理,與其他藝術風格有很大區別。使用傳統圖像處理技術生成的卡通圖無法自適應地處理複雜的光照和紋理,效果較差;基於風格遷移的方法無法對細節進行準確地勾勒。

  2. 數據獲取難度大。繪製風格精美且統一的卡通畫耗時較多、成本較高,且轉換後的卡通畫和原照片的臉型及五官形狀有差異,因此不構成像素級的成對數據,難以採用基於成對數據的圖像翻譯(Paired Image Translation)方法。

  3. 照片卡通化後容易丟失身份信息。基於非成對數據的圖像翻譯(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

  1. 人像卡通化預訓練模型:photo2cartoon_weights.pt,存放在 models 路徑下。

  2. 頭像分割模型:seg_model_384.pb,存放在 utils 路徑下。

  3. 人臉識別預訓練模型:model_mobilefacenet.pth,存放在 models 路徑下。(From: InsightFace_Pytorch)

  4. 卡通畫開源數據: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
相關文章