[論文メモ] DaViT: Dual Attention Vision Transformers

arxiv.org

空間方向だけでなくチャンネル方向のself-attentionも導入することでglobal contextを扱えるようにした。
f:id:Ninhydrin:20220413091328p:plain

Vision Transformer(ViT)は画像をオーバーラップなしのパッチに切り出して、それをシーケンスとみなしてself-attention(SA)を行うが計算コストが高く解像度が高いと厳しい。
Swin Transformerなどで導入されたlocal attentionは切り出したパッチをグループにまとめそのグループ内でSAすることでコストを抑えたがグループ同士のインタラクションが必要になる。
これらのピクセルレベル・パッチレベルSAの手法とは違った、計算コストもそれほど多くなくglobal contextを扱える画像レベルSAを作れないか?というお気持ち。

手法

空間方向だけではなく、チャンネル方向のSAも導入したDual Attention Blockを提案
Dual Attention Blockの構造を図3(a)に示す。
f:id:Ninhydrin:20220413092726p:plain

Spatial Window SAはSwin Transformerのものと同じ。
local window内でSAするのでグローバルな情報を扱えない。

そこでChannel Attention(CA)を導入する。
チャンネル数 C、画像の縦横を H, Wとしたとき、空間方向のSAは長さ HW C次元特徴ベクトルのシーケンスとみなしてSAを行うのに対して、チャンネル方向のSAは長さ C HW次元特徴ベクトルのシーケンスとみなしてSAを行う。
各パッチは画像の局所的な情報を持っているのに対して、各チャンネルはすべてのパッチを横断して画像全体における特徴を持っており、CAによりグローバルな情報を扱うことが出来る。

ただ、チャンネル次元が512とかになると計算コストが大きいのでチャンネルをGroup Normのようにグループ化し、そのグループ内でチャンネル方向にSAを行う(Channel Group Attention(CGA))。空間方向でのlocal windowと同じ。
local window SAと同じ制限、つまりグループ同士でのインタラクションが必要になるがそれは空間方向のSAが担ってくれる。

計算量については省略。詳しくは論文参照。

特徴マップの可視化比較。
f:id:Ninhydrin:20220413100553p:plain

このDual Attention Blockを使ったアーキテクチャをDual Attention Vision Transformers (DaViT)とする。
よくあるViTと同じアーキテクチャ構造でパッチ埋め込みのレイヤーの後に4つのブロックがスタックされる階層構造。


ViTでお決まりのサイズ毎の複数アーキテクチャ
 Lが層の数、 N_gがチャンネル方向SAのグループ数、 N_hが空間方向SAのヘッド数。
f:id:Ninhydrin:20220413094941p:plain
f:id:Ninhydrin:20220413095009p:plain
f:id:Ninhydrin:20220413095953p:plain

実験・結果

ImageNet-1Kのクラス分類、COCOの物体検出、ADE20kのセマンティックセグメンテーション。

バッチサイズ2048、AdamW、300エポック。
f:id:Ninhydrin:20220413095613p:plain

COCO。
f:id:Ninhydrin:20220413095842p:plain

ADE20k
f:id:Ninhydrin:20220413095905p:plain

同じレベルのFLOPsで比較しても優位。
f:id:Ninhydrin:20220413101426p:plain


Ablations。
CGAをどのブロックで採用するか(表5)と各SAの順番比較(表6)。
f:id:Ninhydrin:20220413100202p:plain

DeiTの各Blockの半分をChannel Attentionに置き換えた。
f:id:Ninhydrin:20220413100910p:plain

所感

チャンネル方向のattentionで、Group Normのようにチャンネルをグループにするというシンプルな解決策。
グループに分けると計算コストは減るがグループ同士のインタラクションが必要になる。
それを直交する方向(空間方向とチャンネル方向)でattentionすることで解決しているのは良い。

[論文メモ] PixelFolder: An Efficient Progressive Pixel Synthesis Network for Image Generation

arxiv.org

Pixel Shufflerを使ったピクセルレベルの画像生成

f:id:Ninhydrin:20220412090208p:plain

