動画認識手法の紹介とキャプション生成手法Masked Transformerについての解説

はじめに

こんにちは、プロジェクト推進部の水船です。前の記事でもご紹介した先進技術WGでは今、動画分析を重要テーマとして調査しています。今回は2018年に提案された手法で少し古いですが、Masked Transformer [1]という動画キャプション生成モデルについての解説をしていきます。またそれに関連して、動画認識のための諸手法についてもざっくりと紹介します。Masked TransformerのPyTorch実装も公開しているのでご覧ください。

動画認識について

近年では、深層ニューラルネットワークが画像認識において非常に目覚ましい成果を出しています。しかし、我々人間は静的な一つの場面ではなく、動的で連続的な場面を元に学習しているはずです。ニューラルネットは、画像だけだと「どんな物体があるか」は分かっても、「どのような動きか」は学習できません。したがってロボティクスやゲームといった「動きのある」分野において、動画を元に学習させることは価値があると思われます。

しかしながら、動画を深層ニューラルネットワークの枠組みでモデル化するには、画像とは違った工夫が必要です。画像は縦×横の2次元で表現できます(RGB画像の場合はチャネル方向があるので厳密には3次元です)が、動画はさらに時間方向の3次元で表現される点が大きく異なります。この時間的な情報をどうモデル化するかが課題となってきます。

基本的な動画認識モジュール

「動き」をコンピューターに理解させる上で、もっとも単純なタスクが「行動認識」と呼ばれるタスクです。行動認識では動画を入力として、その行動ラベルを予測します。すなわち、画像分類の動画版と言えます。画像認識では2D Convolutionがよく用いられていますが、動画認識では3D Convolutionを用いることが多いです。時間 L よりも小さいカーネルサイズ d を設定する事で、時間方向に局所的な特徴を獲得できます。

図1 3D Convolutionの概略図 ([2] Fig 1より引用)

C3D [2]という手法が初期の代表的なネットワークになっています。この手法では3D Convolutionの設計方法(カーネルサイズの決め方など)を提案しましたが、依然としてOptical Flowも加えたTwo-Stream CNNに性能が劣っていました。また、当時学習データセットのサイズが不十分だったため、ニューラルネットの層も浅いものでした。そこでI3D [3]という手法はOptical Flowも入力に加え、大規模なデータセットで学習できる層の深いネットワークを提案しました。

図2 Two-Stream CNNの概略図([3] Fig 2より引用)

その後も様々な工夫がなされており、例えばS3D [4]という手法ではI3Dと比較して精度を保ちながら軽量なネットワークを提案しています。これらのネットワークはこれから説明する動画キャプション生成タスクでも使用されており、動画認識を行う上では重要になります。

動画キャプション生成とは

行動認識では動画を入力として行動ラベルを出力する一方、動画キャプション生成は動画を入力として、その説明文を生成するタスクです。行動ラベルと比べると説明文の方が情報量は多いですが、その分複雑性が増すので難しさがあります。私見ですが、人間の素晴らしさは言語を扱うところにあると考えています。視覚的情報(動画)から言語的な説明ができれば、コンピューターは動画をかなり理解できるようになっていると言えるのではないでしょうか。

動画キャプション生成タスクの中でも、一つの動画に対して一つのキャプションしか生成しない(Vanillaな)Video Captioningと、複数のイベントに対するキャプションを生成するDense Video Captioningという2つのタスクに分かれています。複数のキャプションを生成する理由としては、(長めの)動画には通常複数のイベントがあることが想定され、単一のキャプション生成だけではイベントの全てを捉えられないことが挙げられます。YouTubeにあるような動画は比較的長め(数分)の物が多いので、より現実的な動画をモデリングすることになります。

この Dense Video Captioning タスクでは、複数のキャプションとそれに対応するセグメントの出力が求められます。このセグメントというのは、そのキャプションがどこからどこまでのフレームに対応するかを示し、動画フレームの始点と終点で表現できます。これをわかりやすく示したのが下の図です。Dense Video Captioningでは一つの動画に対して複数のキャプションがアノテーションされており、それぞれにフレームの区間(赤線)が振られています。

