【深度学习】绝了!分割mask生成动漫人脸!爆肝数周,从零搭建
如果文章對你有幫助,記得“在看+點贊+分享”!
主要流程包括:
1、確定目標(分割mask ---> 動漫人臉)
2、確定技術路線(語義分割 + 語義合成)
3、實現(數據集標注 + 模型調優 + 界面編寫)
PS:原作者并沒有開源數據集和代碼, 不過給了所有參考資料的源碼和數據集鏈接!復現應該沒有問題
目標
該項目的目標是建立一個深度學習模型,從分割mask生成動漫人臉肖像。
segmentation mask to anime face portrait
在這個項目中,首先手動標注一小批圖像。然后使用數據增強和 U-Net 模型來乘以分割mask的數量來構建數據集。最后,訓練一個 GauGAN 模型,用于從分割mask中合成動漫人臉。
1. 語義分割
語義分割是為圖像中的每個像素分配標簽(也稱為類 id)的過程。它的結果是一個分割mask,它是一個大小為高度 * 寬度的數組,每個像素都包含一個類 ID。
class id: 0 = background, 5 = hair
1.1 Dataset
在進入圖像生成任務之前,我們需要一個分割mask數據集,用于訓練生成模型將mask轉換為圖像。
不幸的是,我在互聯網上找不到任何動漫人臉分割數據集。盡管如此,Danbooru2019-Portraits 上有一個動漫肖像(512 x 512px)數據集。所以我決定從 Danbooru 肖像中標注的分割mask。
數據集鏈接:https://www.gwern.net/Crops#danbooru2019-portraits
1.2 Annotation
要標注圖像,我們必須確定類。最初的想法是列出 15 個類:
后來為了簡單起見,將其縮減為 7 個類,最終的類列表如下:
background, skin, face, eye, mouth, hair, clothes有許多不同的注釋工具,這里使用的是 labelme。
https://github.com/wkentaro/labelmelabelme GUI
在這項乏味的工作上辛勤工作數周后,設法標注了 200 張圖像
examples of annotated masks
left: original image, middle: segmentation mask, right: visualization of the annotation
1.3 Data Augmentation
當然,200 張帶注釋的圖像不足以讓我們訓練我們的網絡。我們需要使用數據增強技術來增加數據集的大小。
通過隨機旋轉、鏡像和扭曲圖像,我從這 200 個樣本中生成了 3000 多個數據。換句話說,現在我有 3200 個數據。
examples of augmented masks
然而,這些數據在內容和風格方面高度重復,因為它們僅從 200 個樣本中擴充而來。為了訓練網絡將分割掩碼轉換為高質量和多樣化的動漫面孔,我們需要的不僅僅是 200 + 3000 個數據點。因此,我將首先使用這些數據來訓練一個 U-Net 模型來學習從動漫人臉到分割掩碼的翻譯。然后我會將整個 Danbooru 肖像數據集輸入到經過訓練的 U-Net 模型中,以生成更多不同人臉的分割掩碼。
anime face portraits to segmentation mask
1.4 U-Net
U-Net 最初是為了分割醫學圖像進行診斷而引入的。它通過使用跳躍連接來解決傳統 FCN(全卷積網絡)中發生的信息丟失問題,在精確分割方面做得非常好。
U-Net 的架構與 Autoencoder 相似,但從下采樣端到上采樣端有額外的連接層。
source:?https://arxiv.org/abs/1505.04597
在下采樣部分,我使用預訓練的 MobileNetV2 從輸入圖像中提取特征。在上采樣部分,我使用了由 Conv2DTranspose、Batchnorm 和 ReLU 層組成的塊。
U-Net v1, v2 architecture
在我的 U-Net 版本 1 中,輸入和輸出大小為 128 x 128px。經過訓練的模型確實學習了從動漫人臉到分割mask的非常好的映射。但由于我想在我后來的合成模型中擁有 512 x 512px 的輸入和輸出,我將 U-Net 輸出的大小調整為 512 x 512px 并進行插值。然而,結果看起來是像素化的,它未能捕捉到出現在小區域(例如嘴巴)中的某些類別。
在版本 2 中,我只是將輸入和輸出大小更改為 512 x 512px(我一開始并沒有這樣做,因為我不希望輸出嘈雜并在圖像中令人困惑的區域中填充隨機點,例如 衣服)。正如我所料,v2 的輸出很嘈雜。不過,它們看起來比 v1 更好。
U-Net v3 architecture
在版本 3 中,我嘗試通過用 UpSampling2D 層替換 Conv2DTranspose 層來減輕噪音和棋盤偽影。現在的結果比 v2 的要好得多。噪音更少,棋盤偽影更少。
checkerboard artifacts of v2
U-Net segmentation results
最后,我將整個 Danbooru 數據集輸入 U-Net v3 以構建我的分割掩碼數據集。
2. 圖像語義合成
現在,我們有了分割蒙版數據集,是時候深入研究主要任務——圖像語義合成,正如之前所說,這不過是從分割mask到真實圖像的轉換的一個花哨的名稱。
Semantic Image Synthesis: segmentation mask to anime face portrait
2.1 GauGAN
source:?https://github.com/NVlabs/SPADE
GauGAN 由 Nvidia 開發,用于從分割mask合成逼真的圖像。在他們的展示網站上,他們展示了 GauGAN 如何出色地通過幾筆畫來生成逼真的風景圖像。
demo鏈接:https://www.nvidia.com/en-us/research/ai-playground/
GauGAN architecture
上圖展示了 GauGAN 模型的架構。綠色塊完全代表發電機。鑒別器是一個 PatchGAN。
2.2 SPADE
source:?https://nvlabs.github.io/SPADE/
GauGAN 的核心是 SPADE(Spatially-Adaptive Denormalization)模塊,它是從 Batch Norm 修改而來的歸一化層。它旨在克服 pix2pixHD 中的挑戰:在具有統一類 ID 的大區域丟失語義信息。
這是通過將 Conv 層引入Batch Norm來解決的,這樣它具有不同的參數集(β,γ),這些參數以分割mask為條件,并且會隨著不同的區域而變化。這意味著 SPADE 允許生成器在統一標簽區域中學習更多細節。
因此,在我們的問題中,生成的圖像可能如下所示:
2.3 Pretrained Encoder
encoder?實際上是可選的,因為可以直接從高斯分布中采樣 z(潛在向量)而無需任何輸入(就像 vanilla GAN)。這里使用了encoder?,因為我想用參考圖像對生成的圖像進行樣式設置。
VAE architecture
由于與encoder一起訓練 GauGAN 是不穩定的,需要更多的時間和資源,所以我提前使用 VAE 訓練了我的編碼器,然后在 GauGAN 模型的訓練過程中使用預訓練的encoder對 z 進行采樣。
2.4 Results
以下是從不同的分割mask和參考圖像生成的圖像的結果。
semantic image synthesis results
2.5?Latent Attribute Vectors
除了使用參考圖像來控制輸出圖像的風格外,我們還可以直接操縱潛在向量 z 來做到這一點。為此,我們首先需要找出潛在空間中的屬性向量。
動漫角色面部最重要的屬性之一是頭發顏色。但是,由于數據集沒有帶有頭發顏色的標簽,我必須自己使用 i2v 來標記它們,i2v 是一個用于估計插圖標簽的庫。然后,我們可以通過使用 t-SNE 將樣本圖像的潛在向量投影到 2D 空間來可視化潛在空間以及估計的標簽。
t-SNE of 4000 samples (estimated hair colors are indicated by image border colors)
最后,通過計算不同標簽的潛在向量之間的距離和方向,我們可以得到屬性向量。下面的動畫演示了使用提取的屬性向量在頭發顏色之間進行的轉換。
3. GUI
使用 python tkinter 庫創建了一個 GUI,用于編輯生成的圖像和分割mask。以下是演示視頻:
4. 總結
這個項目還有改進的空間,尤其是語義分割模型(U-Net)和語義圖像合成模型(GauGAN)。以下是未來要做的事情的清單:
尋找更好的模型架構以從原始圖像中獲得更準確的分割掩碼
改進 GauGAN 模型以消除頭發區域出現的噪聲
訓練生成模型以生成隨機分割mask
參考資料
[1] D. Gwern Branwen, “Anime Crop Datasets: Faces, Figures, & Hands”, Gwern.net, 2022.?https://www.gwern.net/Crops#danbooru2019-portraits
[2] “ wkentaro/labelme: Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation).”, GitHub, 2022.?https://github.com/wkentaro/labelme
[3] O. Ronneberger, P. Fischer and T. Brox, “U-Net: Convolutional Networks for Biomedical Image Segmentation”, arXiv.org, 2022.?https://arxiv.org/abs/1505.04597
[4] Odena, et al., “Deconvolution and Checkerboard Artifacts”, Distill, 2016.?http://doi.org/10.23915/distill.00003
[5] “The NVIDIA AI Playground”, NVIDIA, 2022.?https://www.nvidia.com/en-us/research/ai-playground/
[6] “NVlabs/SPADE: Semantic Image Synthesis with SPADE”, GitHub, 2022.?https://github.com/NVlabs/SPADE
[7] “Semantic Image Synthesis with Spatially-Adaptive Normalization”, Nvlabs.github.io, 2022.?https://nvlabs.github.io/SPADE/
[8] “rezoo/illustration2vec: A simple deep learning library for estimating a set of tags and extracting semantic feature vectors from given illustrations.”, GitHub, 2022.?https://github.com/rezoo/illustration2vec
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【深度学习】绝了!分割mask生成动漫人脸!爆肝数周,从零搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: liunx宝塔配置https_宝塔面板安
- 下一篇: 【深度学习】这千层transformer