既存手法にCIPSというのがあり、これはピクセル座標と潜在変数から画像を生成するというもの。ピクセルは独立で、空間方向でのconvolutionはなく、基本ピクセル独立のMLP(Network In Networkみたいな)。
しかし、メモリの消費も大きく計算量も多いのでそれをどうにかしたいというお気持ち。

手法

Pixel Shufflerを導入して解像度を下げる。ここではpixel foldingという名前をつけているが統一してほしい。ここでは一応pixel foldingという名前を使う。

pixel foldingの仕組みは図3(a)を参照。
f:id:Ninhydrin:20220412091240p:plain
pixel foldingはあるテンソル X \in \mathbb{R}^{H \times W \times d} X' \in \mathbb{R}^{\frac{H}{4} \times \frac{W}{4} \times 4d}にreshapeし解像度を下げる(図3(a)の上)。
逆操作のpixel unfoldingはテンソル X \in \mathbb{R}^{\frac{H}{4} \times \frac{W}{4} \times 4d} X' \in \mathbb{R}^{H \times W \times d}にreshapeし解像度を上げる(図3(a)の下)。
reshapeするだけなので計算コストも少なく情報も落ちない。

このpixel foldingを使ったアーキテクチャをPixelFolderとする。
アーキテクチャの全体像は図2(b)を参照。ちなみに図2(a)が既存手法のCIPSのアーキテクチャ
f:id:Ninhydrin:20220412091959p:plain

アーキテクチャは各解像度で各ピクセルの初期値となる入力があり、入力と同じサイズの画像を生成する。最終的にそれらをターゲットの解像度にアップサンプリングし足し合わせることで画像を生成する。
途中pixel foldingで解像度を落としpixel unfoldingで元に戻すボトルネックな構造。

ピクセルに対してのMLPを適用して画像を生成するので解像度を下げるとコストを下げられる。ただすでにピクセル独立ではないと思う。

各解像度では初期値特徴を多分conv1x1あたりでチャンネル数を1/4にし、pixel folding -> ModConv -> pixel unfolding -> ModConv -> ToRGBというプロセスをたどる。自身より解像度の低いステージがある場合はその中間特徴も受け取る。
初期値特徴は各座標のフーリエ特徴と座標ごとの学習可能なパラメータ。
ModConvはStyleGAN2で採用されたModulated Convでこれは3x3カーネルサイズ。

実験・結果

データセットはFFHQとLSUN Churchで解像度は256x256。

モデルサイズや計算コストの比較。ピクセルレベルの生成なのでパラメータ数は少なく、解像度を落としているので計算もそこそこ速い。
f:id:Ninhydrin:20220412094032p:plain

品質
f:id:Ninhydrin:20220412093949p:plain

Ablations。

foldingとunfoldingをそれぞれアップサンプリングとDeConv(TransposeConv)に置き換え。計算コスト、品質ともにfolding・unfoldingが良さげ。
f:id:Ninhydrin:20220412094301p:plain

f:id:Ninhydrin:20220412094525p:plain
f:id:Ninhydrin:20220412094546p:plain

所感

CIPSについて聞いたことある気がと思ったら以前に実装したことがあるモデルだった。
CIPSは(確か)ピクセルが完全に独立だったが、PixelFolderはそうではなくなったのでCIPSは比較対象として微妙な気がする。StyleGAN2と比較してるのでいいが。
512x512やそれより大きな解像度の実験もやってほしかった。

最近Pixel Shuffler系を目にしていたのでやっぱり出てきたかという印象。名称を統一してほしい。

せっかくなのでCIPSを実装しキャラクター画像で実験した結果を供養しておく。
f:id:Ninhydrin:20220412095308p:plain

[論文メモ] MixFormer: Mixing Features across Windows and Dimensions

arxiv.org

CVPR2022 Oral

window baseのattentionとdepth-wise convで双方向インタラクションすることで計算量を抑えつつlocal globalの情報を扱えるようにした。
f:id:Ninhydrin:20220411085746p:plain

