Multi LSTM

# Encouraging LSTMs to Anticipate Actions Very Early　
インターンで行動予測を行うため，サーベイを行なった   
論文リンクは，以下  
https://arxiv.org/pdf/1703.07023.pdf  
実装コードは，以下  
https://github.com/mangalutsav/Multi-Stage-LSTM-for-Action-Anticipation  
認識違いもある可能性があるので100%信用はしないでいただきたいです．

# 概要
モチベーションとして，CV系の応用が進む中で，行動予測の需要が高まっている．  
自動運転などのに用いるためにもas early as possibleな検知が必要である

本論文では，`multi-stage LSTM architecture`という新規手法を提案する．  



**提案手法の特徴としては，以下の二点**   
・`context aware`(大域的)/`action-aware`(領域的)featuresを用いること  
・早期のクラス分類を実現する新たなLoss関数の定義

# モデル
モデルの概略図は以下．  
特徴量抽出器は，VGG(pretrained Imagenet)をバックボーンに使用し，Submodelを二つ利用している．  
特徴抽出器の学習は，各Submodelを個別に学習させた方が，end-to-endの学習より良いらしい  

>In practice, we found that training the entire model in an end-to-end　manner did not yield a significant improvement over training only the two sub-models.>`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287291/7194b72f-549e-c113-18f0-393276b39635.png)

# submodel
## 1,Context-aware
VGG16の出力から，全結合層を繰り返し，入力Imageの大域的な特徴量を得るSubmodel
## 2, Action-aware
context(大域的)な特徴量を抽出するモデルは，行動そのものの認識には向いていない．  
背景に頑健な特徴量を抽出するためによく用いられるように，領域的な（行動そのものに焦点を当てたような）特徴量抽出をするのをも目的とした，Submodel．  

### CAMs
ここで，行動に焦点を当てる方法について紹介する．  
本論文では，Classe Activation Map(CAMs)を参考にしており，以下の式を参照とする．ここで，各変数は，  
*f* :l番目の特徴量マップの(x,y)に対応する出力  
*w* : クラスkと接続する重み  
*M* :クラスkのsoftmax前のスコア

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287291/c0e7a169-ff4f-1f78-75c0-d7b29abdaea1.png)
<img src="/attachment/5e995bc53a5ba50047bc44df" width="300">


やっていることは，分母がないが,Global Average Pooling後のFC層の重みを使用して，特徴量を作成するのと同じ，Pooloing時の実装はGlobalAveragePoolingで行う．

## 学習
今回は，End-to-end学習ではないので，まずそれぞれのSubmodelを学習させる．  
学習では，それぞれのモデルを通してSoftmaxで算出したクラスラベルとのLossをどちらも`Cross-entoropy`を用いて算出する．  

これらで得た二つの特徴量から後段のLSTMへの入力を作成する．

# LSTMへの入力特徴量の作成  
特徴量の結合を行う．  
おそらく同一サイズ(1×4096)に落とし込むが，コード内では，色々間違っているので注意  
（そのままやるとおそらく全結合の次元が合わない）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287291/aad8b805-5e5e-142e-7d60-4c9bafd5d46e.png)


### context aware feature
1. 上図の①の各クラスに全結合する直前の層の出力・特徴量(a)を得る．

### action aware feature
1. ②でGlobal Average Pooling前の特徴量と，その後のFC層の重みを利用して，n×nの特徴量(b)を作成．
2. ③において，(b)とcontext-awareの特徴量(c)(n×n×c)を掛け合わせ，  
    action-awareに注視した特徴量(d)(n×n×c)を作成
4. (d)を全結合に通して，(a)と同次元の特徴量(e)を得る．<-(*)
  
  
以上の (a),(e)を，LSTMの入力とするが，コードを見た方が早いので，そちらを参照されたい．  
ただ，コードは，(*)が間違っている可能性ある．

# Multi-LSTM model

1. 図より，先に，(a)をLSTMに通す  
2. LSTMの出力と(e)をconcatして，二段目のLSTMに通す

以上で得られた出力を以下のLOSS関数を使用して，学習する．



# Loss 関数
本論文での，もう一つの特徴がLOSS関数である．定義は，以下  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287291/0f837720-4b34-4f8b-0573-30c8d2a11eaa.png)



y:true label  
y':prediceted label  
N: action classes   
T:number of frames


このLOSS関数のモチベーションは，以下の二点  
・出来るだけ早い段階で正解クラスに関する結果で高いスコアを出したい  
・高いジャンプや，ランニングなどの様々なバリエーションの行動に対する曖昧さを早期段階に説明したい．  

そのため，  
・偽陰性に対しては，常に厳しめの評価  
・偽陽性に対しては，時間が経つにつれて線形増加するような評価  
方式をとっている．


# 結論
short-termのAction-Predictionでは，  
評価に，UCF101のようなデータセット(13320video，101action_label)のようなものを用いており．  

学習は，各Label（のみしか登場しない）動画を読ませて，動画の初期段階に，そのラベルを推定できるようなモデルになるようにLOSSを定めて，進めているような気がする．  
動画の最初をみてそのラベルを推定するという段階なのかと思う．  

動画中でラベルが変わるようなものに対しても，対応できることは一般的には知られている感じでしたら認識違いなのでご教授いただきたい．