[論文メモ] InsetGAN for Full-Body Image Generation

arxiv.org
afruehstueck.github.io

CVPR2022
Adobe Research

GANで全身生成を可能にした。
f:id:Ninhydrin:20220316090459p:plain


一つのGANで全身レベルの多様性のあるドメインを学習するのは難しい。全身生成と顔生成の学習済みGANを使ってそれぞれを生成しシームレスに結合する。

手法

Full-Body GAN

大雑把に全身を生成するのが目的。数万の全身サンプルを使ってStyleGAN2を学習。解像度は1024x1024。
全身は服装や各パーツ(手や足)の位置等がバラバラで精密に生成するのが難しくどうしてもアーティファクトが出てしまう(図1(a))。
それでも、肌の色の一貫性や、アクセサリもそれっぽく全身が生成出来るレベルは学習できた(図3)。よく見るとおかしいだろうがそれは後々改善する。
f:id:Ninhydrin:20220316090645p:plain

Multi-GAN Optimization

顔生成モデルが生成した結果をFull-Body GANによって生成された全身画像に貼り付ける形できれいな全身画像を生成していく。
f:id:Ninhydrin:20220316085708p:plain

このときの一番の問題は条件なしで生成した顔画像を貼り付けたときに一貫性があるようにしなければならないこと。

Full-Body GANを \mathcal{G}_Aとし、生成した全身画像を I_A := \mathcal{G}_A(\textbf{w}_A)とする。

顔画像を生成するGeneratorを \mathcal{G}_Bとし、生成した顔画像を I_B := \mathcal{G}_B(\textbf{w}_B)とする。
この顔画像を全身画像に貼り付けるためにBounding Box(BBox)を検出する必要がある。
全身画像から検出したBBoxでクロップしたピクセル \mathcal{B}(I_A)とする。
これを貼り付けるわけだが、これはクロップしたところに I_Bを貼り付けたときに連続的になるような (\textbf{w}_A, \textbf{w}_B)のペアを見つけることに相当する。

最終的な出力を得るために \mathcal{B}(I_A)の領域を I_Bで直接置き換え以下の最適化を行う。
f:id:Ninhydrin:20220316093626p:plain

 \Omega := \mathcal{B}(\mathcal{G}_A(\textbf{w}_A)) \mathcal{L}は境界の滑らかさと I_A I_Bが似ているかを測る指標。

Optimization Objectives

 \textbf{w}_A \textbf{w}_Bの片方、または両方を最適化する必要がありそのときに満たしてほしい点が3つ。

(1) 顔画像と全身画像の顔は粗く似ていてる必要がある(肌の色とか)
(2) コピーアンドペーストするので境界は継ぎ目ができないように
(3) 見た目がリアルであること

(1)についてはダウンサンプリングした結果に対して L_1 lossとperceptual loss( L_{lpips})をとる。これにより粗く似ているようにできる。
f:id:Ninhydrin:20220316094845p:plain
 I^{\downarrow}_A = \mathcal{D}_{64}(\mathcal{B(I_A)}) I^{\downarrow}_B = \mathcal{D}_{64}(I_B) \mathcal{D}_{64}は64x64へのダウンサンプリング。

(2)については(1)と同様の L_1 lossとperceptual loss  L_{lpips}を境界部分についてとる。
f:id:Ninhydrin:20220316095155p:plain
 \varepsilon_{x}(I)は領域 Iとの境界部分の周り xピクセルの領域。

(3)については下記式の正則化で担保する。
f:id:Ninhydrin:20220316095823p:plain
第一項目はlatent codeが学習に使ったlatent codeの平均からあまり離れないようにするもの。
第二項目も同じようなもので、StyleGAN2のを使った既存のImage manipulationでは一つの \textbf{w}を使うのではなく、各ブロックに注入する wを分けて \textbf{w}^{+}として n個の wを最適化するが、それに倣ってここでも n \times 512次元の \textbf{w}^+に分割する。
 \textbf{w}をベース、各ブロックへ注入するときのオフセット \delta_iとする。なのでブロック iに注入するときは \textbf{w} + \delta_iになる。

Face Refinement versus Face Swap

Full-Body GANの生成した画像の顔部分をより精細化するために生成した全身画像に対して、顔専用のGANで生成した顔画像を違和感なく貼り付ける。
このとき、元の全身画像の顔を保ちつつ、かつ境界部分が違和感ないようにしたい。
以下の式を最適化することでほぼ満足出来る結果が得られるがそれでも境界部分が不連続になることがある。
f:id:Ninhydrin:20220316100816p:plain

そこで対象領域以外の状態を保ったまま \textbf{w}_Aを最適化する。
f:id:Ninhydrin:20220316100937p:plain
 I_{ref}は元の生成画像、 R^Oは対象領域以外。つまり顔以外の部分は元の画像をなるべく保ちつつ多少の変更を許容する感じ。

最終的な目的関数は以下。
f:id:Ninhydrin:20220316101102p:plain