Vision Transformer(ViT)の一つの成功例としてSwin Transformerがある。
Swin Transformerはオーバーラップ無しのwindowを切り出し、その中でattentionを行うというwindow baseなattention(local window self-attention)を採用している。
local window self-attentionは受容野を絞ることで計算量を抑えまた画像タスクの帰納バイアスとなる。しかし受容野を絞ったことで元のself-attentionより能力が制限されている。
これを改善するためにdepth-wise convと組み合わせる方法も提案されている(HRFormerとか)。これはlocal window self-attentionとdepth-wise convを続けて行うことでlocal globalを組み合わせているが、これだと情報がうまく混ざらず、またのlocal window self-attentionとdepth-wise convそれぞれの弱点を無視しているため特徴表現があまり良くない。
これらをどうにかしたいというお気持ち。

手法

local window self-attentionとdepth-wise convを並列し、かつ双方向インタラクションを行うMixing Blockを提案する(図1)。

並列化はそのままの通りでlocal window self-attentionとdepth-wise convを並列で行い、それらの出力をconcat後 feed-forward network(FFN)に通す。

local window self-attentionのサイズは7x7、depth-wise convのカーネルサイズは3x3。これらは実験的に決定。

次に双方向インタラクションについて(図1の水色の矢印)。

local window self-attentionはチャンネル方向の重みを共有して空間方向の位置で動的に重みを決定するためチャンネル方向のモデリング能力が低い。
逆にdepth-wise convはチャンネルに注目して空間方向の重みを共有している。
そこでこれらを双方向にインタラクション(bi-directional interactions)することでお互いの弱点を補う。
f:id:Ninhydrin:20220411092624p:plain

depth-wise convの出力はchannel interactionモジュールを通してlocal window self-attention(図だとW-Attention)に伝えられる。
local window self-attentionの出力はSpartial Interactionモジュールを通してdepth-wise convの出力に混ぜられる。

channel interactionモジュールは Squeeze-and-excitation NetのSEレイヤー。global average pooling(GAP)レイヤーで1x1の解像度に落として最後にsigmoidに通してチャンネル方向のattention的なものにする。そしてそれをself-attentionのvalue部分に掛ける。

spatial interactionモジュールはconv1x1を組み合わせてチャンネル方向を1にし、最後にsigmoidを通して空間方向のattention的なものにする。そしてdepth-wise convの出力に掛ける。

これがMixing Blockでこれを使ったViTをMixFormerとする(図3)。
f:id:Ninhydrin:20220411094340p:plain

例のごとく複数のサイズを用意(表2)。
f:id:Ninhydrin:20220411094432p:plain

実験・結果

224x224入力のImageNet-1Kのクラス分類。AdamWで300epochの学習。結果が表3。
f:id:Ninhydrin:20220411094535p:plain

これの前に読んだMaxViTとモデルサイズ等で良さげなペアがなく比較は難しかった。MixFormerのほうがFLOPsが小さそう。

Object DetectionやSemantic Segmentationのbackboneとしたときの比較。
f:id:Ninhydrin:20220411095254p:plain
f:id:Ninhydrin:20220411095329p:plain

Ablations。
並列化とインタラクションの影響。並列化の効果が高そう?
f:id:Ninhydrin:20220411095447p:plain

depth-wise convのカーネルサイズの違い。
f:id:Ninhydrin:20220411095539p:plain

アーキテクチャデザイン。
f:id:Ninhydrin:20220411095638p:plain


他のアーキテクチャにMixing Blockを適用。
f:id:Ninhydrin:20220411095747p:plain

所感

最近では「Swin Transformerのlocal window self-attentionは局所的な特徴しか扱えないのでなんとかしたい」から「local window self-attentionとグローバル情報をどうやって組み合わせるか」という問題設定に変化している。
前回読んだMaxViTはchannel shufflerの逆操作で、今回のMixFormerでは並列したdepth-wise convとの双方向インタラクション。
MixFormerのほうが1ブロックに付きself-attentionが1回少ない分計算量が少なそう。その代わり精度がわずかに劣っている印象。
正直self-attention使わなくても、pixel shufflerの逆操作とconvで十分な気がする。attention使わないからViTにはなれないけど。