図3 Dense Video Captioningの概略図 ([5] Fig 1より引用)

このタスクはICCV 2017に初めて提案されました [6]。ここで提案された動画キャプション生成モデルは、LSTMを元にしています。一方、今回紹介するMasked Transformer [1]という手法では2017年に提案されたTransformer [7]を利用した動画キャプション生成モデルとなっています。この手法では以下の新規性があります。

  • RNNではなくTransformerを用いたDense Video Captioning
  • キャプション生成と、セグメント提案に一貫性を持たせるため、End-to-Endでの学習を可能にする微分可能なマスク生成の枠組みを提案

後続の研究でもMasked Transformerがベンチマークとして取り上げられている印象です。例えば、VideoBERT [8]のキャプション生成タスクの比較対象・ベースネットワークとして扱われています。

詳細は次の章で説明しますが、今回Masked Transformerに着目した理由は、1つ目が論文中でLSTMからTransformerに変更することでキャプションの質の向上を示したから(図4)、2つ目が学習をシンプルに行えるからです。近年のTransformerが自然言語タスクで大きな成果を上げていることを踏まえると、今後はこのモデルを元にさらなる工夫を加えると良いのかなと思っています。

図4 ActivityNet Captionデータセットでの実験結果([1] Table 1より引用)

余談ですが、その他に個人的に面白いと思った研究としては[9, 10]があります。[9]では過去と未来両方の動画コンテクストを利用し、セグメント提案とキャプション生成を行います。Masked Transformerでは、セグメントの提案に過去と未来のコンテクストを暗黙的に利用していますが、キャプション生成には過去と未来のコンテクストを考慮していない点が大きく異なります。また、[10]では提案されたセグメントの時間的関係性を考慮する事で、提案セグメントをさらに洗練しています。また、キャプション間にも依存関係を仮定しており、Masked Transformerとはセグメントとキャプションを独立的に生成している点で大きく異なります。

Masked Transformerについて

さて、本題のMasked Transformerについての解説です。モデルの流れとしては、以下のステップを踏みます。

  1. Video Encoder Stackで動画特徴をエンコードする。
  2. Proposal Decoderで、事前に用意したアンカーに対してイベントの確率とオフセットを出力。
  3. 動画フレームのどの部分がイベントに対応するかのマスクを作成。
  4. Video Encoderで出力したEmbeddingとProposal Decoderで出力したマスクを元に、Caption Decoderで文章を生成します。
図5 Masked Transformerの全体図([1] Fig 1より引用)
モデルの全体図を上図に示しています。以下でそれぞれについて説明していきます。

Video Encoder Stack

まず、画像フレームを学習済みモデルで変換します。原論文では、Resnet200 [11]の画像特徴と、BN-Inception [12]のOptical Flow特徴を使用しています。さらに追加の特徴として、各フレームが何番目であるかをニューラルネットに教えるために、Transformerで使用されるPositional Encodingを使用しています。これらの特徴をFC層とSelf-Attentionを用いる事で動画情報をエンコードします。

画像フレームを学習済みモデルで変換すると述べましたが、画像フレームに対してCNNを適用、学習させた方が精度が高くなりうることが論文中でもコメントされています。特に細かい情報を扱う場合は気にした方が良いと思われます。例えば料理動画で頻出するであろうキャベツとレタスの区別は、学習済み重みモデルを用いただけではできない可能性があります。ちなみに私にもキャベツとレタスの区別は難しいです。。。

ただしCNNを学習させる場合、当然メモリの消費は大きくなります。原論文では480フレームを使用しているので、C3Dなどのベースネットワークを単純に学習させようと思うととんでもないメモリ消費になるはずです。

Proposal Decoder

