[論文メモ] ECAPA-TDNN for Multi-speaker Text-to-speech Synthesis

arxiv.org

より強い話者エンコーダを用いることで、複数話者のText-to-speech(TTS)の精度を向上させた。

f:id:Ninhydrin:20220323091043p:plain

既存のTTSでは話者エンコーダとしてd-vectorやx-vectorといった話者分類タスクを事前に学習したモデルの中間特徴を用いるが、これらだと自然性や話者性があまりよくない(特にデータセットに無い話者)。
その理由は既存の話者エンコーダのキャパシティが低いこと。だからもっと強くすればいいよねというお気持ち。

手法

話者エンコーダとしてECAPA-TDNNを用いる。これはTDNNでVoxcelebデータセットのSOTA的モデル。
ECAPA-TDNNの特徴は

  • Squeeze-and-Excitation (SE) blockの利用
  • Res2Netのskip connection
  • 複数階層の特徴を集約

Res2Netはこちら
arxiv.org

acoustic modelはFastSpeech2を利用。
vocoder modelはHifiGANを利用

学習についてはまずECAPA-TDNNの発話レベルの話者分類の学習を行う。
TTSの学習時はこの発話レベルの話者特徴をacoustic modelの形に合うように線形変換し、足し合わせる。

実験・結果

データセットはVCTKとLibriTTS。
サンプリングレートは22050Hzにし、80次元のメルスペクトログラムを利用した。
比較対象はx-vector
x-vectorとECAPA-TDNNはVoxceleb1とVoxceleb2で事前学習。

結果は以下。
f:id:Ninhydrin:20220323092618p:plain



各話者エンコーダで抽出した10人の200の発話特徴量をt-SNEで可視化。
両エンコーダともに分離はできている。ただECAPA-TDNNのが連続的な分布で、これは同じ話者でも各発話の僅かな違いが反映されているとのこと。
既存研究で話者埋め込みは連続的な分布の方がより良いパフォーマンスが出るという報告もある。
なにより、話者分類とTTSは目的が違うのを忘れてはいけない。
f:id:Ninhydrin:20220323093017p:plain

所感

よくあるTTSの論文で話者エンコーダのアーキテクチャを変更したもの。
確かに、話者エンコーダの目的が話者分類ではなく音声にしたときに話者性を高めるものであることを忘れてはいけない。

[論文メモ] 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の両方を最適化するとはいえ、肌の色とか画像全体としてのコンテキストが揃うのはすごい。

[論文メモ] UVCGAN: UNET VISION TRANSFORMER CYCLE-CONSISTENT GAN FOR UNPAIRED IMAGE-TO-IMAGE TRANSLATION

arxiv.org

Vision Transformer(ViT)を使ったunpaired image-to-image translation。

unpaired image-to-image translationでは既存手法としてCycleGAN、ACL-GAN、Council-GANなどがある(U-GAT-ITも)。
CycleGANはone-to-oneだが、ACL-GANとConucil-GANはone-to-manyで多様性に重きをおいている。

現代のニューラルネットアーキテクチャにCycle consistency lossを使ってone-to-one translationを改善できるのでは?というお気持ち

手法

提案するUNet ViT Cycle-consistent GAN(UVCGAN)のアーキテクチャ、学習フローは以下の図1。
f:id:Ninhydrin:20220315091840p:plain


2つの画像ドメイン A, Bを相互に変換するGeneratorをそれぞれ \mathcal{G}_{A \rightarrow B},  \mathcal{G}_{B \rightarrow A}とする。
そして、どちらのドメイン由来かを識別するDiscriminatorを \mathcal{D}_A, \mathcal{D}_Bとする。

アーキテクチャはUNetをベースとし、ボトルネック部分にピクセルレベルのViTを導入。pre-process部分はconv + leakyReLU、post-process部分は1x1 conv + sigmoid。

ViT部分ではピクセルレベルのパッチ化をしてpositional encodingをconcatしてる。足さなかった理由があるのだろうか。