[論文メモ] MaxViT: Multi-Axis Vision Transformer

arxiv.org

Google Research

入力画像サイズにスケーラブルなVision Transformer(ViT)の提案

ViTはモデルの能力が高く過学習しやすい。それを抑えるため大量の学習データを必要とした。
Swin Transformerはwindow-baseにしてうまく制御したが、window-baseにしたことで大域へのattentionが失われた。
global attentionとlocal attentionの相互作用のためには高解像度(階層ネットワークの場合は入力に近い層)でglobal attentionを行う必要があるがattentionは N^2の計算コストがかかる。どうにか軽量なglobal attentionをしたいというお気持ち。

手法

localとglobalのインタラクションを可能にするmulti-axis self-attention(Max-SA)をつかったMaxViTを提案。
MaxViTのアーキテクチャの全体像は図2参照。
f:id:Ninhydrin:20220406095459p:plain

はじめにConvしたあと(Stem)は基本Max-SAブロックを積むだけ。
Max-SAブロックはMBConv、BlockAttention、GridAttentionの3つのモジュールからなる。

MBConvはMobileNetv2で提案されたInverted Residual Block。Conv1x1でDepthwiseConv3x3とSqueeze-and-Excitationモジュールを挟んだもの。
MBConvを前に入れたのは、入れたほうが汎化性能が高くなり学習もしやすくなったから(実験による観測)。
またDepthwiseConvにはconditional position encoding (CPE)とみなすことができるので明示的なPEは入れてない。

メインはBlockAttention、GridAttention。
BlockAttentionがlocalなattentionでGridAttentionがglobalなattentionを担う。

まずBlockAttentionについて
画像 X=\mathbb{R}^{H \times W \times C}を普通のViTなら HWのシーケンスとしてattentionを行うが、BlockAttentionでは (\frac{H}{P} \times \frac{W}{P}, P\times P, C)にreshapeして P \times Pの次元、つまり P \times Pのwindowに分割してそのwindow内でattentionを行う。これはSwin Transformerと同じ。
window内でのattentionになるのでlocal。

globalなattentionを担うGridAttentionについて。
画像 X (G \times G, \frac{H}{G} \times \frac{W}{G}, C)にreshapeして G \times Gの次元でattentionを行う。
これ故にMulti axis。

BlockAttentionとGridAttentionを図にしたのが図3。
f:id:Ninhydrin:20220407091923p:plain

Swin Transformerのattention部分の片方をGridAttentionで置き換えても計算量やパラメータは一切変わらないがglobalとのインタラクションが可能になる。
GridAttentionの実装も全然大変ではない。

例のごとくサイズ違いのモデルを複数用意(表1)
f:id:Ninhydrin:20220407093021p:plain

実験・結果

データセットはImageNet-1K(1.28M)、ImageNet-21K (12.7M)、JFT (300M)。細かい設定は論文参照。
f:id:Ninhydrin:20220407093134p:plain

パラメータや計算量でのスケールも良い。
f:id:Ninhydrin:20220407093621p:plain

ImageNet-21Kの結果。
f:id:Ninhydrin:20220407093221p:plain

MaxViTをバックボーンに使ったCOCO2017のObject Detectionの結果。
f:id:Ninhydrin:20220407093822p:plain

Ablations。結構色々試してる。GridAttentionの恩恵よりMBConvの恩恵のが大きく見える。
f:id:Ninhydrin:20220407094001p:plain

各階層でのブロック数のレイアウトをSwin Transformerに合わせて比較。MaxViTのレイアウトのが良い。
f:id:Ninhydrin:20220407094309p:plain

所感

attentionの次元を変えるのはたしかに良さそう。DilatedConvでよくない?と言われればそのとおりだが。
ぶっちゃけPixel Shufflerの逆操作。
気持ち的にglobal attentionに興味があったが、実験の結果的にはMBConvの結果が興味深かった。

[論文メモ] Fine-tuning Image Transformers using Learnable Memory

arxiv.org
CVPR 2022
Google

Vision Transformer(ViT)の入力トークンに学習可能なメモリトークンを追加することで新規タスクにスケーラブルなfine tuning方法を提案。

