meowの覚え書き

write to think, create to understand

GANベースの画像変換手法『ACL-GAN』を顔写真→アニメ顔変換タスクを中心に理解する

f:id:meow_memow:20201006215223p:plain

またSelfie2Animeデータセットを扱ったunpairedな画像変換手法が出てきたので「顔写真 → アニメ顔変換」タスクを中心に手法を理解する。おまけで、コードの簡単な実行方法も説明する。
念の為断っておくが、名にACLと冠しているが自然言語処理のトップカンファレンスとは一切関係ない

論文の基本情報

ECCV2020 に採択された論文である。今年の採択率は26%。

論文の概要

ソースドメイン(ここでは人の顔写真)の画像からターゲットドメイン(ここではアニメキャラクターの顔)の画像へ変換することに取り組んでいる。GANベースで、unpairedでも(画像の間で対応が取れていなくても)変換できるようにGeneratorを学習させる手法を提案している。

論文が解決したのは下記のCycle GANの欠点である。

  1. 再構成という制約のために、画像変換時に変換元の画像の情報(ピクセル)を変換先の画像へ埋め込んでしまっている
    • 男性→女性変化の時にひげが残っていたりする
  2. 形状変換能力が弱い
    • 顔写真→アニメ変換だと輪郭を変える必要がある
  3. Cycle Consistency Lossでは決定的な変換しか学習されない
    • ある画像をGeneratorに変換するとき同じ画像からは同じ変換しかされない。これは多様性がない。

そこで、入力画像をピクセルではなく特徴として保持しつつも、多様性が生まれるようなlossであるAdversarial-Consistency Lossを提案している。

lossの全体

トータルの損失関数は下記。

f:id:meow_memow:20201006215558j:plain

\lambdaはlossの重み付けを行うためのハイパーパラメータである。 第1項目がAdversal-Translation Loss、第2項目がAdversarial-Consistency Loss、第3項目がIdentity Loss、第4項目がBounded focus maskのためのlossである。 説明順はメインの第2項目のAdversarial-Consistency Loss、第1項目のAdversal-Translation Loss、第3項目のIdentity Lossである。なお、第4項目は入力画像を変換する部分を制限するためのlossであるが、selfie2animeタスクにおいては\lambda_{mask}は0に設定されているので、説明を割愛する。

Adversarial-Consistency Loss

論文のキーポイントとなるAdversarial-Consistency Loss(ACL)に関して説明をする。
このlossがある意図は2つ。

  1. 1つの画像に対して、多様な変換ができるようにする
  2. ソース → ターゲット変換のGeneratorに対して、ソースドメインの特徴を保持できるようにする

概念図は下図。元のドメインと別ドメインへ行って返ってきた画像を比較するあたりぱっと見Cycle GANと同じ見た目をしている。

f:id:meow_memow:20201006215713j:plain:w400

ACLの具体的な式は下記の通り。

f:id:meow_memow:20201006215814p:plain:w400

式の構成要素の説明

\hat{D}(\cdot, \cdot)ACLのために用意されたDiscriminatorである。画像に対して2値分類する分類器である。引数が2つある件は後述する。
x_Sは入力画像となるソースドメイン側の画像である。これがオリジナルの画像となる。
\bar{x}_T=G_T(x_S,z_1)は、ソースドメインの画像をターゲットドメインへ変換したフェイク画像である。
\hat{x} _ {S} = G_S(\bar{x} _ {T}, z_2)は、ターゲット側のフェイク画像を入力として、ソース側に変換したフェイク画像である。
\tilde{x} _ S=G _ S(x _ {S}, z _ {3})は少しややこしいが、オリジナルのソースドメインの画像に対してターゲットドメインからソースドメインへの画像変換をかけた結果である。Cycle GANでは、これはGeneratorが恒等写像となるように学習されるが、ACL-GANでは下図のように、若干の変化が加わる。このような\tilde{x} _ Sを設ける理由は、データオーグメンテーションの役割ではないかと考える。オリジナルの画像x_Sばかり使うのではなく、そこからノイズでちょっと変換をかけた画像を使う方が多様な変換を獲得できる可能性が高いと著者は考えたのではないだろうか。

f:id:meow_memow:20201006220151p:plain:h400

G_T(x, z)は入力画像をターゲット画像へ変換するGenerator、G_S(x, z)は画像をソース画像へ変換するGeneratorである。画像のGeneratorはMUNITを踏襲している。すなわち、画像をcontentとstyleに分けるエンコーダーをソースとターゲットの2つのドメイン分用意して、変換時に、ターゲット側のスタイルを混ぜてデコーダーに通して画像を生成している。
zN(0, 1)に従うノイズであり、生成器にノイズを混ぜることで画像のスタイルを多様に変換するための乱数である。これにより、同じ画像を入力してもノイズが異なれば生成される画像も異なるようにできる。

ACLの役割

\mathcal{L} _ {ACL}の大雑把な意味としては、ソースドメインの画像(にSrc→Tgt変換をかけた画像)\tilde{x} _ {S}と、ソース→ターゲット→ソースと変換2回行ってソースドメインに戻ってきた画像\hat{x} _ Sの差異をDiscriminator \hat{D}(\cdot, \cdot)で測っているような形である。\hat{D}(\cdot, \cdot)としては、\tilde{x} _ S\hat{x} _ Sとを見分けようとするし、Generatorは\hat{D}(\cdot, \cdot)を騙したいので、これら2つの画像の差異がなくなるように学習していく。
Cycle GANではここを再構成誤差としていたため、1つの画像に対する変換が決定的になってしまう。一方こちらの手法では、識別器\hat{D}で差を測ることで、ソースドメインの画像\tilde{x} _ Sと変換して戻ってきた画像\hat{x} _ Sが異なる画像であっても、同じドメインになっていればOKなのでGeneratorが多様な変換を獲得できるようになる。