事前学習とloss

Bidirectional Encoder Representations from Transformers (BERT)-like self-supervised pre-trainingを行った。
BERT likeな事前学習はランダムに初期化された大規模ネットワークの事前学習に効果的で、マスクされた画像から元画像を予測するタスクを行う(ピクセルレベルの l_1 loss)。

事前学習に本タスクの学習を行うが最終的なlossは以下。
f:id:Ninhydrin:20220315094533p:plain

 \mathcal{L}_{GAN}はadversarial loss、 \mathcal{L}_{idt}はidentity loss、 \mathcal{L}_{cyc}はcycle-consistency loss。Discriminator用lossの右辺第二項目はGradient penalty(GP)。 \lambda_{XX}はそれぞれハイパラ。

実験・結果

データセットはselfie⇔anime、male⇔femail、メガネの有無。
BERT likeな事前学習では256x256の画像を32x32ピクセルのパッチにして40%をマスクする。
f:id:Ninhydrin:20220315095326p:plain
f:id:Ninhydrin:20220315095420p:plain

Ablation studies。
BERT likeな事前学習で用いるデータセットについて

  • データ数は少ないが本タスクに近いデータセット
  • データ数は多いが本タスクより多様なデータセット

のどちらがいいかを調べるとともに、identity lossとGPの有無についても調べた。データセットはmale-to-femaleとselfie-to-animeの2つ。
Noneは事前学習なし。
f:id:Ninhydrin:20220315095450p:plain

  • identity lossとGPは組み合わせると改善
  • GPなしidentity lossありはなんとも
  • 事前学習はGPとidentity lossと組み合わせると向上につながる

事前学習+identity lossはそうでも無いが、+GPは大きな改善もたらす。
これはGeneratorは事前学習したパラメータに対してDiscriminatorは初期値のままなので、意味不明な情報をGeneratorに流して事前学習済みパラメータを破壊するからではと予測。
もしそうならDiscriminatorも事前学習すればもっと改善するかも...とのこと。

所感

久々のunpaired I2I translation。U-GAT-IT以降あまり追ってなかった。
この間のdenoisingでもそうだったがUNetのボトルネックにAttentionモジュールを組み込むアーキテクチャが流行っている?パフォーマンスが良い?
ninhydrin.hatenablog.com

機会があればUNet+ViTをいろんなタスクに試して見たいところ。

[論文メモ] Screentone-Preserved Manga Retargeting

arxiv.org

スクリーントーンの見た目を保存したまま画像をリサイズする。

f:id:Ninhydrin:20220309091625p:plain

bilinearやbicubicでリサンプリングするとスクリーントーン部分にブラーやアーティファクトが起きる(特に縮小)。
スクリーントーンは漫画の見た目に大きく影響する。
全体の構造を保ったままリサイズしつつ、スクリーントーンの解像度や細かさは元のまま保存したい。

手法

サイズ H \times Wのターゲット画像 \textbf Iスクリーントーンの解像度を保ったまま、サイズ kH \times kW, k \in \mathbb{R}_{+}の画像 \hat{\textbf{I}}にしたい。
既存手法のScreentoneVAEを使ってスクリーントーン部分を検出する。
ScreentoneVAEは漫画画像と潜在空間との双方向マップで、潜在空間からスクリーントーンの復元ができる。ただし、元のスクリーントーンから少し変化してしまうことがあるらしい(特に大きいパターンのスクリーントーン)。
なのであくまでScreentoneVAEスクリーントーン部分の検出のみに使い、元画像のスクリーントーンを流用する手法をとる。
提案手法の全体の流れは図6の通り。

f:id:Ninhydrin:20220309095032p:plain
元画像から既存手法を使って線画構造のマップ \textbf{L}スクリーントーン画像 \textbf{I}^sを抽出しスクリーントーン画像はさらにScreentoneVAEマップ \textbf{S}に変換される。
 \textbf{L} \textbf{S}をそれぞれターゲットの画像サイズにリサイズし \tilde{\textbf{L}} \tilde{\textbf{S}}を得る。