f:id:Ninhydrin:20220404093111p:plain

ViTは大量のデータで学習することで高い精度を得られる。そしてそれをfine tuningすることで画像分類等のタスクに応用する。
しかしViTは大量のパラメータがあり、タスク毎にすべてのパラメータを保存するのは高コスト。またfine tuning時の学習率に対しての敏感さもある。
そしてタスク毎にモデルを作ると保存のコストや実行時のコスト(タスク分forwardする)が必要。
これらを解決したい。

手法

既存の学習済みViTにメモリとなるトークンを追加する。

ここではクラス分類について考える。
ViTの入力は画像を N個のパッチ(トークン)化してPositional Encoding(PE)を追加したものと最終的なクラス分類に使われるクラストークン。
なので合計 N + 1トークン列が入力となる。
f:id:Ninhydrin:20220404093931p:plain
 Eははじめの画像パッチの変換(MLPとか)、 E_{pos}がPE、 x_{\verb|cls|}がクラストークン。

ここにfine tuning用のメモリトーク E_{mem} \in \textbf{R}^{m \times D}をconcatする( Dトークンの次元数)。
ViTは N + 1 + mトークンを入力として受け取ることになる。

そしてこのメモリトークンは次のブロックに伝わらない。
つまりブロック lの出力を y_lとすると y_l N + 1個のトークンに切り捨てられ、次のブロックに入力する際は再度メモリトークンをconcatする。

f:id:Ninhydrin:20220404095143p:plain

切り捨てないもの等も実験したがこれが良かったらしい。

ランダムに初期化したメモリとクラストークン、そしてクラス分類のヘッド部分のみをfine tuningすると良いパフォーマンスを得られるが、ヘッド等が変化するため元タスクの予測はできなくなる。

元タスクを予測する必要がないなら問題ないが、元タスクと新タスクの両方が必要なことも多い。両方保存するのは単純だが新タスクが増えていくと破綻する。また計算コストも新タスク分だけ増える。
すべてのタスクを1つのモデルで学習する方法もあるがこれは常に可能なわけではない。

そこでメモリトークン、クラストークン、ヘッド部分のみ付け替えAttention Maskで対応する。適切なAttention maskを利用すればトークンへの注意を制御出来る。
元の入力トークンとクラストークンに対するattentionを同じく入力トークンとクラストークンに依存するようにする。
そして新たなタスクのためのクラストークンが追加された場合、そのクラストークンは入力トークンとクラストークンに加え自身のクラストークンとメモリトークンに依存するようにする。言い換えると他のタスクに依存しないようにする。
表1がそのマスク。
f:id:Ninhydrin:20220405090905p:plain

このようなマスクを設計することで同時に複数のタスクをfowardすることが出来る。
入力に各タスクのメモリトークンをconcatしforwardする。マスクにより入力トークンや元のクラストークンはメモリトークンの影響を受けず、各タスクのクラストークンも互いに独立しているので問題ない。最後に各クラストークンを各々のタスクのヘッドにつなげれば各タスクの出力を得られる。

f:id:Ninhydrin:20220405091521p:plain

実験・結果

基本アーキテクチャはViT-B/32でImagenet-21Kで学習されたViTの論文元が公開している事前学習モデルを利用。
学習率のスケジューリングはコサインでその他の設定はViTの論文参照。
最適化手法としてMomentum SGD + Gradient Clipping、5step warmupあり。

各データセットについて試した結果が以下の図4と表2。
Fullはモデル全体のfine tuningで一番良いが一番コストが高い(モデルをすべて別々に保存する必要がある)。
ヘッドやクラストークンの学習に比べ提案手法のが良い(メモリトークンの分の多少のオーバーヘッドはあるが)。
f:id:Ninhydrin:20220405092540p:plain

新規タスクのために増加したパラメータと計算コスト。もとのViTのパラメータが80MでFullは当然丸々1ViT分増える。
f:id:Ninhydrin:20220405093353p:plain