\hat{D}(\cdot, \cdot)はどのように実装されているか

\hat{D}(\cdot, \cdot)がxを2つ引数に取る件であるが、これはオリジナルの画像x_Sを連結している。 実際のコードでは、画像をチャネルを軸にして連結している。
例えば画像の入力が[B, C, H, W]として、 一方がtorch.Size([2, 3, 256, 256])で、もう一方もtorch.Size([2, 3, 256, 256])の時、結合時の次元はtorch.Size([2, 6, 256, 256])となる。
画像を連結する意図は、Generatorがソースドメインの元画像の特徴を保持しながら変換する能力を獲得するためのお手本として使用したとのことである(p.6,l.6〜)。
ただ、個人的にはここの設計が不可解である。というのも、G_S(\cdot)x_Sを混ぜるのではなく、Discriminatorで混ぜているからである。確かにDiscriminatorの分類結果をGeneratorが学習するが、やや間接的ではないかと思ってしまう。

Adversarial-Translation Loss

\mathcal{L} _ {adv}=\mathcal{L} _ {adv} ^ {T}+\mathcal{L} _ {adv} ^ {S}

Adversarial-Translation Loss \mathcal{L} _ {adv}はいわゆるGANのloss部分である。すなわちGeneratorとDiscriminatorがいたちごっこしている部分である。
ターゲットドメイン側のloss \mathcal{L} _ {adv} ^ {T}は、下記の通りで、分類器D_Tがrealなアニメ画像x_Tと生成器G_Tが生成したfake画像\bar{x} _ Tを見分ける。

f:id:meow_memow:20201006221048p:plain

ソースドメイン側のloss \mathcal{L} _ {adv} ^ {S}はちょっとだけ違う。fake画像が\tilde{x} _ S\hat{x} _ Sの2つがあるのでlossを折半しているような形。

f:id:meow_memow:20201006221102p:plain

Identity loss

f:id:meow_memow:20201006221137p:plain

ここで x _ {S} ^ {idt}=G _ {S}(x _ {S}, E _ {S} ^ {z} (x _ S)), x _ {T} ^ {idt}=G _ {T}(x _ {T}, E _ {T} ^ {z} (x _ T))

ACLでは、ノイズを加えることで多様な画像を生成できるようにすると言ったが、自分の画像由来で生成したノイズに対しては恒等写像になってほしいようにloss \mathcal{L} _ {idt}で制御する。

これにより、期待できることとして下記の4点を上げている。

  1. 特徴を保持
  2. 変換画像の質を向上させ、
  3. 学習プロセスを安定させることを期待する。
  4. mode collapse(?)を避ける(p.6, 3.3)
    • 学習データセットすべてを変換できるようにしようとしてバランスが取れなくて破滅することだろうか?

Generatorのノイズ引数に入れられているE^{z}(\cdot)は画像をノイズに変換するネットワークとのことらしい。実際のコードを見てみると、下記の手順でMUNITのStyelをAdainのパラメータにしていることを表していた。

  1. GeneratorであるMUNITのEncoder側でStyleとContentを生成
  2. Style情報を多層レイヤパーセプトロンに通してAdaINのパラメータを生成
  3. Decoder側でAdaINの正規化をかけながら解像度を増やして画像にする
  4. Generatorの画像とオリジナルの画像を、ピクセル差でL1ノルムをとって誤差としている。

実験

U-GAT-IT論文を出した研究グループ(NCSOFT社?)が独自に集めた、Selfie2anime dataset(どこからか収集してきた人の自撮り画像とアニメ画像)で評価する。
比べる手法は、Unpairedな画像変換では有名な所5つ。CouncilGANが最も最近の手法である。Council GANについて興味があれば解説記事を書いたので読んでいただけると幸いである。

定性的な評価は下図。CycleGANと比べると輪郭のデフォルメや顔の追従ができていると主張している。個人的には、他の手法の生成画像とそんなに大差ないという印象。

f:id:meow_memow:20201006222052j:plain:w500

定量評価結果としてはFID, KIDでどの既存手法にも勝っている。

f:id:meow_memow:20201006222107j:plain:h300

さらに、U-GAT-ITはパラメータが670.8Mある一方ACL-GANは54.9Mであると主張している。パラメータ数が少ないけど定量評価で勝っていることを強調している。

コードの実行方法

pretrained weightは提供されていない模様。

追記: 私がモデル学習させた時のpretrained weightを下記に置きました。ただし論文とは異なるパラメータで学習させたため、論文の再現には至りませんでした。 github.com

所感

unpairedな画像変換手法の研究としては着実な進歩を進んでいるが、顔写真→アニメ変換に絞って見ると、限界を迎えていそう。そもそものselfie2animeデータセット自体、データがそんなにが良くない可能性がある(鏡越しの自撮りで顔の前にスマホがあったりする)ので進歩がわかりにくい。だから、selfie2animeタスクに絞って手法を研究開発してほしいところである。
また、目や顔や顔が大幅にデフォルメされなければならない以上、もとの特徴を保持することが好ましくないかもしれない。そう思うと、アニメ調に変換といった時、どんなふうなアニメのスタイルに変換することを期待しているのかを決めて手法を設計した方がいいと思った。


  1. ただし有志の方のissueによると学習の再現に失敗している模様。著者が原因を調べるといってcloseされている。 https://github.com/hyperplane-lab/ACL-GAN/issues/3