図1(b)と図5が結果。Full-Body GANの生成した顔より自然に見える。
f:id:Ninhydrin:20220322092508p:plain

Body Generation for an Existing Face

今までは全身生成してからの精細化だったが、顔画像からの全身生成もやりたい。
BBoxからはみ出るような複雑な髪型の場合など、境界部分の調整のためわずかな顔画像の変化も許容する。
なるべく顔を保存するために以下のface reconstruction lossを追加。
f:id:Ninhydrin:20220316101421p:plain
 R^I

目的関数は以下。
f:id:Ninhydrin:20220316101738p:plain
先程は全身を保存しつつ顔を最適化だったが、今度は逆に顔を保存しつつ全身を最適化という感じ。

結果が図6で、顔のアイデンティティは保ちつつ3つの体を生成した。
f:id:Ninhydrin:20220316101857p:plain

Face Body Montage

既存のGAN Inversion手法でリアル画像を潜在空間に埋め込むことができ、これを使うことで顔、全身それぞれを \mathcal{G}_A, \mathcal{G}_Bの潜在空間埋め込み操作出来る。
ただ、全身は多様なのできれいに再現するのは難しい。そこで先程の目的関数2つをあわせたような以下の目的関数を利用する。
f:id:Ninhydrin:20220316102352p:plain

図7が顔と全身を組み合わせた結果。肌の色を揃えるようなlossは無いが、顔と体で同じ色になるように変化している。
f:id:Ninhydrin:20220322094319p:plain

また、 \textbf{w}_A \textbf{w}_Bの両方を最適化したことで図1(d)のように髪の毛の境界部分が切れにつながるように肩の部分に髪が生成されている。
 \textbf{w}_Bのみの最適化した場合と \textbf{w}_A \textbf{w}_Bの両方を最適化した場合の比較を図2右に示す。

Optimization Details

僅かだが L_2より L_1のほうが良い結果だった。
ダウンサンプリングした \mathcal{D}_{64}(\mathcal{B(I_A)}) \mathcal{D}_{64}(I_B)に対してlossをとることで柔軟かつアーティファクトに適合するリスクを減らした。
また、 \textbf{w}_A \textbf{w}_Bの最適化は \textbf{w}_Aに依存した境界部分 \Omegaを利用している。
これに対処するために \textbf{w}_A \textbf{w}_Bを交互に最適化し \textbf{w}_Aの最適化毎に \Omegaを再計算する。

データセット・実装

1,024x1,024の全身画像を83,972枚で、これらは他から購入した100,718枚の画像から作成した。
しかも手作業で付けたセグメンテーションマスク付き。すごい...。
f:id:Ninhydrin:20220317102658p:plain
そして既存のポーズ検出で外れ値的なポーズの画像を取り除いた。
FFHQの学習等でもわかるようにアライメントは重要なのでポーズアライメントも調整。

Generatorの生成能力を背景に割きたくないのでreflection paddingして27x27のガウシアンフィルターで背景をぼかす。
セグメンテーションマスクがあるので背景を削除しても良かったのだがそうしなかったのは
1) セグメンテーションが完全ではない(特に背景との境界部分)
2) 現在のGANは一様な色の広い領域生成が得意ではなかった(実験的に)

なおDeepFashionデータセットでも実験した。こちらはクリーニング後10,145枚で1024x768、背景は始めから一様に塗りつぶされている。

学習はStyleGAN2-ADAアーキテクチャでaugmentationはすべて採用。
自作データセットは4 Titan V GPUで28日と18時間。バッチサイズは4。
DeepFashionは4 V100 GPUで9日でバッチサイズは8。

実験結果は今までの図を参照。

CoModGANとの比較。
f:id:Ninhydrin:20220317103019p:plain
f:id:Ninhydrin:20220317103054p:plain

制限等

1) 2つの潜在変数の最適化は基本的に画像に僅かな変更しか行わないが、たまに大きな変更が起こる。
2) Full-Body GANの問題は残っている(靴の対称性や衣服の質感など)
3) ポーズや体型はデータセットバイアスを受ける

DeepFashionとかはスリム体型ばかりで年齢もほぼ一定。男女比も1:9と偏りが大きい。
DeepFake等の悪用についても言及。
ユーザースタディの結果、本物画像と比べるとすぐに生成分かるクオリティ。
ただ、今後も改良していきたいので、他の研究者のDeepFake検出の研究発展を期待しているとのこと。

所感

いよいよ全身生成も出てきた。自作データセットが強すぎる。
自分でも色々試す予定ではいるがGPUの制限も大きく普通にやるには少々厳しい。
背景ブラーをする前処理はなるほどと思った。確かにGANに背景まで精細に生成してもらう必要はない。白い塗りつぶしが難しいとのことだけどそうなのか。セグメンテーションマスクを持っているから出来る感はあるが。
 \textbf{w}_A \textbf{w}_Bの両方を最適化するとはいえ、肌の色とか画像全体としてのコンテキストが揃うのはすごい。