Ablations。
メモリトークンの扱いについて。
メモリトークンはブロックに入力する際に追加され、出力時に切り捨てているが他についても調査。
追加・切り捨ては図2の左から2番目。
ブロック毎に追加していく(切り捨てしない)パターン(図2左から3番目)とはじめのメモリトークンを伝播していく(図2右はし)を実験。
結果が図6。Full memory(追加・切り捨て)がよい。
f:id:Ninhydrin:20220405093023p:plain
f:id:Ninhydrin:20220405093737p:plain


どのブロックでメモリトークンを追加するといいのか。
f:id:Ninhydrin:20220405093606p:plain

所感

attentionマスクでタスク毎に独立性を保てば確かに1回のforwardで済むのはなるほどと思った。モデルの転用も出来るし省メモリ。
ぶっちゃけ一般人レベルだと必要ないだろうがGooleレベルの規模になるとモデルの数とかもすごそうだし、こういったスケーラブルな方法が必要なのかもしれない。
タスク間でインタラクションがないのでマルチタスクなのにそこの恩恵が受けられないという制限があるとのことで難しい問題。
メモリトークンの初期値を引き継ぐくらいでは微妙か。
結構運用寄りの内容だったが面白かった。

[論文メモ] DISENTANGLING CONTENT AND FINE-GRAINED PROSODY INFORMATION VIA HYBRID ASR BOTTLENECK FEATURES FOR VOICE CONVERSION

arxiv.org
thuhcsi.github.io

ICASSP 2022

Cross Entropy(CE) lossとConnectionist Temporal Classification(CTC) lossそれぞれで学習した音声認識モデルの特徴量を使ったany-to-oneのVoice Conversion(VC)モデルの提案。

CElossで学習した音声認識モデルの特徴量を使うと音色が劣化し、CTClossで学習した音声認識モデルの特徴量を使うと自然性が劣化する。
そこで2つの特徴を利用したハイブリッドなモデルを構築する。

手法

全体図は以下の図2参照。5つのモジュールからなる。
f:id:Ninhydrin:20220401091429p:plain


音声認識はconformerベースのものを利用。transformerとCNNを合わせたモデルで最近のSOTAらしい。
同じアーキテクチャの2つモデルをCE lossとCTC lossそれぞれで学習し、中間から抽出した256次元の特徴を利用する。
図2の左、CE-BNFsとCTC-BNFsがそれ。BNFはBottleneck featureの略。


VCモデルとしては2つのエンコーダと1つのデコーダからなる。
2つのエンコーダはコンテンツ用と韻律用でコンテンツエンコーダはCTC-BNFsを、韻律エンコーダはCE-BNFsを受け取り特徴量に埋め込まれる。
そして得られた2つの埋め込み特徴はconcatされデコーダに入力される。図の \oplusはconcatらしい(紛らわしい)。

韻律エンコーダはConv1dとGroupNormを含むBLSTMを使った構造。
韻律埋め込みはInstance Normしたり、コンテンツ埋め込みに比べ次元を非常に小さくしたりして情報を制限する。
f:id:Ninhydrin:20220401093102p:plain
 F_{prosody}が韻律埋め込みで INがInstance Norm、 E_{prosody}が韻律エンコーダ、 BNF_{ce}がCE-BNFs。
この韻律埋め込みはProsody Predictor、Adversarial Content Predictor、デコーダの3つに使われる。

Prosody Predictor  P_{prosody}は韻律埋め込みからエネルギー \hat{E}、ピッチ \hat Pを予測し、正解のエネルギー Eとピッチ PとのL1 lossをとる。 L_{prosody}は韻律関係の最終的なloss。 \lambda_*はハイパラ。
f:id:Ninhydrin:20220401093602p:plain

Adversarial Content Predictorはコンテンツ埋め込みと韻律埋め込みの情報がかぶらないようにするためのもの。
図2の通りContent Predictorの前にgradient reversal layer(GRL)をおく。
GRLはバックプロパゲーション時に勾配を反転させる層。
Content Predictorは韻律埋め込みからコンテンツ埋め込みを予測するように学習をする(L1 loss)。
通常なら韻律埋め込みがContent Predictorがコンテンツ埋め込みを予測しやすくなる方向への勾配を韻律エンコーダに流すはずだが、GRLで勾配が反転するのでContent Predictorがコンテンツ埋め込みを予測できなくなるような方向へ韻律エンコーダは学習する。
これにより韻律埋め込みとコンテンツ埋め込みの情報のオーバーラップを減らせる。
f:id:Ninhydrin:20220401094540p:plain

