Synthesizing Images of Humans in Unseen Poses簡介

Guha Balakrishnan, Amy Zhao, Adrian V. Dalca, Fredo Durand, John Guttag, “Synthesizing Images of Humans in Unseen Poses”, arXiv:1804.07739

CVPR 2018

Github Code:沒找到,如果有的話歡迎留言,我會再做更新。

因為沒有Code,所以我有說錯的地方請指正。

簡介

本篇論文主要是在展示基於Pose(姿勢)的圖像合成,

主要的想法是透過一張輸入圖片+一張2D的骨架圖片就可以合成出一張圖片。

本篇不同以往的是採用了模組化(最下方額外補充)的架構,

以往都是訓練一個非常強大的Model,

而這次是採用多個Model做不同的工作,

最後再結合。

整個任務困難的點是在

  • 前景合成:人物合成的細節(邊緣、陰影)。
  • 背景修補:因人物動作改變,要如何填補空缺的部分。

訓練是透過Youtube上面的影片,

挑選3個不同的運動當作classes(瑜珈、高爾夫、網球),

而挑選這些動作也是有原因的,

因為這幾項運動的影片的背景不太會變動,

因此可以透過這個特性,學會Pose以及背景修補。

架構

主要是透過U-Net做不同的模組,

如果對U-Net不清楚的可以去看這篇【深度学习论文】:U-Net

或是搭配程式碼做觀看U-Net Github Pytorch版本

而這邊採用U-Net的原因是因為每個模組的輸入和輸出的圖像並不會移動,

而U-Net在這類型的圖像合成任務上很成功。

輸入

(example, label) = ((Is, ps, pt), It)

可以理解成用同一個影片,但是不同的圖像(不同的時間點的圖像)做訓練,

s = source - 在影片i秒的frame

t = target - 在影片j秒的frame

整個任務是希望輸入Is這張圖以及Pt的骨架可以生成出一張圖片,

不過這邊是training,所以都要丟進去學習。

Source Image Segmentation

step1.

先將2D的Pose(H X W)拆解成 J 個 2D Pose = (H X W X J)

備註:

J = 14,

joints: 頭, 脖子, 肩膀, 手軸, 手腕, 臀部, 膝蓋 以及腳踝。

step2.

透過2D Pose(Ps - H X W X J) + 2D Image(Is - H X W X 3) 當作輸入,

學會每個Pose是在圖片中的哪個部分,

透過上面的資訊,輸出骨架中的 L 個位置 + 1個(背景)的Mask,輸出為(∆Ms - H X W X (L+1) ),

Mask中白點為我們要的,黑點為我們不要的。

再透過下方公式求得上方圖片的Ms(下方有圖)

最後一個參數不知道怎麼來的,論文中的解釋是residual component,有興趣的去研究研究。

推測是用UNet的特性Crop and Copy才得出這個公式,

備註:

L = 10

將身體分成L = 10個部位:頭部,上臂,下臂,上腿,下腿和軀幹。 身體部位與關節不同; 前9個部分由2個關節組成,軀幹包含4個關節。

輸出的Mask如下圖:

透過這個Mask,對原本的圖片做相乘,

就可以拿取前景的各個部位,得出Foregrounds Layers。

Spatial Transform

這部分並不是透過U-Net做學習,

而是過簡單的轉換,將上面的每個Layer(L+1)做位移、旋轉、縮放等等。

bilinear interpolation functio放大後,

給出一個基於 Target Pose 轉換後的 Foreground Layer (W),

這邊的 W 還不能直接使用,

因為他是對每個L+1個的身體各部分(Foreground Layers)去做姿勢的轉換,

但我們不知道實際上Is套用Target Pose後,會影響到原始圖片中的哪些pixel。

Foreground Synthesis

為了解決上面的問題,我們要得出基於Is的target pose合成圖,

做法就是將 W 和 Pt 結合(concatenated)在一起丟入U-Net去做訓練,

這樣看起來是可行的。

這邊輸出的兩個東西 Yfg / Mt 是使用同一個U-Net,

只是在同一個模型中的不同layer做輸出。

Background Synthesis

首先將Ms的最後一層背景層拿出來,

之後將背景層填補雜訊再與Is做結合可得出圖1。

透過輸入Ps以及圖1讓UNet學會填補那些位置得出Ybg,

可以看出Ybg其實沒有做得很好,

但是也沒關係,因為之後前景會把我們Ybg自行合成的多數位置都給蓋掉,

所以也不用太講究。

Foreground/Background Compositing

結合的方式也很簡單,透過這三個輸出做結合。

展示一下輸出的結果,

儘管身體依照target pose改變了,

但是整體的感覺還算像,

可惜的是高爾夫球竿和球拍這種細節卻沒學好。

Loss funtion

VGG

指的是VGG19中的前16個layer,

主要想法:當兩張圖片背景相同、人物相同就只有姿勢不同,

那麼兩張圖片透過VGG這個特徵萃取的模型,輸出的值應該也要差不多。

所以採用VGG這個loss function。

GAN

GAN主要是添加Discriminator,

作者的想法是透過Discriminator去做細節的判別,

因此給出了最終的loss function,

備註:

這邊的 λ 設為 0.1

Discriminator:

這邊paper沒有提到他的架構。

實驗

  • 同個類別不同pose

    舉例:做瑜珈但是不同動作。

    使用VGG+GAN當作loss function其實做得不錯,

    在一些細節處都做的比較好 e.g. 服裝、陰影

  • 合成影片

    透過輸入一連串的pose來合成出一段影片,

    影片的背景是基於輸入圖片的背景,

    而每個frame會隨著輸入的pose骨架而改變。

  • 不同類別不同pose

    舉例:瑜珈 to 網球

    那為什麼要這樣做呢?為什麼不一起訓練?

    因為如果我們每個pose都訓練一個model的話,

    他能夠學到那個類別的細節,e.g.高爾夫手套

結論

這篇提出了將pose合成的任務拆解成各個部分,

e.g.前景、背景。

而出來的成果也不錯,

但是還是有改進空間的,

舉例來說像是物品(球拍、高爾夫球竿)常常都沒有出來,

還有人臉也沒有合成的很好((畢竟合成人臉這件事本身就不簡單。

以及2D pose給的資訊畢竟有限,

未來如果有3D的pose應該能訓練得更好。

額外補充-模組化

模組化的設計是參考自VQA(Visual Question Answering)的這塊領域

他在相關研討提到兩篇paper

J. Andreas et al. Learning to compose neural networks for question answering. arXiv preprint arXiv:1601.01705, 2016.

J. Johnson et al. Inferring and executing programs for visual reasoning. arXiv preprint arXiv:1705.03633, 2017.

我之前也看過幾篇VQA的論文

  • Tbd-net(CVPR 2018)
  • Inferring and executing programs for visual reasoning
  • Neural module networks

我認為模組化的概念比較建議閱讀 Neural module networks(與第一篇Learning to compose neural networks for question answering同作者)。

J. Andreas, M. Rohrbach, T. Darrell, and D. Klein. Neural Module Networks. CoRR, abs/1511.02799, 2015.

不過整體其實也沒用到什麼概念拉,

未來如果有再回去研究VQA的話,我再來重看順便補上簡介。

參考資料:

Synthesizing Images of Humans in Unseen Poses

U-Net: Convolutional Networks for Biomedical Image Segmentation

Neural Module Networks


© XiaoSean 2018. All rights reserved.

Powered by Hydejack v7.5.1