Slot Attention ～教師無し物体検知～


# 概要
　土木の分野において、道路や橋梁のひび割れ・破損を物体検知の手法を取り入れられ、様々な場面で適用されています。
　
　通常の教師ありの物体検知では、精度を上げるにはデータが多く必要であり、人間がアノテーションをするのにかなりの労力が必要となります。また、土木分野において、普通の人間では認識が難しいデータセット（例えば、航空写真を使った地形データなど）では、そもそも教師あり学習データが正しいかどうか、判断が難しい場合があります。このような場合、教師無し物体検知が有用だと考えています。

　話は逸れて、自然言語処理や画像分類において、注意機構(Attention)が使われています。Attentionは、AIがどこを見て判断しているか説明（解釈）するために有用だと注目を集めています。個人的には、Attentionの技術にとても注目しています。

　今回の記事では、Slot Attentionを用いた教師無しの物体検知(Object Discovery)について紹介します。また参考にした論文に集合予測について書かれていたので、それについても簡単に紹介したいと思います。
　
　Slot Attention をつかった反復Attentionメカニズム(iterative attention mechanism)は、潜在表現から入力の特徴マップを分解し、グループ分けの手順(grouping strategy）を学習します。つまり、それぞれのスロットで1つの物体を記述することができます。

 今回の論文で、はじめて教師無し物体検知・物体中心表現・集合予測を勉強したので、間違っている点が多々あると思います。


論文は以下を引用しています。

https://arxiv.org/abs/2006.15055

またtensorflowのコードが公開されています。

https://github.com/google-research/google-research/tree/master/slot_attention

日本語の解説として、以下の解説があります。論文の理解に、とても役立ちました。

https://deepsquare.jp/2020/07/slot-attention/#:~:text=%E3%80%8C%E7%89%A9%E4%BD%93%E4%B8%AD%E5%BF%83%E8%A1%A8%E7%8F%BE%E3%80%8D%E3%81%A8%E3%81%AF,%E8%A1%A8%E7%8F%BE%E3%80%8D%E3%82%92%E3%81%95%E3%81%99%E8%A8%80%E8%91%89%E3%81%A7%E3%81%99%E3%80%82&text=%E3%81%93%E3%81%AE%E5%88%86%E9%87%8E%E3%81%AF%E4%BA%BA%E9%96%93%E3%81%AE,%E5%A4%9A%E3%81%84%E3%81%A8%E3%81%84%E3%81%86%E5%82%BE%E5%90%91%E3%82%82%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

物体中心表現については、以下を引用しています。

https://www.jcss.gr.jp/journal/vol06/060406/node1.html

# 物体中心表現

　人間が物体を認識するとき、人間の目（網膜）は、3次元の拡がりを持った物体を認識しているのではなく、3次元を2次元に射影したものを認識している。網膜は、奥行きの情報が欠如していても、物体を認識できる。

　機械学習に与える入力データも人間と同じ情報のはずである。しかし、日当たり・影などが変化しても人間は認識できるが、機械学習は、日当たり・影などをの影響を受けてしまい、学習が上手くいかないことが頻繁に起こる。
　
「畳み込み」と「プーリング」によって構成される畳み込みニューラルネットワーク(CNN)は、ヒューベルとウィーゼルの仮設に基づき構築された数理モデルである。畳み込み層は局所的な特徴を抽出し、プーリング層は物体の移動に対して不変となるように導入する。（カプセルネットワークでは、プーリング層に関して否定的である。今回の記事で登場するCNNは、プーリング層は入れない。）

　CNNは、知覚特徴量は抽出できるが、日当たり・影などをの影響についての不変性は考慮されていない。

　Marrらは「物体の内部表現は、網膜像の変化に関して不変であり（物体が暗くなったり、近くまた遠くなったりしても影響は受けないと言うこと）、その表現は物体中心である三次元表現である。」と考えた。このことを物体中心表現と呼ぶ（のだろう）。

　物体中心表現を獲得することで、2次元情報から3次元情報を推論することができる。Slot attentionは、物体中心表現を獲得するためのアルゴリズムである。

　他の表現方法として、分散表現がある。詳しくは理解していないが、分散表現は教師あり物体検知などで使われ、埋め込みベクトルを学習させる方法である。

# Attention
　Attention に関しては、多数の分かりやすい記事があるので、大雑把に説明する。
　Attention は辞書オブジェクトと呼ばれている。例えば、Key を[1,2,3]とし Key に対応する要素（Value）を [a,b,c] とする。辞書は

　辞書={1 : a , 2 : b, 3 : c} 

みたいになる。Query とは、検索したい Key なので、例えば、Query を 1 とすると

　辞書[1] = a

となり、1 の要素（Value）a が取り出せる。もちろん、Query は Key に含まれなければ Value は取り出せない。

　Attention（正確にはDot Product Attention）は、Key , Query , Value と呼ばれるLayer がある。AI のなかでは、Key と Query は一致しない。したがって、Key と Query の内積、つまり類似度を計算しSoftmax関数で正規化する。これを、Attentoin Weightと呼ばれる。Attentoin Weight に Value を作用させることで値を取り出す。

 単純な例を考えてみる。Key を

```math
K=
\begin{pmatrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1 \\
\end{pmatrix}
```
とし対応する Value を

```math
V=
\begin{pmatrix}
a\\
b\\
c\\
\end{pmatrix}
```
とする。つまり、Key の$(1\ \ 0\ \ 0)$は Value の $a$ に対応し、同様に、$(0\ \ 1\ \ 0)$は $b$ 、$(0\ \ 0\ \ 1)$は $c$ に対応する。
　Queryが

```math
Q=
\begin{pmatrix}
0.8 & 0.2 & 0.0
\end{pmatrix}
```
だったとする。この Query は、Key の$(1\ \ 0\ \ 0)$に類似しているため、Attentionを計算すると Value の中の $a$ が取り出せそうである。
　Attention weight を計算してみると（簡単なためSoftmax正規化は行わない）

```math
W=QK^T=\begin{pmatrix}
0.8 \\
0.2 \\
0.0 \\
\end{pmatrix}
```
Attention は

```math
\mbox{attn} = W^TV = 0.8*a+0.2*b
```
と求まり、a に近い値が取り出せる（もちろん a,b,c の大きさにも依るが）。

　実際のAIでは、 Key , Query , Value の値は学習により決定する。
　
　Attentionは、AIがどこを見て判断しているか説明（解釈）するために有用だと考えられている。例えば、画像分類を考え、Value を画像の値（または、畳み込みによって得られた特徴量）とすると、Attention weight と Value の計算は、画像に分類に寄与する部分だけ取り出すことを意味するだろう。Attention weight は、Softmax関数で正規化されているので、Attention weight が１に近い要素は、分類に寄与する要素と考えることができ、逆に0に近い要素は分類に寄与しない要素だと考えることができる。

　この記事では、詳細に説明はしないが、CNN + Attentionのネットワークを使い、犬・猫分類を行い、Attention weight をプロットすると以下の画像ようになる。何となく、耳や鼻、目などに注目してそうである。

![_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/4f3f8323-d94e-b154-fd3a-0bc037ba6c0b.png)
![_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/08ea9ed0-4b58-6cc8-2934-28cffe106319.png)



# Slot attention
　
　Slot attentionのアルゴリズムは以下の図である。以下の図は、論文から引用している。
![スクリーンショット 2021-07-19 184235.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/5db3e569-fe1b-db5a-5299-43890a7b8b44.png)

　最初に、画像をCNNに入力して、畳み込み後のサイズ$W,H$として、特徴量 $\mathrm{R}^{W\times H\times D_{input},}$を出力させる。特徴量を平坦化させ、特徴マップ $\mathrm{R}^{N\times D_{input},}$を Slot Attentionの入力とする。

　Slotは、ガウス分布$\mathcal{N}(\mu,\mbox{diag}(\sigma))$から$k$個サンプルする。また、$\mu\in\mathrm{R}^{D_{slot}}$と$\sigma\in\mathrm{R}^{D_{slot}}$は平均・分散である。ガウス分布のパラメータ$\mu,\sigma$も学習させる。
　
　$Q,K,V$をQuery・Key・Valueとする。Softmax Temperature $T=\sqrt{D_{slot}}$として、attentionをQueryとKeyを使い

```math
\begin{align}
\mbox{attn}_{i,j}&=\mbox{softmax}(M)_{i,j} =\frac{\exp\{M_{i,j}\}}{\sum_l \exp\{M_{i,l}\}} \\ 

M&=\frac{1}{\sqrt{D_{slot}}}K(\mbox{inputs})Q^T(\mbox{slots}) \in \mathrm{R}^{N\times k}
\end{align}
```
とする。Softmax Temperature は内積が大きくならないようにする。Attention Weightは、正規化を行い

```math
\begin{align}
W_{i,j}=\frac{\mbox{attn}_{i,j}}{\sum_l \mbox{attn}_{i,l}} 
\end{align}
```
Slotは、Attention Weight と Value の積とする。

```math
\begin{align}
\mbox{slot}=W^T V(\mbox{inputs}) \in \mathrm{R}^{k\times D_{slot} }
\end{align}
```

　Slotの値を（ゲート付き）再帰ニューラルネットワーク(GRU)を使い、Slotを更新する。

　Slot Attentionの意味は、$k$個のSlotが、入力された特徴マップが物体なのか空なのか記述する。Attention のKeyとValueは特徴マップを入力とするが、QueryはSlotを入力とする。Queryを反復させることでSlotは、入力された特徴マップの1部を解釈できるようになり、物体中心表現をもつ潜在表現を獲得することができる（らしい）。

　各スロットは、物体の一部のみの情報を保持しており、それらをまとめてデコードすれば元の画像に復元することができる。


# 集合予測に関する簡単な説明

　今回の集合予測では、画像内に写っている複数の物体の情報を予測する。CLEVR dataset においては、物体の有無（True, False）、サイズ（small, large）、物性（metal, rubber）、形状（cube, sphere, cylinder）、色（gray, blue, brown, yellow, red, green, purple, cyan）、位置（x, y, z）を予測する。
　
　上記のような集合予測の機械学習アルゴリズムは、置換不変（permutation invariance）または置換同変（permutation equivariance）でなければならない。

　一般的な機械学習アルゴリズムは、入力データが配列となっており、その配列を入れ替えれば予測結果は変わる。例えば、画像や時系列データは、入力データの配列を入れ替えるとデータの意味が変わるので、置換不変・置換同変である必要がなく、一般的な機械学習アルゴリズムが使用できる。

　集合タイプのデータは、入力データの配列を入れ替えてもデータの意味が変わらないので、入力データを変えても予測結果が変わらないようなアルゴリズム、つまり、置換不変および置換同変なアルゴリズムが必要である。

　例えば、AIを$f$、集合タイプの入力データを$[A,B,C]$、出力を$\alpha$とすると、置換不変なAIは、

```math
\begin{align}
[A,B,C] &\xrightarrow[f]{} [\alpha] \\
[A,C,B] &\xrightarrow[f]{} [\alpha] \\
& \vdots  \\
[C,B,A] &\xrightarrow[f]{} [\alpha] \\
\end{align}
```
を満たす必要があり、入力データ$[A,B,C]$を入れ替えても出力結果は変わらない。
　上記の関係は、関数 $f:\mathrm{R}^{M\times D_1} \rightarrow \mathrm{R}^{M\times D_2}  $ として、置換行列を$\pi \in \mathrm{R}^{M\times M}$とすれば、

```math
\begin{align}
f(\pi x) = f(x)
\end{align}
```
と書ける。

　また、AIを$f$、集合タイプの入力データを$[A,B,C]$、出力を$[\alpha,\beta,\gamma ]$とすると、置換同変なAIは、

```math
\begin{align}
[A,B,C] &\xrightarrow[f]{} [\alpha,\beta,\gamma ] \\
[A,C,B] &\xrightarrow[f]{} [\alpha,\gamma,\beta ] \\
& \vdots  \\
[C,B,A] &\xrightarrow[f]{} [\gamma,\beta,\alpha ] \\
\end{align}
```
を満たす必要があり、入力データ$[A,B,C]$を入れ替えたら、出力結果$[\alpha,\beta,\gamma ]$も入れ替わる。
　上記の関係は、関数 $f:\mathrm{R}^{M\times D_1} \rightarrow \mathrm{R}^{M\times D_2} $ として、置換行列を$\pi \in \mathrm{R}^{M\times M}$とすれば、

```math
\begin{align}
f(\pi x) = \pi f(x)
\end{align}
```
と書ける。
　Slot Attention は置換同変なアルゴリズムであり、以下の命題が成立する。

***
###命題 
　$\mbox{input} \in \mathrm{R}^{N\times D_{input}}$ と $\mbox{slots}\in \mathrm{R}^{K\times D_{slots}}$ 、そして、Slot Attention の出力を $\mbox{Slot Attention}(\mbox{inputs},\mbox{slots}) \in \mathrm{R}^{K\times D_{slots}}$ とする。

　$\mbox{input}$ に対する置換行列を $\pi_i\in\mathrm{R}^{N\times N}$ 、$\mbox{slots}$ に対する置換行列を $\pi_s\in\mathrm{R}^{K\times K}$ とする。

　このとき、

```math
\begin{align}
\mbox{Slot Attention}(\pi_i \cdot \mbox{inputs},\pi_s\cdot\mbox{slots}) &= \pi_s\cdot\mbox{Slot Attention}(\mbox{inputs},\mbox{slots}) 
\end{align}
```
が成立する。
***

　Slot attention のアルゴリズムに含まれる Key,Quary,Value および LayerNorm そしてGRU は、入力（$\mbox{input}$および$\mbox{slots}$）に対して線形な Layer またはアルゴリズムなので置換同変である。
　Attention は、

```math
\begin{align}
\mbox{softmax}(\pi_s\cdot\pi_i \cdot  M)_{k,l} &=\frac{\exp\{(\pi_s\cdot\pi_i \cdot M)_{k,l}\}}{\sum_j \exp\{(\pi_s\cdot\pi_i \cdot  M)_{k,j}\}} \\
& = \frac{\exp\{ M_{\pi_i(k),\pi_s(l)}\}}{\sum_j \exp\{M_{\pi_i(k),\pi_s(j)}\}} \\
& = \mbox{softmax} (M)_{\pi_i(k),\pi_s(l)}
\end{align}
```
となるので、置換同変である。
　Attention Weightは、置換同変であり

```math
\begin{align}
W_{\pi_i(k),\pi_s(l)} =\frac{ \mbox{softmax} (M)_{\pi_i(k),\pi_s(l)}}{\sum_j \mbox{softmax} (M)_{\pi_i(k),\pi_s(j)}} 
\end{align}
```
Slotは、Attention Weight と Value の積であり

```math
\begin{align}
\mbox{slot}_{\pi_s(l)}=\sum_k W_{\pi_i(k),\pi_s(l)} V(\mbox{inputs})_{\pi_i(k)}
\end{align}
```
添え字 $k$ について足し上げるので、$\mbox{input}$ に対する置換行列 $\pi_i$ に関して置換不変、$\mbox{slots}$ に対する置換行列$\pi_s$に関して置換同変である。
 
　すべてのステップにおいて置換同変なので、命題の

```math
\begin{align}
\mbox{Slot Attention}(\pi_i \cdot \mbox{inputs},\pi_s\cdot\mbox{slots}) &= \pi_s\cdot\mbox{Slot Attention}(\mbox{inputs},\mbox{slots}) 
\end{align}
```
が成立する。

　画像内に写っている物体の情報を入れ替えたら、出力結果も入れ替わってほしい。Slot の役割は、画像に写っている物体の一部の情報を保持する役割を持っている。写っている物体の情報を入れ替えるとは、Slot を入れ替えることである。Slot Attention は、Slot を入れ替えたら出力結果も入れ替わるアルゴリズムになっている。


# 物体検知および集合予測のネットワーク構成


　物体検知(Object Discovery)のネットワークの構成について説明する。図は論文から引用した。

![スクリーンショット 2021-07-30 115039.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/b34fa2f2-bf88-c524-c9b8-1ccde4190fd3.png)

　物体検知は、エンコーダー・デコーダーからなり、さらにエンコーダーは2つのネットワークからなる。
(1). CNNにより、知覚特徴量を抽出する。位置情報を把握するために、CNNから得られた特徴量にpositional embedding を行う。

(2). Slot Attention により物体中心表現を獲得する。

　デコーダに関しては、Slot から二次元グリッドを作成する。(tf.tileを使い(1,1) -> (width, height)にする。）次にCNNを使いデコードして、最終的な画像出力サイズを、Slotごとに$W\times H\times 4$とする。この出力をRGBの画像$W\times H\times 3$とmask $W\times H\times 1$に分解する。msak は、Softmax関数を使い正規化する。各Slotまとめて mask とRGBの画像を結合して再構成画像を出力させる。誤差関数は、自乗誤差を使う。

　次に集合予測のネットワークの構成について説明する。図は論文から引用した。
![スクリーンショット 2021-07-30 115054.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/bff3a315-b93b-077e-1078-242f02c9f921.png)



　最初の部分は、物体検知と同じエンコーダーを用いる。エンコーダーの次に分類用のニューラルネットを追加する。ただし出力次元は、Slot数を$k$として $\mbox{batch}\times k\times \mbox{set classes}$ とする。

　誤差関数は、hangarian loss を使う。hangarian loss は、予測集合 $\hat{Y}=[\hat{y}_1,\hat{y}_2,\ldots,\hat{y}_n ]$とtarget（正解） 集合 $Y=[{y}_1,{y}_2,\ldots,{y}_n ]$として


```math
\begin{align}
\mathcal{L}_{hun}(\hat{Y},Y) = \min_{\pi \in \Pi} \|\hat{y}_i - y_{\pi(i)}  \|
\end{align}
```
である。$\pi$は置換を意味する。


# 教師無し物体検知の結果
　バッチサイズは16、Slot の数は7、再帰ニューラルネットの繰り返し数は3として学習させた。学習ステップ数は500000であり、論文と比べると（論文のバッチサイズは64？）バッチサイズが小さいので、学習ステップ数が足りない結果になったと考えられる。計算時間は約5日かかった。

　学習率の変化は、指数関数的減衰させた。学習率は0.0004であるが、10000ステップまで Warm-up させる。

```php5
# 学習率の変化
def lr_scheduling(base_learning_rate,global_step,warmup_steps,decay_rate,decay_steps):
  # Learning rate warm-up 
  if global_step < warmup_steps:
    learning_rate = base_learning_rate * tf.cast(global_step, tf.float32) / tf.cast(warmup_steps, tf.float32)
  else:
    learning_rate = base_learning_rate
  # Learning rate の減衰
  learning_rate = learning_rate * (decay_rate ** (
        tf.cast(global_step, tf.float32) / tf.cast(decay_steps, tf.float32)))  
  return learning_rate.numpy()
```

　以下の図を確認すると、誤差が順調に下がっていることが分かる。
![loss_history_object_discovery.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/edc39ed6-8beb-14de-02f0-622532bcc32a.jpeg)

　物体検知の結果を見ると、Slot ごとに物体を検知できていることが確認でき、物体がないところは空になるように記述されている。

![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/88e58877-b423-0126-c8a0-e8cc27b49217.png)

　次に、デコーダの出力画像を見てみる。slotごとに$W\times H\times 4$が出力され、この出力をRGBの画像$W\times H\times 3$ と mask $W\times H\times 1$に分解されている。概ねSlot ごとに一部の情報が再構成され、mask もそれに反応していることが分かる。図の mask は、都合上（カラーbarを出すため）、最小値が 0 で最大値が 1 になるように正規化されている。

![20_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/cf6fb9f9-3648-03d0-13ff-590d5fe41069.png)

　最後に、Queryを反復させることでslotは、入力された特徴マップの1部を解釈できるようになることを確認する。
　下図の上から、再帰ニューラルネットの繰り返しごとに mask を行った図である。繰り返し数が1の場合は、各Slotにおいて同じ物体をmaskしているSlotがある。しかし、繰り返し数が3になると、Slot ごとに物体を検知し、物体がないところは空になっている。つまり、Queryを反復させることでSlotは、入力された特徴マップの1部を解釈できるようになっていると言える。

![20_iterations_plot_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/56d6bec5-1c21-e1ae-d389-70539c9ec895.png)


学習が足りなかったせいか、上手くいっていない例もある。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/396cfe3e-9024-c734-0750-63d751135047.png)
![4_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/49a71cf9-38a7-fe01-e191-91258a69f229.png)
![4_iterations_plot_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/326e2d98-1c80-c52b-e4dd-497751ba1b1a.png)



# 集合予測の結果
　バッチサイズは16、Slot の数は7、再帰ニューラルネットの繰り返し数は3として学習させた。教師無し物体検知で学習させたエンコーダを転移させて学習を実行した。計算時間は約1日かかった。
　
　以下の図を確認すると、誤差が順調に下がっていることが分かる。
![loss_history_set_prediction.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/b9f9e2a3-5f7d-61f3-746a-140e7323a1fc.jpeg)

　以下の図は、学習ステップごとの平均適合率をプロットしたものである。図の[inf,1,0.5,0.25,0.125]は、予測された物体と正解の物体との距離の閾値である。この閾値以内かつ、予測結果のサイズ・物性・形状・色が正解データと一致するなら正解とする。

![AP_score_history.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/2a1e32d8-5214-22ff-2685-b2d9ea90330b.jpeg)

　以下の図は、検証データの平均適合率である。
![score.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521272/5b03223e-8760-367c-8dff-826af58a874f.jpeg)

論文と比べると値が低いので、もう少し学習が必要である。

# 最後に
　今回の記事で使ったデータセットは、物体がはっきりしたデータセットである。物体がはっきりしていないような物体（物体とは言えない。。。地形など）を、検知できるか試す必要がある。