一番の目的であるVCのlossは再構成loss。デコーダで生成したメルスペクトログラム \hat Sと正解のメルスペクトログラム SとのL1 loss。
f:id:Ninhydrin:20220401094645p:plain

最終的なlossは以下。
f:id:Ninhydrin:20220401094755p:plain

実験結果

音声認識モデルは3000時間のMandarin コーパスで学習。
ボコーダとしてHiFiGANを利用。

ABXテスト。AとBは異なる手法での生成、Xは本物。

利用する特徴量の比較。BNFはネットワークの途中の特徴、PPGは最終層の特徴。
f:id:Ninhydrin:20220401094822p:plain

提案手法だとCTC-BNFsと同程度のSimilarityでありつつ自然性も高い。
f:id:Ninhydrin:20220401095144p:plain
f:id:Ninhydrin:20220401095830p:plain

あとは論文とデモ参照。

所感

異なる目的関数で学習したものを利用するを最近見かける気がする。
StyleGAN-XLはDiscriminatorとしてResNetとViTを利用していたが、この手法では異なるlossの特徴量を利用している。
少々泥臭い感じがしなくも無いが、精度を高めるためには有効そう。
音声認識に関してもConvNet以外のアーキテクチャでlossを取るとかやってもいいかもしれない。
こういうのを見ていると、異なるlossで学習して得られる特徴量の特徴を考えることの重要性を強く感じる。

[論文メモ] CM-GAN: Image Inpainting with Cascaded Modulation GAN and Object-Aware Training

arxiv.org

Adobe Research
間違いがあるかもしれないので注意。

大きな欠損のある画像の補完が出来る、cascaded modulation GAN (CM-GAN)の提案。

大きな欠損を補完出来る既存手法としてLaMaやCoModGANがあるが、それでもまだ厳しい。
それはマスクされた補完箇所からの画像の空間的距離依存やグローバルなセマンティクスを扱えないからでそれを解決したい。

なお下記画像はgithubから引用(論文中の画像は当時、貼り忘れられていた)。
多分図2。
f:id:Ninhydrin:20220325101839p:plain

手法

欠損箇所をglobal contextによって作った特徴マップで埋めることカスケード構造を提案

アーキテクチャ

アーキテクチャの全体像は図2を参照。
エンコーダと2つのデコーダからなる。
エンコーダは欠損画像と欠損のマスクを受け取り、マルチスケールの特徴マップ F_e^{(1)},..., F_e^{(L)}を出力する。 Lはスケールの数で F_e^{(L)}が最も小さい解像度の特徴マップ。

全体構造をキャプチャするためのglobal style code  \boldsymbol{s} F_e^{(L)} L_2正則化付きの線形変換によって取得する。
これを潜在変数  \boldsymbol{z} をMapping Networkによって変換して得られた  \boldsymbol w とconcatしてglobal code  \boldsymbol g =[\boldsymbol{s}; \boldsymbol{w}]を作る。global codeはデコーダに利用される。

Global-Spatial Cascaded Modulation

decode時にglobal contextをうまく扱うためにglobal-spatial Cascaded Modulation (CM)を提案。
図2の右側の2つのモジュール、Global Modulation Block (GB)とSpatial Modulation Block (SB) がそれにあたる。
GB、SBともに各ブロックは F^{in}_g F^{in}_sを入力として受け取り F^{out}_g F^{out}_sを出力する( F^{out}_g F^{out}_sが次の F^{in}_g F^{in}_sになる)。詳しく書かれていないが多分 F^{in}_g \boldsymbol sを2Dに変換したものがはじめで、2ブロック以降は前ブロックの出力を受け取る。 F^{in}_sも同じく \boldsymbol sを2Dにしたものとエンコーダの同じ解像度の特徴( F_e^{(l)})をconcatしたものを受け取ると思われる。このあたりは抜け落ちている図に書いてあるのかも。

