論文まとめ　PG2：Pose Guided Person Image Generation

#はじめに
NIPs2017で採択されたPG2(Pose Guided Person Image Generation)という論文をまとめてみた。
NIPs上の該当ページはこちら。
https://nips.cc/Conferences/2017/Schedule?showEvent=8837

論文の本文はこちら。
http://papers.nips.cc/paper/6644-pose-guided-person-image-generation.pdf

解説用Videoはこちら。
https://www.youtube.com/watch?v=FBW6drMpK3U&feature=youtu.be

#要点
PG2はある人物の画像を任意のポーズに変換する仕組みである。具体的には、ある人物Aの画像（Condition Image）と、その画像にはない別のポーズB（Target Poses）を入力として、人物AがポーズBをした画像を生成するシステム。（下図参照）
<img width="653" alt="スクリーンショット 2017-12-30 14.15.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/0eaddc8f-e371-d25f-d3a0-c481ea96bbc8.png">
（Supplementary materials Pose Guided Person Image Generation Figure4より）

モデルは２つのステージからなる。１つ目のステージ（G1）でCondition ImageとTarget PosesをU-netに似たネットワークに入力してtarget poseをしたCondition imageの人の粗い画像を出力する。

２つ目のステージ（G2）でその画像をやはりU-netに似た仕組みに入力し、GANsの学習方法でrefineする。（下図参照）
<img width="960" alt="スクリーンショット 2017-12-30 14.13.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/7ba4c67f-ddd6-e53c-28bf-c53a38b5f7b7.png">

#ステージ１（G1）
上述のように、ステージ１（G1）ではCondition Image $I_A$ とTarget Poses $P_B$ をネットワークに入力してtarget poseをしたCondition imageの人の粗い画像 $\hat{I} _{B1}$ を出力する。詳細は以下。

###G1モデルのアーキテクチャ
以下のようにU-netを模している。
<img width="640" alt="スクリーンショット 2017-12-30 15.36.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/21f0eba1-ab28-efe6-7e40-594ff3b6b358.png">
（Supplementary materials Pose Guided Person Image Generation Figure1,2より）

複数回畳み込んだ後に、全結合で64次元のベクトルまでencodeする。その後元のサイズまでup-conv（upsamplingした後にconv）する。U-netなので複数のskip connectionがある。

ただし、オリジナルなU-netと違い、上図下側のようにresidual blockを用いている。これにより精度をさらに上げている。

###Pose mask loss
G1のLossとして、単に出力と実際のTarget画像 $I_B$ をL1ノルムなどで計算してもうまくいかないだろう。なぜなら人でない部分・・・back groundが違いすぎるため、そこのlossを縮めようとするだろうから。

そこでback groundの影響を少なくするため、Pose mask lossというものを用いる。これは以下の図のようにTarget Poseをもとに作成した、人の体を覆うようなmaskである。
<img width="531" alt="スクリーンショット 2017-12-30 14.13.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/b1e4fd86-826e-f400-495b-344a4a329669.png">
（Figure3より）

このmask $M_B$ を用いて、lossは以下のように計算する。

```math
L_{G1}=||(G1(I_A,P_B)-I_B) \odot (1+M_B)||_1
```

hadamard積の左側はG1モデルからの出力 $G1(I_A,P_B)$ とTarget画像 $I_B$ とのpixel wiseな差。

hadamard積の右側がmaskの部分。mask $M_B$ は人の部分が１で他が０。これに１を加えるので、人の部分が2で他が1となり、人の部分の影響が他の部分の２倍となる。

#ステージ２（G2）
G1で生成された画像はおおまかに目的のポーズを捉えているものの、画質が粗いものとなる。よってG2でこれをrefineする。

G2は上述の通り、generator部分とdiscriminator部分とからなる。

###generator G2のアーキテクチャ
G2のgenerator部分も下図のようにU-netを模したものとなっている。

<img width="520" alt="スクリーンショット 2017-12-30 15.36.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/e3b368e5-f1f9-5910-13ca-57dccfdaf756.png">

G1で生成した画像 $\hat{I} _{B1}$ とcondition image $I_A$ から $\hat{I} _{B1}$ をrefineするための差分を出力する。これを $\hat{I} _{B1}$ に加えることでrefineされた画像を得る。

U-netの構造でG1と大きく違う点は、全結合を用いていない点だ。これはcondition image $I_A$ のdetailをより用いるためだ。

###Discriminator D
discriminatorはpix2pixモデルのように、本物のペア（condition imageとtarget image）か偽物のペア（condition imageとrefined result）かを識別する。具体的なアーキテクチャはDCGANとほぼ同じ。（下図参照）
<img width="397" alt="スクリーンショット 2017-12-30 14.13.40のコピー3.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/d6107265-8703-1465-c8f3-62276b0a0254.png">
（Figure2より）

###Lossの計算
lossは以下のようになる。まずdiscriminatorに関しては

```math
L^D_{adv}=L_{bce}(D(I_A, I_B),1)+L_{bce}(D(I_A,G2(I_A,\hat{I}_{B1})),0)
```

となる。第１項は本物ペアを入れた時のbinary cross entropyで、第２項は偽物ペアを入れた時のbinary cross entropy。このへんは通常のGANsと同じ。

一方で、generatorの方はadversarialなlossとさきほどの $L_{G1}$ との和となる。まずadversarialなlossは

```math
L^G_{adv}=L_{bce}(D(I_A,G2(I_A,\hat{I}_{B1})),1)
```

で、これを用いて

```math
L_{G2}=L^G_{adv}+\lambda L_{G1}
```

となる。

#個人的に面白いと思うところ
同じく学習用データの水増しモデルであるsimGANとかDA-GANなどと比較した場合、画像をsynthesizeするところも含めている点が興味深い。このsynthesizeを達成するために、着目物体以外の影響を小さくしたmaskの仕組みは他のtaskにも応用が利きそう。