使用CYCLEGAN模擬手飾配戴VR

最近有位網友傳給我一個影片範例,詢問可否訓練出類似VR效果的模型。影片中,使用者透過一支APP,選擇想要試戴的戒指後,使用APP透過手機鏡頭便能預覽試戴後的模樣,這應該是擴增實境AR的應用之一。

要如何達成這樣的效果?以往深度學習還未成熟的時候,是計算鏡頭前手掌的角度和尺寸,再依據這些資訊將戒指圖片進行縮放旋轉,最後將戒指圖片融合到影像中的手指區域,這些影像分析合成的步驟說來簡單,但實際要掌控的變因和計算量非常的大,真要作出如影片那樣效果會非常困難,那麼,可否透過深度學習模型來達成呢?我直覺的想法是可透過GAN的方式,如DCGAN或CycleGAN來產生虛擬的圖片。

DCGAN由於需要成對的相片,資料準備上比較不方便,因此,下方的測試實驗皆是用CycleGAN來進行的。

CycleGAN

CycleGAN最早是由中國的科學家朱俊彥於2017所推出,在GAN家族中算是最簡易使用的,因為它不像pix2pix需要準備成對的訓練圖片,只需要A與B兩種類型不定數量的圖片,就能訓練出A轉B或B轉A的虛擬圖片產生器。

CycleGAN架構

基本架構類似於pix2pix,但最大差異在於CycleGAN是由兩組生成對抗模型組成,所生成圖片的方向互為相反,如下圖,Real A與Real B分別代表資料集中的兩類圖片,兩組相反的Generator方向為「A 生成🡪B」以及「B 生成🡪A」,而兩個Discriminator則用於判斷A與B的真偽。

preview

(圖片來源:https://zhuanlan.zhihu.com/p/78145792

與其它的GAN模型相同,CycleGAN的Discriminator(D_A與D_B)也是要針對成對的圖片進行判斷真偽,只不過這些成對圖片是由Generator所產出而非人為事先準備,因此,這就產生了一個問題,這些訓練圖片皆是由CycleGAN模型所產生,再搭配一張隨機取得的Real真實圖片交由Duscriminator判定,兩張圖片並非成對可直接比較差異,因此要如何計算出loss(差多大或多不像)?所以,作者另外提出了cycle consistent loss(循環一致損失)的作法,也就是,把A推論到B之後還得將B推論回A ,此時,原本的A與推論回來的A兩者差異應當愈小愈好。

CycyleGAN的應用

CycyleGAN可以在不改變圖片主要構圖及物件的情況下,轉化整張圖片到另一種圖案的氛圍或樣式,稱為Image-to-image translation。

莫內名畫 → 相片

各式風格轉換

物件變化(如斑馬🡨🡪馬、蘋果🡨🡪橘子)

城市場景變化(道路鋪面變換)。

城市場景轉換可應用於道路的segmentation如下:

季節轉換(冬🡨🡪夏)

圖像增強(如手機相片轉為單眼相機所拍攝的淺景深相片)

資料準備

跟老婆要了兩個少用的手環和戒指,接著用簡易的檯燈打燈,戴上這手環和戒指,使用手機拍攝。

戒指Dataset:

trainA:未戴任何物品的手,共922張。

trainB:戴戒指的手,共1,242張。

手環Dataset:

trainA:未戴任何物品的手,共922張。

trainB:戴手環的手,共1,031張。

CyclenGAN訓練

目前網路上有不少CycleGAN的教學,無論用Keras或PyTorch都相當值得一試,由於尚不確定CycleGAN應用於AR試戴的效果,因此本文先使用pytorch-CycleGAN-and-pix2pix這套module來測試,該模組可訓練Pix2Pix以及CycleGAN兩種模型,且效果相當不錯.其實,這個模組就是來自於CycleGAN之父朱俊彥的傑作

git clone https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix

cd pytorch-CycleGAN-and-pix2pix

python train.py –dataroot ../dataset/Ring_A/ –name cyclegan_ring_A –model cycle_gan –continue_train

–dataroot ../dataset/Ring_A/                🡪        trainA和trainB所在的目錄

–name cyclegan_ring_A                🡪        此項訓練的自定名稱,訓練過程中產生的檔案皆會放置

於results/cyclegan_ring_A下

–model cycle_gan                        🡪        要訓練的是cycle_gan還是pix2pix

–continue_train                        🡪        若加此參數,會從上次結束或中斷的epoch繼續訓練。

200epochs在2080Ti GPU訓練約需要二天,訓練過程中可經由results/cyclegan_ring_A/test_latest/index.html網頁預覽各epoch訓練的結果。

訓練結果

使用CycleGAN訓練效果比起複雜的影像分析處理更方便,效果也相當不錯。相當適合珠寶手飾的網路商店,提供給顧客作為虛擬試戴服務使用。

由於CycleGAN訓練出的圖形尺寸有限,且細緻度不是很理想,因此,建議可先訓練一個object detect模型來偵測並取出需要的正方形局部(如戒指為手指某一段、手環為腕部),再將取出的局部區域進行CycleGAN預測,而非使用整張圖片來預測,最後,再將預測結果貼回原相片,如此一來,可改善尺寸及畫質不足的情況。