エンコーダの出力は欠損箇所の特徴がノイジーなのでglobal contextと合わせて単純にデコードしても欠損箇所にアーティファクトが出る(図7参照)。
f:id:Ninhydrin:20220328092603p:plain

そこで欠損箇所の影響をあまり受けない特徴も同時にデコードするカスケードなモデルにする。
2D化した \boldsymbol sとglobal code  \boldsymbol gからデコードするGBのデコーダを用意し、その中間特徴をSBのデコーダに注入する。
SBの各ブロックでは入力をglobal code  \boldsymbol gでmodulationした後、GBの中間特徴 \boldsymbol Xを加工したもので特徴を更新する。
加工はAffine Parameters Network(APN)を通す。擬似コードが以下(間違ってるけどなんとなくわかる)。詳しくは論文参照。
f:id:Ninhydrin:20220328095205p:plain

これによりグローバルな特徴を常に意識しつつ、空間的な特徴もきれいに捉えることが出来る。

Expanding the Receptive Field at Early Stages

エンコーダについて。
単純なFCNだと浅い層の有効な受容野(effective receptive field)の成長が遅い(らしい)。これは既存研究のLaMaでも言及されている。
そのため、欠損部分についておかしな特徴ができてデコーダが苦しむ。

既存手法としてfast Fourier convolution (FFC)があり、FFCを使うと浅い層でも画像全体をカバーできる大きな受容野となる。
既存手法ではFFCボトルネック部分でスタックしていて計算量が多く、ボトルネックは浅めなためglobal contextをうまく処理できず欠損を処理しきれない。
そこで本手法ではエンコーダ自体をFFCで構成することで浅い層の段階で欠損部分を処理して、欠損部分に変な特徴が出ることを防ぐ。

Object-aware Training

実際にアプリケーションとして使う場合、既存手法のようなランダムマスクではなく画像中の不要なオブジェクトを塗りつぶしたようなマスクになる(図4)。
f:id:Ninhydrin:20220328100116p:plain

そこでPanopticFCNを用いてセグメンテーションを学習し、それをマスクに利用する。
FCNによるオブジェクトレベルのセグメンテーションからのサンプリングとランダムな欠損を生成しオーバーラップを計算。しきい値異常のオーバーラップがあった場合はオブジェクトをマスクする(人間が入力する場合のobject removalに相当するマスク)。
それ以下の場合はランダムな欠損を利用する(人間が入力する場合の補完に相当するマスク)。

Training Objective and Masked-R1 Regularization

adversarial lossだけでも良いパフォーマンスだがperceptual lossを追加すると更に改善した。
またマスク以外の領域でgradient penaltyを計算しないことで学習が安定化。
f:id:Ninhydrin:20220328101333p:plain
 mはマスク。

実験・結果

512x512のPlaces2データセット
詳細は論文参照。
f:id:Ninhydrin:20220328101614p:plain

CM-GANは既存手法と比べぼやけておらず細かく生成している印象を受ける。GBとSBの恩恵か。
f:id:Ninhydrin:20220328101526p:plain
f:id:Ninhydrin:20220328101642p:plain


Ablation。各モジュールの有用性。
f:id:Ninhydrin:20220328101715p:plain

所感

メモを書いた当時、論文も投稿されて間もないため論文が正直不十分だった(図の貼り忘れ、図にある特徴が不明 or 間違っている、擬似コードも間違っているなど)。なんか急いでいた感がある。
グローバルな特徴でのみデコードするモデルと空間的な特徴も扱うモデルでのカスケード構造は良さそう。
以前CoModGANを試したとき、たしかに大きな欠損にアーティファクトが出ていた。それを補うためにマスクの影響をあまり受けないグローバルな特徴のみから生成した特徴マップを欠損箇所の補完に利用することでなんとなくグローバルに正しいものが生成できそう。
欠損箇所の特徴がアーティファクトの原因になりそうなのもよく分かる(3x3とかのConvoolutionならなおさら)。