AnT：Transformerを使ったアニメーションの線画着色の自動化の論文紹介

[2021年のディープラーニング論文を1人で読むAdvent Calendar](https://qiita.com/advent-calendar/2021/solo-dl-papers)5日目の記事です。今回紹介するのはTransformerによるアニメーションの自動着色の研究です。まずはこちらの図をご覧ください。

![05_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/607141ff-62b2-94cb-5874-2adb9e63b686.png)

1フレームの線画とカラー画像が参照データとして与えられます。次に複数のフレームの線画が与えられます。これらの**複数線画に対して、最初の線画-カラー画像と同じように自動着色するアプリケーションを作りました**というのがこの論文の趣旨です。ICCV2021に採択されています。

* タイトル：**The Animation Transformer: Visual Correspondence via Segment Matching**
* URL：https://openaccess.thecvf.com/content/ICCV2021/html/Casey_The_Animation_Transformer_Visual_Correspondence_via_Segment_Matching_ICCV_2021_paper.html
* 出典：Evan Casey, Víctor Pérez, Zhuoru Li; Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV), 2021, pp. 11323-11332
* プロジェクトページ：https://github.com/akasha-imaging/ICCV2021
* アプリ：**https://cadmium.app/**

詳細なコードは公開されていませんが、この研究を導入したアプリは公開されているので、詳細な実装に踏み込まずに雰囲気だけ見ていく感じで読んでいきます。[アプリの公開ホームページのデモ動画](https://cadmium.app/)を見るとこの研究のアウトラインが見てきます。

ディープラーニングやTransformerの応用例として見ると面白いでしょう。この研究は**Transformerらしさを活かした**ものなので、「なぜCNNではダメで、Transformerなのか」を踏まえながら見ていきたいと思います。

## Animation Transformer（AnT）
### モデルのアーキテクチャ

![05_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/20e8d8f2-00a6-c488-b106-c2466503ab8e.png)

まずはバックボーンのネットワークで特徴を抽出します。画像をセグメント単位でクロップし、クロップ画像とBounding Boxの座標に分けます。クロップ画像はCNNで、Bounding Boxの座標はFCN（MLP）で特徴抽出します。これを参照画像とターゲットの画像の両方で行います。

次に参照画像とターゲット画像の各特徴をTransformerに入れ、**Self Attention、Cross Attention**を使って相関行列を計算します。これにセグメント別の色を入れ、最終的な着色結果を出力するのがAnimation Transformer（AnT）です。

### SuperGlueとの比較
論文でも引用されていますが、この研究はCVPR2020に採択された[SuperGlue](https://openaccess.thecvf.com/content_CVPR_2020/html/Sarlin_SuperGlue_Learning_Feature_Matching_With_Graph_Neural_Networks_CVPR_2020_paper.html)に着想を受けています（[日本語解説記事](http://xpaperchallenge.org/cv/survey/cvpr2020_summaries/338/)）。**SuperGlue**の論文からの引用です。

![05_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/5dd46461-5ab0-9599-66f5-69452bd85e62.png)

SuperGlueでは、2つの画像間の点のマッピングをGNN（Graph Neural Network）で行っています。この動画は[SuperGlueのGitHub](https://github.com/magicleap/SuperGluePretrainedNetwork)からのものですが、大量のキーポイントを一瞬でペア作れるのがすごいですね。

![](https://raw.githubusercontent.com/magicleap/SuperGluePretrainedNetwork/master/assets/freiburg_matches.gif)

SuperGlueのアーキテクチャーは次のとおりです。

![05_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/9e0f3083-0736-3f2a-6229-f7ae71ba8a8c.png)

なんだかAnTと似ていますね。大きな違いは**GNNかTransformerか、マッピングが点かセグメンテーションかの違い**でしょうか。SuperGlueはコードが公開されているので、AnTを実装したいときは参考になるかもしれません。

### バックボーン（CNNとFCN）
AnTに戻りましょう。クロップした画像の解像度は$(H_c\times W_c \times 2)$なので、線画とセグメンテーションマスクを同時に入れているのでしょうか（ここ自信ない）。CNNでは、これを1×1Convで$D$次元の高レベルの特徴量へマッピングします。この論文では$H_c=W_C=32, D=256$を採用しています。

FCNではBounding Boxの座標をFCNに食わせて、CNNの出力と同じ次元の特徴量を作ります。CNNと出力とFCNの出力を足し合わせて、バックボーンの出力とします。

### Self attentionとCross attention
このモデルではSelf attentionとCross attentionという2つのアーキテクチャーを利用しています。Self attentionのCross attentionの違いはこの論文に限らず一般的な話なのですが、**1枚の画像内でAttentionを取るのがSelf attention、2枚の画像間のAttentionを取るのがCross attention**です。下の図を見てみましょう。

![05_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/a4f8ba54-3c2e-3062-237c-2d4389ce8b62.png)

点は各セグメントの中心点です。**Self attentionでは参照フレームのみのAttentionをとり、Cross attentionでは参照フレームとターゲットフレーム間のAttention**を取ります。これを交互に連続させていくことで、異なる点でのセグメンテーションのマッピングを学習していきます。これは位置不変性の保証されているCNNだけだと難しいので、**Transformerならでは構造**だと考えられます。

最終的な出力は、$A, B$という2つの画像があったときに、$\mathbb{z}_A^L:(M\times D)$、$\mathcal{z}_B^L:(N\times D)$という次元になります。ここで$M, N$は参照、ターゲットのセグメンテーションの数です。

### 類似度の行列を計算
A, Bの特徴量が計算できたら類似度行列を求めます。

![05_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/dee57688-39b1-87c1-9eb7-9ff4b6abcd9a.png)

ここで$\mathbb{f}\_i, \mathbb{f}\_j$は$\mathbb{z}\_A^L, \mathbb{z}\_B^L$の最初の軸でのスライスで、$\mathbb{f}\_i, \mathbb{f}\_j$は$D$次元のベクトルになります。$\mathbb{f}\_i, \mathbb{f}\_j$の内積を指数をかけたものを計算し、それを$M$方向の和を取って正規化したものが$\mathcal{S}\_{ij}$です。やっていることは行単位でのSoftmax関数です。この$\mathcal{S}\_{ij}$がセグメント単位の類似度行列になります。

最終的なターゲット画像の配色は、

```math
\hat{c}_j = \sum_{i=1}^M \mathcal{S}_{ij}c_i
```

で求められます。

## Forward match lossとCycle consistency loss
損失関数は**Forward match lossとCycle consistency loss**からなります。

![05_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/5a20774b-df41-1844-6ae7-3990d60d81bd.png)

**Forward match loss**とはターゲットの配色がGround Truthにどれだけ近づいているかをクロスエントロピーで計算します。もしこれがセグメンテーションと色の関係が一意なら、Forward match lossだけで良かったのですが、現実的には**複数のセグメンテーションで同じ色**を使っています。このまま最適化すると誤った関係を学習することになります。

![05_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/66b8919d-ba57-3129-9500-e7234b0e41f7.png)

具体的にはこのような例です。右のキャラの緑色の服は複数のセグメントに分かれます。左のキャラの髪色も同様です。この問題を解決するために**Cycle consistency loss**を導入します。このロスはCycleGANを連想しますが発想は似ています。

![05_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/39c601b4-46ad-90f7-e167-68576435f87c.png)

先程計算した類似度$S$が参照→ターゲットへの類似度です。これと**逆（ターゲット→参照）の類似度$T$を計算し、リファレンスのセグメンテーションIDと同期を取るように促す**のです。CycleGANだと逆変換用のモデルを新たに作るのですが、AnTではCycle consistency lossの計算は単純で、

![05_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/23845b55-d645-2451-e2d4-96f6f42d877a.png)

先程の$\mathcal{S}$とは前後を入れ替えた（$\mathcal{S}$は$\mathbb{f}\_i^T \mathbb{f}\_j$）相関行列$\mathcal{T}\_{ij}$を計算します。

$r_i$を乱数で初期化したセグメントIDとし、$\mathcal{S}$とかけて$\hat{r}_j$とします。これと$\mathcal{T}$との積を取ったものが$\hat{r}_i$となります。$\hat{r}_i$と$r_i$のロスを計算したのがCycle consistency lossです。

## 実装詳細
### データセットについて
訓練のためのデータセットをどう作ったのか興味ありますが、**合成データセットと手描きアニメーションのデータセットの両方を自作**しています。

* 合成データセット：自由に利用できる3Dモデルを使って、Cinema4Dで合成。**1500×1500ピクセル**で、各キャラ1000フレーム、11キャラで合計11000フレーム作成。
* 手描きアニメのデータセット：実際のアニメから3578フレームを収集。現実問題として、手描きアニメではセグメントIDはないため、カラー化された画像のセグメントを使って求めている。

### 計算時間
AnTの**Foreward pass1回はV100で76msで13FPS**でした。フルHDに近い高解像度なデータでかなりの速度を出せています。[先行研究のDEVC](https://arxiv.org/abs/1906.09909)だと6FPSでした。Cross attentionの計算量は$O(MN)$、Self attentionの計算量は$O(M^2+N^2)$です。

**メモリの消費量がガクッと落ちている**のが特徴で、DEVCだとバッチサイズが3までしか訓練できなかったのが、AnTだと64まであげられます。これはDEVCの計算量が$O((HW)^2)$と画像解像度の各2乗に比例し、莫大であったからです。

### 評価
![05_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/36c70f3d-8869-890f-5ec7-a46235c36a20.png)

実際に比較すると、ずっと良かった先行研究よりも良かったことが報告されています。合成データでは結構健闘していますが、手描きのデータではまだまだ厳しいのが現状です。

![05_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/25233601-db51-1be1-99b5-c07d1d27e61e.png)

実際のカラーリングは上の通り。合成データではかなり健闘していますが、リアル（手描き）のほうはまだ厳しいですね。顔ひげの着色がおかしいですし、腕の黄色が丸々消えています。

![05_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/6f6256ca-041c-db2d-22d3-e5cacc2d726a.png)

AnTで導入したすべての項目が有意に働いていたのがわかります。一番効いているのがCycle consistencyですね。これを外すと、対応関係のないセグメントを同じ色で塗りつぶしてごまかすとのことです。

### リアルデータの着色のために合成データを使ったらどうか
リアル（手描きアニメ）データでの性能を上げるのが大変なので、「リアル向けでも合成データを訓練データとして使ったらどうか？」という疑問がわきます。

![05_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/4d3ea73a-f7bc-984e-3c3f-664b1c1f37d1.png)

実際に試してみると、**リアルと合成データを混ぜたほうが、合成・リアルの両方で最も性能が良かった**ことがわかります。混ぜたケースでリアルの性能が上がるのは理解できますが、合成のほうがむしろ大きく上がっているのが驚きです。論文では「合成データはリアルデータと比べて、多様性やチャレンジング度合いが乏しいから」と仮説づけています。

## まとめと感想
この論文では、アニメーションの自動着色という、かなり実用性ありそうな問題についてチャレンジしています。**1500×1500という高解像度でも現実的な計算量で収まっている**のがすごいです。リアルなデータでの性能上げはまだまだ難しいですが、例えば、1日目に紹介したEdge Flowのように、インタラクティブに着色をある程度指定していくように問題を簡単にすると、もっと性能が上がるような気がします。

この論文は技術的に結構面白くて、**Transformer特有のSelf attention、Cross attentionをうまく活用**しています。具体的には参照画像とターゲット画像のマッチングにCross attentionを使う、計算量を落とすためにTransformerで使われるようなパッチを切り出し、Multi head風にするなどです。Transformerの時代であることは声高に言われますが「実際CNNで良くない？」って疑問が湧くことも多々あります。しかしAnTは、位置が大きく変わるセグメント間の類似度の学習のため、Transformerのほうが明らかに良いです。別の先行研究として触れたSuperGlueはGNNなので、「Transformerはまだ許せるけど、GNNはちょっと」みたいな人でも、使いやすいモデルとなっています。

AnTはTransformerらしさを活かした問題やモデル構造として、結構面白いのではないかと思います。4日目に紹介したStyleGANの合成はCNNの良さを活かしているので、ここらへんの使い分けが意識されると、より心地の良い世界になるのではないかと思います。

※AppendixにPaint Chainerの話が載っていてちょっとニヤリとします。

## 告知
このアドベントカレンダーが本になりました！
**https://koshian2.booth.pm/items/3595424**
Amazonでも扱いあります詳しくは👉　https://shikoan.com