これらをEncoder-Decoder型のscreentone reconstruction network  Gに入力して目的の画像を得るがボトルネックの部分に領域毎のスクリーントーン特徴 \textbf{F}_sを注入する。
 \textbf{F}_sは特徴抽出のためのネットワーク E_p \textbf{I} \textbf{S}を入力して得られる( \textbf{F}_s = E_p(\textbf{I}, \textbf{S}))。
 \textbf{F}_sボトルネック部分は解像度が異なるので後述する階層化したアンカーを用いて解像度をあわせる。

Hierarchical anchor-based proposal sampling

screentone reconstruction network  Gのエンコーダ部分を Eとしてボトルネック部分の特徴を  F_b = E(\tilde{\textbf{L}}, \tilde{\textbf{S}})とする。
 F_bの解像度とスクリーントーン特徴 \textbf{F}_sの解像度は異なるので合わせる必要があるが、単純にリサンプリングとかするとスクリーントーンのパターン情報等が壊れる。
そこで I \times Jのグリッドのアンカー  \mathcal{A}=\{\textbf{a}_{i,j}\}^{I,J}を用意する。
そして各アンカーを中心としてクロップする。クロップ関数を Pとして \textbf{F}^{i,j}_s = P(\textbf{F_s}, \textbf{a}_i,j)
図8に2x2グリッドの例を示す。
f:id:Ninhydrin:20220310091651p:plain

グリッドが1x1の場合アンカーは1つでクロップサイズはターゲットの解像度と同じ。グリッドが2x2の場合、アンカー1つあたりのクロップサイズは1x1のときの半分といった感じ。
必ずしも縮小ではなく拡大のときもあり、そのときは逆にアンカー毎にパディングをして拡張する。
リサンプリングと違って不整合が起きており、1x1のアンカーによるクロップでは端の方は明らかにもとの特徴と一致しない。だからといってたくさんのアンカーを使ってクロップしたものでは局所的な断裂が大量に発生している。
複数のグリッドサイズでクロップした特徴マップを利用することでそのあたりの不整合を解消するガイドを作る。
このクロップした特徴マップを候補特徴と呼ぶことにする。

Recurrent selection of hierarchical proposals

同じ解像度のボトルネック部分の特徴 \textbf{F}_bスクリーントーン特徴 \textbf{F}_sをクロップした L個の候補特徴集合 \{\hat{\textbf{F}}^l_s\}^L_{l=0}が手に入ったのでこれらをconcatしてデコードして終わり、というわけにはいかない。
デコーダネットワークはconcatした候補特徴集合の内どれを採用すればいいかわからず元のスクリーントーンと異なるものになる(図9(b)参照)。
f:id:Ninhydrin:20220310093232p:plain

そこで各特徴マップを再帰的に選択するRecurrent Proposal Selection Module (RPSM)を採用する。
RPSMモジュールのアルゴリズムは以下。
f:id:Ninhydrin:20220310093531p:plain

画像の各領域は候補特徴の集合からなるべく1つを採用するように強制する。
 \textbf{C}が確信度マップの累積。
アルゴリズムを上から見ていくと
forで候補特徴を一つずつに注目していく。
現在のベースとなる特徴マップ(最初はエンコーダ後のボトルネック特徴 F_b)と注目している候補特徴からマスク  \textbf{M}^lを作る。
 \textbf{1}から累積確信度マップを引いたもの、つまりまだ候補を採用していない領域に絞り込む( \textbf{M}^l_{norm} \leftarrow \textbf{M}^l * (\textbf{1} - \textbf{C}^{l-1}))。