Dense Video Captioningでは、キャプションだけでなく、どこからどこまでのフレームがそのキャプションに対応するかのセグメントも出力する必要があります。これを実現するため、Masked TransformerではSSD [13]のような物体検知アルゴリズムでも用いられる、アンカーベースのモデルを使用しています。アンカーとは事前に定義した参照セグメントで、セグメントの中心点 c_a と長さ l_a を保持しています。直接セグメントを予測するのではなく、このアンカーとの差分を予測することで間接的にセグメントを予測します。

モデルはこの参照点に対して「そのアンカーセグメント中にイベントがある確率 P_e」と「そのアンカーセグメントの中心点および長さとの差分 \theta_c, \theta_l」を出力します。そして、これらの情報を組み合わせることで予測セグメント [S_p, E_p] を以下のように計算することができます。


c_p = c_a + \theta_c l_a, l_p = l_a \exp\{\theta_l\} \\ S_p = c_p - l_p/2, E_p = c_p+l_p/2


なお、\theta_c, \theta_l はVideo Encoder Stackで出力したEncodingを入力として、1-D Convolutionなどで計算できます。

Differentialble Proposal Mask

以上で予測セグメントは計算できたのですが、Captioning Decoderに動画のどのフレームに着目するかの情報を与える必要があるため、マスクを作成する必要があります。マスクそのものは[S_p, E_p]の区間を全て1に、その他を0にすることで定義できるように思えます。しかし、このような離散的なマスクを作成した場合キャプションからProposal Decoderを学習することができないことになります。そこで、まず以下のような連続的なマスクを作成します。

