動画の同じ動作をAlignできる自己教師あり学習 Temporal Cycle-Consistent Learning(TCC)の論文解説 ! 

sht47です。[ツイッター](https://twitter.com/sht_47)で画像、動画認識の記事などを紹介していますので、画像、動画認識のことをもっと知りたい方などは [@sht_47](https://twitter.com/sht_47)をご覧ください！

# 期待の自己教師あり学習「Temporal Cycle-Consistent Learning」を解説!
2019年の8月に**Google**からすごい論文が出ました。Temporal Cycle-Consistent Learningというタイトルで下のGif動画のように投球動作において、足をあげるタイミング、リリースのタイミング、蹴り上げた足を着地するタイミングを**教師なしで揃える**ことが可能です。他にもゴルフのスイングやベンチプレス、懸垂といった他の動作においても同様のことが可能です。 

今後データセットが充実してくると、スポーツのハイライト動画や指導などの実応用が期待されます。それでは**期待の自己教師あり学習手法Temporal Cycle-Consistent Learning**を見ていきましょう。

![](https://media.giphy.com/media/luvOIXJBOT8A2rAjYu/giphy.gif) 
>  [Image Credit](https://ai.googleblog.com/2019/08/video-understanding-using-temporal.html) 


**本記事の流れ:**

- **忙しい方へ**
- **TCCの解説**
- **TCCの実験結果**
- **まとめと所感**
- **参考**

> 原論文: ["Temporal Cycle-Consistency Learning" (2019 Aug)](https://arxiv.org/abs/1904.07846) 
> 公式実装 : [Tensorflow](https://github.com/google-research/google-research/tree/master/tcc) 

## 0. 忙しい方へ 
- 2つの異なる動画に対して、**「時間方向で同じActionを一致させる」**新たな自己教師あり学習を提案したよ 
- 教師なしで、動画の中から**同じイベントを時間方向で一致**させることができるようになったよ 
- ほぼ全てのタスクでSOTAを出したよ 
- 従来の自己教師あり学習の手法TCNと組み合わせることで、さらに性能向上が見込めるよ
![Screen Shot 2021-01-01 at 15.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255540/8aa24a79-f0e6-09db-026e-d2976fea077b.png)

> [Image Credit](https://arxiv.org/pdf/1904.07846.pdf) 

## 1. TCCの解説 
Tempooral Cycle-Consistent Learning(TCC)で重要な箇所は以下の3つです。

1. **Cycle-Consistent Representation Learning**とは
2. **Cycle-Back Classification Loss**と**Cycle-Back Regression Loss**
3. モデルの学習の流れ

それぞれについて、見ていきましょう。
### 1.0 背景 
動画の理解は近年注目されている分野です。しかし、動画は状態が絶え間なく変わることや1フレームごとにアノテーションが必要なため、まだまだできないことが多いです。 

しかし、ビデオの理解のために、大量の画像とラベルのセットが必要かどうかは分かっていません。そこで、今回の論文では2020年に注目された自己教師あり学習の枠組みで、時間方向の理解につながる特徴量を取得することに成功しています。 

また、動画の理解には同じ動作をするフレーム同士を推測することが重要です。これができると、同じ動作が割り当てられているフレームを同じ特徴量空間に持っていくだけで済む為、問題が簡単になります。 

ただ、上記の実現には、データセットの大量のラベル付けが難しく、同じ物体を複数のカメラから同時に撮ることで仮想的に実現していますが、全ての動作を複数のカメラで取得することは難しく、現状Actionのバリエーションが少なく、現実世界と離れており、実用的でありません。

この問題を解決するために、この論文は画像ごとのラベルがない(教師なし)データセットに対して、Cycle Consistentという考え方を導入し、自己教師あり学習の枠組みでフレーム同士のこの問題を解決しています。 

### 1.1 モデルの入力 
#### 1.1.1 入力画像(Pouring Dataset)
この論文では、2つのデータセットを用いて実験しています! まず、Pouring Datasetについて紹介します。
あるコップをの中の液体を別のコップに移すという作業の動画が、70個含まれています。
![](https://media.giphy.com/media/1Cxn2e5JUuCF11JAGi/giphy.gif)
>[Image Credit](https://arxiv.org/pdf/1704.06888.pdf) 

#### 1.1.2 入力画像(Penn Action Dataset)

もう一つのデータセットは**Penn Action Dataset**です。
こちらは、Pennsylvania 大学によって2013年に公開された動画のAction Calssificationのデータセットです。
データセットの中には、約2300個のVideoがあり、1つのVideoに平均70枚のImageが含まれています。

その入力に対して、下に示す15個のActionクラス、Pose EstimationやObject Detection用の13個の関節の位置やbouding boxがラベルとなっています。

####<details><summary>15個のAction一覧</summary> <div>
- (1) 野球のピッチング (167)
- (2) 野球のバッティング (173) 
- (3) ベンチプレス (140)
- (4) ボウリング (220) 
- (5) クリーン・アンド・ジャーク(ウエイトトレーニングの一つ) (88) 
- (6) ゴルフのスイング (166) 
- (7) 縄跳び (82) 
- (8) スタージャンプ (112) 
- (9) 懸垂 (199) 
- (10) 腕立て伏せ (211) 
- (11) 腹筋 (100)
- (12) スクワット (231) 
- (13) ギターをジャンと弾く (94) 
- (14) テニスのフォアハンド (157)
- (15) テニスのサーブ (186) 
actionの後の()はvideo数を表しています。 
</div></details>

下にデータセットの一例を示します。(Actionは「baseball_pitching」で、ちなみに投手はWashington Nationalsのストラスバーグ投手です!!!)
![](https://media.giphy.com/media/PsfTjGeDggTW8QhrEF/giphy.gif) 
> [Image Credit](http://dreamdragon.github.io/PennAction/) 

#### 1.1.3 モデルの入力
モデルに入力する際には、動画からFPSを設定し切り出した画像列に対して、20フレームをRandomにサンプリングし、また、224x224にResizeして、入力としています。このようにして、入力のTensor **(B, 20, 3, 224, 224)**が得られます。

### 1.2 Cycle-Consistent Representation Learningとは
次にこの論文の核となる、Cycle Consistent Representation Learningについて説明します。この手法は自己教師あり(Self-Supervised)学習なので、正解データは必要としていません。

それでは、どうやって動画におけるActionの表現を学習するのでしょうか? 
![Screen Shot 2021-01-01 at 15.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255540/8aa24a79-f0e6-09db-026e-d2976fea077b.png)
> [Image Credit](https://arxiv.org/pdf/1904.07846.pdf) 

上の図で説明すると分かりやすいのですが、まずResNet等のImageNetで学習済みのCNNに画像のSequenceを入れます。その中間層を取り出してGAPをする(実際はもう少し複雑)と、高次元のFeatureのSequence(実際には128次元)を得ることができます。 

まず、下側の青色の時系列の中の、黒色のFeatureに注目します。
今回黒色のFeatureと最近傍のFeatureを、緑色の時系列から探します。 
そうして見つけた緑色のFeatureに対して、もう一度最近傍のFeatureを青色の時系列から探します。 そうすると、元の黒色のFeatureと一致しました。これを**Cycle Consistent**と筆者は名付けています。 

次に、下側の青色の時系列からある赤色のFeatureに注目します。
今回赤色のFeatureと最近傍のFeatureを、緑色の時系列から探します。 
そうして見つけた緑色のFeatureに対して、もう一度最近傍のFeatureを青色の時系列から探します。 そうすると、今回は元の赤色のFeatureと一致しません。これを**Cycle Consistentでない**と言います。

今回、このCycle Consistentを用いて、全てのSequenceにおいて、Cycle Consistentになる画像数を最大化するように、パラメタを更新するのがCycle-Consistent Representation Learningです。 
一言でまとめると、二つの類似した画像列の同じ動作を、時間方向に一致させるように学習しています。 

### 1.3 2つのLoss関数(**Cycle-Back Classification Loss**と**Cycle-Back Regression Loss**)
#### 1.3.1 **Cycle-Back Classification Loss**
![Screen Shot 2021-01-01 at 15.59.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255540/98298d2f-4c39-5502-6b43-48c5626c4e0f.png)
> [Image Credit](https://arxiv.org/pdf/1904.07846.pdf) 
 
まず、2つの動画を用意します。
そのうち、それぞれの画像列(N枚の画像列S, M枚の画像列T)を以下のように表します

```math
S = s_1, ..., s_N \\
T = t_1, ..., t_M 
```

次に、 今回Encoderを使って高次元の特徴量ベクトルに持っていくので、 Encoderを$\phi$で表します。 

```math
u_i = \phi(s_i; \theta) \\
v_i = \phi(t_i; \theta)
```

ここで、Sのi番目の高次元特徴量ベクトル$u_i$の最近傍の点$\tilde{v}$は$v_1$から$v_M$までの足し合わせで書くと 

```math 
\tilde{v_i} =\sum_j^M*\alpha_j v_j \\
\alpha_j = \frac
{e^{-||u_i-v_j||^2}}{\sum_k^M e^{-||u_i-v_j||^2}} 
```

のようになります。 ここで$u_i$と$v_j$の距離はCosine類似度またはL2ノルムを用いて求めています。 

さらにえられた$\tilde{v}$の最近傍の点を上の方法と同様に$U$から求める

```math 
\hat{y_i} =\sum_k^N*\beta_k u_k \\
\beta_k = \frac
{e^{-||\tilde{v_i}-u_k||^2}}{\sum_k^N e^{-||\tilde{v_i}-u_k||^2}} 
```

$y_i$はi番目のみ1のOne-Hotベクトルとなっており、$\hat{y_i}$がi番目の予測をするように学習させています。 

```math 
L_{cbc} = -\sum_i^Ny_ilog(\hat{y_i}) 
```


#### 1.3.2 **Cycle-Back Regression Loss**
上の方法だと、$\hat{y_i}$の予測がiからどれだけずれているかを捉えることができないので、 平均がi近傍、分散が小さくなるようにすることを目的にRegression Lossを定義しています。 


```math 
L_{cbr} =\frac
{-|i-\mu|^2} {\sigma^2}+{\lambda} log(\sigma)\\
\mu = \sum_k^N \beta_k *k \\ 
\sigma^2=\sum_k^N\beta_k*(k-\mu)^2
```

### 1.4 モデルの概要 
モデルは至って、シンプルです。 
まず、ResNet50を用いてGAPの直前の層を取り出します。次に、その取り出した層に対して3D Convを2層ほど通します。その後Global Max Pooling, FCを取り出し、Embedding Vectorを手に入れることができます. 
> ここでは簡単のため、サンプリングした画像の直前15Frame目の画像を加えるContextという処理を省いて記載しています。 また、3D ConvやFCも実際には複数層が含まれています。

![Material_TCC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255540/d7cab1a9-981a-4caf-0924-0923996c41d6.png)

## 2. TCCの実験結果 
### 2.1 Evaluation Metrics 
今回の実験では3つの評価指標を用いています。 
#### 2.1.1 Phase Classification Accuracy 
フレームごとにActionのなかの、どの動作の最中かを予測します。 
今回は学習したEmbedding + SVMを用いて予測しています。 

#### 2.1.2 Phase Progression 
動作の推移をどの程度予測できているかを計測する指標です。 

#### 2.1.3 Kendall's Tau 
Validationのデータセットの、全ての動画のペアに、一方の動画から2つのFrameペアをとり、それぞれのembedding最近傍からもう一方の対応するFrameを求めて順番があっているかどうかを求めます。 
単調なFrameがないという過程の元で作られており、今回はそれを満たしているそうです。 

####<details><summary>それぞれのActionにおけるKey Event一覧</summary> <div>
![Screen Shot 2021-01-01 at 19.18.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255540/19cf01ef-799c-0944-f99e-ca94a5c83f05.png)
> [Image Credit](https://arxiv.org/pdf/1904.07846.pdf) 
</div></details>

### 2.2 Embeddingの学習 
一枚の画像のembeddingを、t-SNEを用いて2次元で可視化したグラフになります。 
個々のポイントは、画像列の中の1枚の画像に対応しています。 
それぞれの動画の同じ動作が近くに位置しており、動作の表現が学習できていることが分かります。 
![](https://media.giphy.com/media/tbTsEcw04rxYEu7nqt/giphy.gif) 
> [Image Credit](https://ai.googleblog.com/2019/08/video-understanding-using-temporal.html) 
### 2.3 実験結果 
まず、Action Phase Classificationについてです。 Self-Supervised Learningで学習したEmbeddingの有効性を調べるため、少ないラベルデータ(10%, 50%, 100%)での比較も行なっています。 

TCC単独またはSaLとTCNという自己教師あり学習の手法と組み合わせることで、SOTAのTCNと比べて1%~3%ほどの性能向上が見られました。 
![Screen Shot 2021-01-01 at 18.36.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255540/8e1d1669-de00-dcbf-c684-876071f33a02.png)
> [Image Credit](https://arxiv.org/pdf/1904.07846.pdf) 

次に、Phase ProgressionとKendalls's TauのMetricについてです。 ResNet50においてImageNetのPre-Trainingを用いないScratchから組んだ場合(Scratch)とImageNetのPre-Trainingありの場合(Fine-Tuning)を比較しています。 
どちらにおいても、TCCを組み合わせることでベストな結果が得られています。 
![Screen Shot 2021-01-01 at 18.38.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255540/29f4c5be-ebff-af6a-d7d9-52f35f75f577.png) 
> [Image Credit](https://arxiv.org/pdf/1904.07846.pdf) 

最後にFew Show Action Classificationの結果です。 この結果は**Self-Supervised Learningの大きな可能性や有用性**を示しており、**1枚のラベル**でGolf Swingを自己教師あり学習で学習した際のClassification Accuracyは、**50枚のラベル**をSupervised Learningで学習した際と同等の結果を示すというものです。Supervised Learningでラベルが少ない際に、Self-Supervsied Learningを組み合わせることで、Few Show Learningができることや、生の動画データから教師あり学習と同様の有用な情報を取れる可能性があることを示しています。
![Screen Shot 2021-01-01 at 18.49.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255540/3363c679-a738-b1c5-0969-91c61f30edae.png)
> [Image Credit](https://arxiv.org/pdf/1904.07846.pdf) 

### さらなる応用先 
特定の動作のみを大量の動画から引き出すことができるそうです。そのため、画像を入力として類似画像をYouTubeから検索すると言ったApplicationがGoogleからそのうちでてくるかもしれません。
![Screen Shot 2021-01-01 at 19.02.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255540/c574d4eb-e98c-2bc0-210e-8c650e5784d9.png)
> [Image Credit](https://arxiv.org/pdf/1904.07846.pdf) 

Embeddingの最近傍の点への距離を調べることでAnomaly Detectionへの応用が示されています。介護や監視といった分野での応用も期待できそうです。  
![Screen Shot 2021-01-01 at 19.00.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255540/b1d4457e-136b-58ac-2b0d-69378a2800c4.png)
> [Image Credit](https://arxiv.org/pdf/1904.07846.pdf) 

## 3. まとめと所感 
動画認識におけるすごいリープフロッグな論文であるように思いました。
しかし、他のデータセットでも同様の結果が出るのか、Embeddingが128次元で十分かどうかの検討、さらには異なる類似したアクション同士でのEmbedding Spaceの比較等まだまだ、研究の余地があるように思えます。今後も注目して読んでいきたいです。

面白い関連論文や質問等あれば、コメントまでよろしくお願いいたします。 

**読んで少しでも何か学べたと思えたら 「いいね」 や 「コメント」 をもらえるとこれからの励みになります！よろしくお願いします！** 

## 4. 参考
[Google AI Blog](https://ai.googleblog.com/2019/08/video-understanding-using-temporal.html) 
この記事に衝撃を受けて読み始めました。 

[ミュンヘン工科大学のTCC解説記事](https://wiki.tum.de/display/dlma/Temporal+Cycle-Consistency+Learning) 
TensorflowとGoogleColabでの実装がありがたかったです。

[筆者ブログ](https://debidatta.github.io/tcc_interactive_paper/index.html)
論文に書かれていない情報が書かれており面白かったです。 

[Time Contrasive Learning(TCL)の原論文](https://arxiv.org/pdf/1704.06888.pdf) 
この論文も元となった論文で勉強になりました。 

[Penn Action Dataset](http://dreamdragon.github.io/PennAction/) 
動画でスポーツを扱えてめちゃくちゃ楽しいです。データセットを作ってくださり、ありがとうございます!