絞り込んだマスクを使って候補マップをブレンドしベースの特徴マップを更新する( \textbf{F} \leftarrow \textbf{F} * (\textbf{1} - \textbf{M}^l_{norm}) + \hat{\textbf{F}}^l_s * \textbf{M}^l_{norm})。
確信度マップを更新(累積)( \textbf{C}^l \leftarrow \textbf{C}^{l-1} + \textbf{M}^l * (\textbf{1} - C^{l-1}))
ResBlockでfoward( \textbf{F} \leftarrow R(\textbf{F}))

という感じ。

Loss function

lossは

  • translationinvariant screentone loss  \mathcal{L}_{sis}
  • ScreenVAE map loss  \mathcal{L}_{scr}
  • attention loss  \mathcal{L}_{atn}
  • adversarial loss  \mathcal{L}_{adv}

Translation-invariant screentone loss

スクリーントーンのズレは人間にとって影響せず、正解は一つではない。図7の(a)が正解だとしても(a)(b)(c)のどれでもさほど問題ではない。
f:id:Ninhydrin:20220310100156p:plain

生成した画像を \tilde{\textbf{I}}としてTranslation-invariant screentone lossは以下の式(1)。
f:id:Ninhydrin:20220310100424p:plain

 pは領域、 t(p)は領域 pの正解のスクリーントーンの種類、 \tilde{\textbf{I}}^s_{t(p)}は正解のスクリーントーン画像、 \textbf{M}_pは(たぶん)領域 pのマスク、 \deltaはオフセット、 wは11 x 11のウィンドウでオフセットの探索範囲、Shift(\cdot, \delta) \deltaだけシフトする演算子
図7で示した通りスクリーントーンのパターンのズレはさほど問題ないので、正解のスクリーントーンのパターンで最も誤差の少ない移動を見つけて誤差を取る。
ただ、 wで繰り返しが見つけられないようなスクリーントーンに対応できない。
そこで生成画像と正解のスクリーントーン画像を半分のサイズにして \deltaを探索し、それによって移動したものを新たな正解のスクリーントーン画像にする。

ScreenVAE map loss

Translation-invariant screentone lossは視覚的に似ていても空間的に一貫性のないパターンを持つスクリーントーンを生成することがある。
そこでもとの画像と同じスクリーントーンで埋めるようにScreenVAE map lossを追加。
f:id:Ninhydrin:20220310101018p:plain
 \tilde{\textbf{S}}は正解のScreenVAE map。

Attention loss

複数の候補特徴があるが同じ領域でも各候補特徴同士に一貫性はないため、1つの領域は複数の候補特徴の中から1つを選ぶようにさせる。
f:id:Ninhydrin:20220311092245p:plain
[tesx: |\cdot|]は絶対値で、0.5引いた絶対値から更に0.5引いたものをlossとしてるので、lossが最小になるのはマスクの各値が1か0のときになる。
ただ、正解がわかっている場合はそのラベルを直接正解に用いる。
f:id:Ninhydrin:20220311092507p:plain

f:id:Ninhydrin:20220311094551p:plain

Adversarial loss

実際の漫画の分布に近づけるため。
適当に漫画っぽい画像を生成しても困るので、線画構造のマップとScreentoneVAEマップをConditionとする。
f:id:Ninhydrin:20220311092619p:plain


最終的なlossは以下。
f:id:Ninhydrin:20220311092756p:plain
各係数は\beta_{sis}=10, \beta_{scr}=100, \beta_{atn}=5, \beta_{adv}=1。かなり職人的だ。

実験・結果

まずはデータセット。手作業で100枚の線画と125枚のスクリーントーンを用意し既存手法でスクリーントーンを貼って6000枚の漫画画像を用意した。
これらは \mathcal{L}_{sis} \mathcal{L}_{atn}用で、これとは別に20,000枚の漫画画像も用意した。

既存手法との比較
f:id:Ninhydrin:20220311093317p:plain
f:id:Ninhydrin:20220311093428p:plain

各lossの影響
f:id:Ninhydrin:20220311093344p:plain
f:id:Ninhydrin:20220311093415p:plain