f_M(S_p, E_p, S_a, E_a, i) = \sigma(g([\rho(S_p, i), \rho(E_p, i), \rho(S_a, i), \rho(E_e, i), Bin(S_a, E_a, i)]))\\ \rho(pos, i) = \left\{\begin{array}{cc} \sin(pos/10000^{i/d}) & i \ {\rm is}\ {\rm even} \\ \cos(pos/10000^{(i-1)/d}) & {\rm otherwise} \end{array} \right. \\ Bin(S_a, E_a, i) = \left\{\begin{array}{cc}1 & {\rm if} \ i \in [S_a, E_a] \\ 0 & {\rm otherwise} \end{array} \right.


ここで g はMLPで、\sigma はシグモイド関数です。また、iはフレームのインデックスで、dはEmbeddingの次元数です。\rhoはPositional Encodingとなっており、予測されたセグメントとアンカーのセグメントをエンコーディングします。このような連続的なマスクは先ほど示した離散的なマスクと比較すると正確性に乏しいですが、以下のように離散的なマスクと連続的なマスクを組み合わせることで微分可能かつ正確なマスクを作成することができます。

f_{GM}(S_p, E_p, S_a, E_a, i) = P_e Bin(S_p, E_p, i) + (1-P_e) f_M(S_p, E_p, S_a, E_a, i)

ちなみにですが、このマスクはN \times Tの行列で、Nはサンプルの数、Tはフレーム数です。サンプルの数は、学習時はバッチサイズで、推論時は提案されたセグメントの数になります。
マスクをかける際は、

\hat F^l = f_{GM} \odot F^l


というelement-wise multiplicationでマスクを実現できます。ここで F^l は、Video Encoderで出力された l 番目のレイヤの特徴です。

Captioning Decoder

Captioning Decoderは通常のTransformerとほぼ変わりません。ただし、Encoderの情報が動画情報からであるという点と、動画のどのフレームに注目するかを情報として与えるためのマスクを使用している点に特徴があります。

損失関数

学習させるべき損失関数は4種類あります。
  • キャプション文に関する損失関数
  • アンカーオフセットを予測させるための損失関数
  • マスクに関する損失関数
  • 各アンカーにイベントがあるかどうかを学習させる損失関数

マスクの損失関数ですが、これは出来るだけ提案セグメントの離散マスクに近づくように学習させます。したがって、 Bin(S_p, E_p, i) を予測ラベルとします。具体的な損失関数の数式は論文を参照してください。

学習時の注意点

学習方法は少し工夫が必要です。学習の1エポックの単位は動画の数ではなくキャプションの数なので、同じ入力でも異なる出力(キャプションとセグメント)をさせる必要があります。

まずセグメントの学習で注意する点は、ある区間のキャプションを学習させる時はpositiveだったアンカーが、別の区間のキャプションを学習させる時はnegativeだというラベルづけになってしまうことです。したがって、各イテレーションで P_e に対するラベル付けを工夫する必要があります。ここでは、positiveラベルはキャプションに対応する正のアンカーを使用するが、negativeラベルはキャプションに依存させず、動画全体から見て何もイベントがない区間だとみなします。具体的には、ある動画の全てのセグメントとのIoUが、一つも0.1を超えない場合はnegativeであるとみなします。これによって、本来positiveなアンカーがnegativeだと判定されることを防いでいます。

ちなみに元実装ではpositiveとnegativeを均等にサンプリングしているようなのですが、私は物体検知の学習方法を踏襲してHard Negative Miningを利用しています。この学習方法は色々やりようがあると思います。例えば、positiveなラベルも同様にキャプションに依存させずに定義した方が学習が安定するかもしれません。また、negativeだとみなすIoUの閾値は論文では0.3でしたが、私は0.1に設定しました。この理由は、0.3にしてしまうと推論時に何もセグメントを提案しないという現象が起きてしまったためです。個人的にこのパラメータはかなり重要だと考えていて、高くしすぎると不必要にnegativeと判断してしまい、低くしすぎると予測セグメントの精度が落ちると考えられます。セグメント提案で意図せぬ挙動が起きる場合は、この値をチューニングすると良いかもしれません。

キャプションの学習で注意することは、各イテレーションごとに、フレームのどの部分を活用するかを変える必要がある点です。キャプションに関係のないフレームの情報を使っても意味がありません。したがって、positiveなアンカーを各サンプルごとに一つだけサンプリングすることで、Caption Deocderに渡すマスクを出来るだけ正確な情報にしています。

再現実験について

データセットは、よく使われるものとして、以下が挙げられます。
  • ActivityNet Captions [6]: 比較的大きなデータセットが特徴。
  • YouCook2 [14]: 数は少ない(AcitivityNetの1/10)が、料理動画に特化。

ここでは、学習・評価に時間をかけたくなかったため、YouCook2データセットを利用します。すでに学習済みのモデルを使用するため、それほど学習には時間がかからないはずです(ただし、もともとのモデルに冗長なパラメータがあったため、一部は学習し直しています)。手元のNVIDIA V100 GPUで学習しましたが、20エポック程度ならば1時間足らずで計算を回せました。

それでは、生成されたキャプションを確認しましょう。こちらの動画を入力にした推論結果が以下のようになります。各色がセグメントとそれに対応するキャプションになっています。また、生成したキャプションは提案セグメントから色付けを行なっています。確認してみると、それっぽいキャプションが作成できていることがわかりますね。ただし、細かい部分で間違いが起きていたり(レタスとキャベツを間違っていたり)、一部のキャプションを生成できていなかったりします。この辺りは課題ですね。

実装については、すでに著者実装が公開されていますが、PyTorchのバージョンが0.4で古いのと、学習が非効率な点などを踏まえて、新たに実装し直しました。また、元の実装と比べても読みやすくなっているはずです。最終的なスクリプトはこちらです。

図6 正解説明文と、生成された説明文

終わりに

本記事では動画認識の手法の紹介および、Dense Video Captioningというタスクに対するモデルとして、Masked Transformerという手法を解説し、その再現実験を紹介しました。実験した感想としては、意外とそれっぽい文章が作れるのだなと思う一方、まだまだ課題が多いなと感じました。[9]や[10]のように、動画という特性をより活用すべきだと思いますし、Masked Transformerに渡す入力の設計ももう少し考えるべきだと思います。原論文ではResNet [11]の学習済み重みモデルを用いていますが、例えばVideoBERT [8]では自己学習された重みモデルを用いてキャプション生成を行なったりしています。まだまだこれからという印象です。そろそろCVPRやECCVが開催されるので、どのような動画キャプション生成の研究が出てくるかは興味深いところですね。また、自然言語モデルの方でももっと工夫ができると思います。最近ではReformer [15]などTransformerを工夫したモデルが提案されているので、Masked Reformerを作成しても良いかもしれません。

最後になりますが、先進技術部では今後も動画分析の調査や研究に力を入れていく予定です。動画は情報に富んでいて、その分様々な技術が要求される印象です(つまり研究しがいがあるという事ですね!)。ALBERTには様々なバックグラウンド・知識を持った人がいるので、社内チャットに困ったことを投げれば様々な視点からの回答が返ってきます(非常に助かっています)。より多様なメンバーが集まると、よりALBERTの強みが増すのかなと期待しています。ALBERTではリサーチャー・アナリストを募集しています!ご興味のある方はこちらをご覧ください!

参考文献

  1. Zhou, L., Zhou, Y., Corso, J. J., Socher, R., & Xiong, C. (2018). End-to-end dense video captioning with masked transformer. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (pp. 8739-8748).
  2. Tran, D., Bourdev, L., Fergus, R., Torresani, L., & Paluri, M. (2015). Learning spatiotemporal features with 3d convolutional networks. In Proceedings of the IEEE international conference on computer vision (pp. 4489-4497).
  3. Carreira, J., & Zisserman, A. (2017). Quo vadis, action recognition? a new model and the kinetics dataset. In proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (pp. 6299-6308).
  4. Xie, S., Sun, C., Huang, J., Tu, Z., & Murphy, K. (2018). Rethinking spatiotemporal feature learning: Speed-accuracy trade-offs in video classification. In Proceedings of the European Conference on Computer Vision (ECCV) (pp. 305-321).
  5. Li, Y., Yao, T., Pan, Y., Chao, H., & Mei, T. (2018). Jointly localizing and describing events for dense video captioning. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (pp. 7492-7500).
  6. Krishna, R., Hata, K., Ren, F., Fei-Fei, L., & Carlos Niebles, J. (2017). Dense-captioning events in videos. In Proceedings of the IEEE international conference on computer vision (pp. 706-715).
  7. Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., … & Polosukhin, I. (2017). Attention is all you need. In Advances in neural information processing systems (pp. 5998-6008).
  8. Sun, C., Myers, A., Vondrick, C., Murphy, K., & Schmid, C. (2019). Videobert: A joint model for video and language representation learning. In Proceedings of the IEEE International Conference on Computer Vision (pp. 7464-7473).
  9. Wang, J., Jiang, W., Ma, L., Liu, W., & Xu, Y. (2018). Bidirectional attentive fusion with context gating for dense video captioning. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (pp. 7190-7198).
  10. Mun, J., Yang, L., Ren, Z., Xu, N., & Han, B. (2019). Streamlined dense video captioning. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (pp. 6588-6597).
  11. Simonyan, K., & Zisserman, A. (2014). Very deep convolutional networks for large-scale image recognition. arXiv preprint arXiv:1409.1556.
  12. Ioffe, S., & Szegedy, C. (2015). Batch normalization: Accelerating deep network training by reducing internal covariate shift. arXiv preprint arXiv:1502.03167.
  13. Liu, W., Anguelov, D., Erhan, D., Szegedy, C., Reed, S., Fu, C. Y., & Berg, A. C. (2016, October). Ssd: Single shot multibox detector. In European conference on computer vision (pp. 21-37). Springer, Cham.
  14. Zhou, L., Xu, C., & Corso, J. J. (2018, April). Towards automatic learning of procedures from web instructional videos. In Thirty-Second AAAI Conference on Artificial Intelligence.
  15. Kitaev, N., Kaiser, Ł., & Levskaya, A. (2020). Reformer: The Efficient Transformer. arXiv preprint arXiv:2001.04451.

水船

データソリューション本部。 大学時代の専門はマーケティングで自然言語処理をやっていました。今は画像処理で遊んでいます