小さい領域や、不規則なパターンに弱い
f:id:Ninhydrin:20220311093507p:plain

所感

確かに、スクリーントーンをリサイズすると雰囲気が変わり、作者の意図したものが変わってしまう。元のスクリーントーンの解像度を維持するのは大事。面白いタスク。
複数の候補があったときに、単純にconcatするのではなく、選択的に1つを採用するという仕組みは面白い。
ただReccurrentにやる必要があるのか少々疑問。バイナリなAttention Mapさえ生成できれば再帰的にやる必要はなさそうな気もする。
スクリーントーンの種類がある程度有限なら、わざわざ本家から持ってこなくてもスクリーントーンのサンプルから引っ張ってきても良さそうだが、多分そうでは無いのだろう。似たようなスクリーントーンでは作者の意図は反映できないだろうし。それに不規則なスクリーントーンはどこを切り出すかの問題がありそう。
スクリーントーン同士の視覚的効果が似ている判定とかはできないのかな?

[論文メモ] LEARNING TO MERGE TOKENS IN VISION TRANSFORMERS

arxiv.org

Google Research

Vision Transformer(ViT)の内部でパッチを結合するPatch Margerを提案。

Transformerはアーキテクチャの大きさに(ある程度)比例してパフォーマンスが向上するがその分計算コストがかかる。
パッチを減らせれば計算コストを抑えられる。

手法

f:id:Ninhydrin:20220308091144p:plain

PatchMagerでは M個のパッチを出力する。
あるパッチ pが入力されると、PatchMargerはそのパッチに対する M個のスコアを出力する( s_{1:M}(p))。これは線形変換で行われる。
スコアの合計が1になるようにSoftmax( \sigma)で正規化する( \sigma(s_1{:M})(p))。
このスコアは出力の M個のパッチへのパッチ pの寄与度。
各パッチについて寄与度を計算し、寄与度で重み付けすることで新しいパッチとする。

考察

PatchMagerはパッチに対する線形変換でスコアを算出するため似たパッチは同じ寄与度になり、同じ背景から生まれた冗長なパッチはマージされパッチが減る(後の計算コストが減る)。

新しいパッチは古いパッチの線形結合で、もとの位置情報とは無関係。

入力パッチは可変長だが、学習時とあまりにもかけ離れたパッチ数だとスケールが壊れる恐れがある。そのために、PatchMargerの前にLayer Normを挟むことでその影響を軽減している。

PatchMagerはクエリ部分を学習可能パラメータにしスケーリングをなくしたAttentionと似ている。
f:id:Ninhydrin:20220308095048p:plain
f:id:Ninhydrin:20220308095105p:plain

なのでTransformer Blockの一部を置き換えようと思ったが不安定だったのでPatchMargerモジュールにした。

実験・結果

基本のアーキテクチャは偶数のTransformer Blockを持っているので、基本的にPatchMargerはその中間に設置し、出力するパッチは8。
Small、Base、Large、Hugeの4つの異なる設定で実験。
各設定のepoch数、パッチサイズ、トークン数は

Small : 5epoch、(32, 32)、49トーク
Base: 7epoch、(32, 32)、49トーク
Large: 14epoch、(16, 16)、196トーク
Huge: 14epoch、(14, 14)、256トーク

なお、CLSトークンは別。

f:id:Ninhydrin:20220308095452p:plain
f:id:Ninhydrin:20220308095516p:plain
f:id:Ninhydrin:20220308095530p:plain

12BlocksのモデルでPatchMargerの設置する位置の変化。基本後ろの方が良いが計算コストの問題がある。
10~11の間で落ちるのが面白い
f:id:Ninhydrin:20220308100917p:plain
f:id:Ninhydrin:20220308095634p:plain

所感

この間読んだのによく似ている。
ninhydrin.hatenablog.com

流行りなのか似たようなのが出たので急いで出したのかは不明。
あちらはAttentionを使い出力がある程度可変なのに対して、こちらは単純な重み付けで出力は固定長。どちらも一長一短な気がして、どちらが良いのかはわからない。
どのパッチがどれくらいの寄与度なのかの可視化とか見てみたい。あちらは出していた。
またこちらは寄与度からパッチ同士の類似度も計算できるはずなのでそれも見てみたかった。

[論文メモ] BatchFormer: Learning to Explore Sample Relationships for Robust Representation Learning

arxiv.org

CVPR2022

サンプル間の関係をネットワーク内部で学習するフレームワークを提案。

サンプル間の関係を調査するフレームワークは色々あるが、基本的に入力や出力時点で行う。
ミニバッチの中でのインタラクションはテスト時等を考えると適用は難しい(Batch Normもドメインシフトの問題とか)。
学習時はサンプル間のインタラクションを使い、テスト時にはインタラクション不要なモジュールが好ましい。

手法

ネットワーク内部で自発的にミニバッチ内のサンプル間関係を学習させる。

backboneネットワークは個々のサンプルの特徴を学習する。このときはサンプル間のインタラクションはない。
この特徴に対してサンプル間の関係を学習するために、バッチ方向についてAttentionを行うBatch Transformer(BatchFormer)モジュールを導入する

BatchFormerは式(1), (2)で表されるPost Norm LNのTransformer Blockからなる。

バッチ方向でAttentionするためCross-Attentionと見れなくもない。
BatchFormerの出力をClassifierに入力しクラス予測を行う。

しかし、BatchFormerはバッチ内の統計情報を使うのでテスト時には適さない。そこでテスト時はBatchFormerモジュールを取り除く。
しかし、BatchFormerモジュールを取り除くと予測ができなくなるので、Classifierをbackboneの出力を入力としても学習する。
図2にはClassifierが2つあるが、2つはパラメータ等を共有した同じネットワークで、テスト時は入力画像 -> backbone -> Classifierという流れで予測を行う。

このようにBatchFormerモジュールは取り外し可能なモジュールで、学習もEnd2Endで行える。


図3はBatchFormerの有無での勾配の伝播を図示したもの。

普通の学習だと N個のサンプル X_nが与えられたとき、それぞれのloss  L_nについての勾配(図の実線)が流れるが、BatchFormerでは \frac{\partial L_i}{\partial X_j}, i \neq jも流れる。

実験・結果

Long-Tailed RecognitionやZero-shotについて実験。
詳細等は省略。






所感

バッチ方向でのAttentionとテスト時の実行方法の提案。
BatchFormer自体は特徴量を入力として特徴量を出力する追加モジュールなので、既存のResNetでもViTでも追加できるのはよい。とりあえず試してみるか的な使い方ができそう。コードとしての分離もやりやすそう。
ただ、ミニバッチサイズの大きさがある程度確保できないと効果は薄そう。
また、ミニバッチ内のサンプル間でのAttentionがどういった影響があるのか少々懐疑的。
StyleGAN2のDiscriminatorで採用していたminibatch standard deviation layerと同じように、Discriminatorに使うとmode collapseを抑えられるかも?(そもそも学習ができなくなりそうだが)

[論文メモ] OUR-GAN: One-shot Ultra-high-Resolution Generative Adversarial Networks

arxiv.org

一枚の画像から単純な繰り返しではないUltra-high-resolution(UHR)な画像を生成するフレームワーク
ここでのUHRな画像はここでの8K(8192 x 5456)や16K(16384 x 10912)。
f:id:Ninhydrin:20220303091112p:plain

SinGANとかone-shotでの画像生成はあるが解像度は1K(1024 x 1024)ぐらいが現状。
繰り返し構造を見つけて拡大する方法もあるが、それだと大きな形を生成できないし学習データも大量に必要。UHRな画像を集めるのも大変。
また、UHRな画像を生成するにはかなりのGPUメモリが必要という問題もある。

手法

アーキテクチャは下記の3つのコンポーネントからなる。

  • 大まかな構成を生成するGlobal Structure Generation
  • 画像全体の解像度を上げるIn-memory super-resolution
  • GPUメモリの限界を迎えたとき画像をパッチにして解像度を上げるSeamless subregion-wise super-resolution

f:id:Ninhydrin:20220303091940p:plain

Global structure generation

大まかな構成となる画像をノイズから生成する。
アーキテクチャはHP-VAE-GANを採用。
HP-VAE-GANは多様な画像を生成できるが画像全体の一貫性が少々弱い(だから大まかな画像生成に使う)。

生成過程は下記式。
f:id:Ninhydrin:20220303092735p:plain

 G^1_mはGenerator、 \tilde{x}^1_mは生成した画像、 z^1_mはノイズ、 \uparrowはアップサンプリング。
始めノイズから生成し、 1 \leq m \leq Lのときはpatch VAEで、 L \lt m \leq Mのときはpatch GANでで生成する。

風景画像には垂直方向に強いバイアスがある。空は上に海は下とか。水平方向はほとんどない。
だからといって座標も入力すると、1枚の画像からの学習では生成結果が座標と強く結びついて多様性が失われる。
そこで垂直方向のみの位置埋め込みを入力する(図4)。

f:id:Ninhydrin:20220303093539p:plain

In-memory super-resolution

画像をそのまま受け取り解像度を上げるコンポーネント
学習済みのESRGANを調整して利用する。zero-shotの超解像系の既存手法も存在するが学習済みESRGANを使ったほうが結果が良かった。
DIV2KとFlickr2Kで事前学習する。

前のステップ(Global structure generation)で生成した画像  \tilde{x}^1_Mにノイズを加えてより高解像度な画像  \tilde{x}^2_0 = G^2_0(\tilde{x}^1_M + z^2_0)を得る。 G^2_0はこのステップでのGenerator、 z^2_0はノイズ。

subregion-wise super-resolution

前のステップのように画像全体を入力とするとGPUメモリが不足するようになってからのステップ。
画像をパッチに切り分け、それぞれの解像度を上げていく。
f:id:Ninhydrin:20220303101034p:plain

単純に超解像するとパッチを戻したときにパッチ同士の境界の連続性が失われるので工夫する必要がある。
この不連続性の原因はzero paddingにあるとして、既存手法ではパッチ切り出し時点でオーバーラップして切り出すことでzero paddingをなくす手法やzero paddingをなくすためにconvolutionを作り変えるものなどがあるが、ここでは簡単な前者を選択。

オーバーラップは受容野のサイズより大きい必要があるが、理論的な受容野のサイズ(TRF)はネットワークの深さに比例する。
ただ、実際に有効な受容野のサイズ(ERF)を分析するとネットワークの深さの平方根に比例するという既存研究の報告がある。
そこでERFの半径分をオーバーラップした。

オーバーラップのありなしの結果が図7。
f:id:Ninhydrin:20220303095759p:plain


Global structure generationのステップのlossは、再構成loss(MSE)、adversarial loss、WGAN-GP lossとKL loss。まさかのAppendix。
次の2つのステップのlossは、再構成loss(L1)、RaGANという手法のadversarial lossとperceptual loss。

細かいアーキテクチャやloss、アルゴリズムはAppendix参照。

実験・結果

SinGANに比べディティールがよい
f:id:Ninhydrin:20220303095842p:plain

f:id:Ninhydrin:20220303095906p:plain

他手法より多様で画像的に一貫性がある
f:id:Ninhydrin:20220303095923p:plain

垂直方向の埋め込みの効果
f:id:Ninhydrin:20220303095947p:plain

その他サンプルは論文参照。

所感

既存手法の組み合わせがメイン。
超解像のために学習済みのESRGANを使うのは確かに良さそう。
また、風景画像のバイアスとして垂直方向方向のみの位置埋め込みを使うのはなるほどと思った。今回は1枚の画像からの生成なので座標を位置埋め込みにするのは確かによくなさそう。