__この記事の第2節__で、__動画内のシーンを文字列検索__できる__サービスの事例__を紹介します。
__Clarifaiと、ALGORITHMIAという見慣れない企業のほかに、さまざまな記事で取り上げられているGoogle Vision Intelligence APIとAmazon Rekognition__の__4つ__を取り上げます。
動画内シーンのテキスト検索:サービス事例
(ALGORITHMIAの場合。詳細は後述)
どうやって、実現しているのか。
この記事では、上記のサービス事例を取り上げる前に、__「キーワードによる動画内検索」サービスを、実現させる方法__について考えてみたいと思います。
一般物体認識モデル__や__静止画像の説明文生成モデル、__動画の説明文生成モデル__は、__すでに学習済みのモデル__で、Tensorflow/kerasに登録済みのものを呼び出して利用したり、GitHubリポジトリから落として使ったり、*TensorFlowHub*やIBM MAX(Model Asset Exchange)登録済みの学習済みモデルをそのまま活用することができます。
( 無償利用可能な学習済みモデル )
- IBM Tutorial Model Asset Exchange 入門
- IBM Model Asset sXchange
- 【ディープラーニング 転移学習】「転移学習」のための「学習済みモデル」が集められた「Model Asset Exchange」について、サクッと学びたいあなたはこちらをどうぞ(画像編)【機械学習 転移学習】
- TensorFlow Hub
- TensorFlow Hub 概要
- (GitHub)tensorflow/models
- (GitHub)tensorflow/models/official/
- note.nkmk.me(2020-03-11)「TensorFlow, KerasでVGG16などの学習済みモデルを利用」
- (GitHub)keras-team/keras-applications
- @ishida330さん 「【2019/4月更新】学習済みの様々なディープラーニング・モデルをメチャ簡単に利用できる! Model Asset Exchange(MAX)をご紹介します」
- Technical Hedgehog (2018-08-10)「Googleの事前学習済みモデルを手軽に利用出来るTensorFlow Hub」
さらに、これらの__学習済みモデル__を、Google Colaboratoryの無料GPUを使って、自前の写真 / 動画データセットで再学習(fine tuning または 転移学習)させることで、目的の物体をしっかりと識別できるモデルを作ることができます。
- @yottyann1221さん 「Google Colaboratoryで学習したモデルをローカルに保存・モデルに重みをロード・実行する」
- @tmk815さん 「Google Colaboratoryから学習済みモデルをGoogle Driveに保存する」
- note.nkmk.me(2020-03-14)「TensorFlow, Kerasで転移学習・ファインチューニング(画像分類の例)」
- @yampyさん 「Keras / Tensorflowで転移学習を行う」
- @tshimbaさん 「[Keras/TensorFlow] 転移学習(Fine-tuning)」
- 少ない画像から画像分類を学習させる方法(kerasで転移学習:fine tuning)
こうしたモデルを裏側で動かすことで、__自前の「キーワードによる動画内検索」サービスを立ち上げる__ことができると思います。
__ALGORITHMIA__は、動画から切り出した各フレーム画像にどのような物体が映っているのかを物体検出して、検出した物体の名詞単語を各フレーム画像に「タグ」付けする部分で、__一般物体認識モデルInceptionを使っている__ようです。
学習済みの一般物体認識モデルInceptionをもとに、手元のデータセットを分類できるように、ファインチューニング or 転移学習を行うコードの書き方は、次の記事で紹介されています。
- @ha9kberryさん「InceptionV3をFine-tuningさせてクラス分類」
- @hu-yusaさん「TensorFlow Hubから学習済みモデル(Inception-v3)を利用する」
ところで、ファインチューニング or 転移学習を行うためには、「手元」に「教師用データセット」を用意する必要があります。
モデルに解析させたいデータを、「教師用データ」に仕上げる作業は、一般に退屈で時間のかかる作業です。
動画の各フレームに__映り込んでいる物体を、人の眼で一つ一つ確認しながら、そこに映り込んでいる複数の物体の単語を、「正解ラベル」として「アノテーション付け」する作業__を効率化してくれるツールとして、__MicrosoftのVoTT(Visual Object Tagging Tool)__があります。
このツールは、動画の各フレームにどんな物体が映っているのかをアノテーション付けするという骨の折れる面倒な作業を、グラフィカル・ユーザインタフェース(GUI)で楽に行うことができる環境を提供してくれています。
「キーワードによる動画内検索プラットフォーム」は、次代のGoogle企業が生まれる地平なのかもしれない
__「キーワードによる動画内検索」サービス__は、これからやってくる事業だと思いますので、世界の市場をどの国のどの会社が最初に握り、次のどの会社がその地位を奪い取るのか、興味が尽きない領域です。
なお、動画データをどこから取得してくるかが一つの焦点になりますが、youtube-dlに対する違法性の疑いが退けられる方向であることを受けて、youtube-dl(対象youtube動画の「共有」ボタンで表示されるURL) -Fで最適なダウンロード・フォーマットを調べてから、youtube-dl (対象youtube動画の「共有」ボタンで表示されるURL) -f (最適なフォーマットの番号)で動画をダウンロードすることができるようになりました。
- c|net Japan 2020年11月17日 13時23分 GitHub、「youtube-dl」ライブラリーを復活--違法性ないと判断
- youtube-dl の使い方 (YouTube の動画・音声をコマンドラインでダウンロードする)
考えられる3つの実現手法
動画から、検索単語にマッチする部分動画を抽出する方法として、以下の3つを考えることができる。
__GoogleやAmazon, Microsoft__が__API__として提供している__動画内コンテンツのキーワード検索機能__は、それぞれ、どの方法を採用しているのだろうか。
( 方法1 )
- Step 1 動画からフレームを切り出す(ffmpegコマンドなど)
(入力)動画 -> (出力)静止画像の配列
動画 -> [静止画像]: List[静止画像]
なお、切り出した画像をファイル出力するとき、個々の画像のファイル名に、そのフレーム画像が、元の動画の何時何分何秒目から切り出された画像なのかのタイムスタンプを書いておくと良い。
- Step 2 ユーザが指定した物体を含むフレーム画像を見つける
フレーム画像を1件ずつ物体検出器に入力し、 ユーザが指定した物体を含むフレーム画像を見つける。
(入力)静止画像の時系列配列 ->(出力) 「物体ラベルの集合」の配列
[静止画像]:List[静止画像] -> [[物体ラベルの集合]]: List[List[物体ラベル]]
個々のフレームを対象に、一般物体検出を行う。
結果として、1つのフレーム画像は、[物体ラベルの配列]になる。
検出されたファイル画像のファイル名には、その画像が動画のどの時間位置から切り出されたのかが、タイムスタンプで書かれている。
特定の物体が出現する場面が、動画の中で、どのような動画の文脈の中で出現したのかを確認したい場合は、このタイムスタンプの前後10秒間に絞って、動画を再生すると良い。
あるいは、動画を再生するまでもなく、切り出されたフレーム画像ファイルの山のなかから、意中の物体が検出されたフレーム画像の前後10秒間のファイル画像(合計20件のファイル画像)を開いてみれば良い。
(静止)画像のなかに、どのような物体が写っているのかを検出する手法__としては、R-CNNやFast R-CNN__, Faster R-CNN, YOLO, SSD, __Mask R-CNN__など、既存手法を改良した新規手法が、続々と提案されています。
( 参考 )
- @mshinoda88さん 「物体検出についての歴史まとめ(1)」
- @sou540512さん 「【Deep learning】乃木坂顔検出 ~初心者の方に向けて~」
- @nirs_kd56さん 「乃木坂メンバーの顔をCNNで分類」
( 方法2 )
_Step 2_で、フレーム画像を1つずつ、一般物体検出器__に入力する代わりに、(静止)画像から「画像の説明文」(キャプション文)を出力するエンジン__に入力する。
2-b. 個々のフレームを対象に、静止画像の内容説明文(キャプション文)を生成する。
結果として、1つのフレーム画像は、"画像内容を説明したキャプション文" になる。
Step 2 ユーザ入力ワードにマッチする「キャプション文」を持つフレーム画象を見つける。
該当するフレーム画像のファイル名には、その画像が、元の動画の中で、何時何分何秒後に登場する画像ショットであるのかがわかる。
なお、『ユーザ入力ワードにマッチする「キャプション文」』を探すとき、次の2つの方法を選択できる。
- 検索「単語」が、キャプション「文」のなかに含まれるかどうかを探す。(「文字列部分一致」)
- 検索「単語」の単語特徴ベクトルと、キャプション文のセンテンス特徴ベクトルのcosine類似度を採用。指定した閾値以上の類似度を示す「画像キャプション文」を持つ画像フレームを見つける。
__(静止)画像から、画像の説明文(キャプション文)を出力するモデル手法__としては、以下があります。
- Simao Herdade et.al.,Image Captioning: Transforming Objects into Words, NeurIPS2019
- Xiujun Li et.al., Oscar: Object-Semantics Aligned Pre-training for Vision-Language Tasks, Arxiv 2020
- Marcella Cornia et.al., Meshed-Memory Transformer for Image Captioning, Arxiv 2020
- Luowei Zhou et.al., Unified Vision-Language Pre-Training for Image Captioning and VQA, AAAI2020
この領域で、広く知られている論文としては、2015年に出た次の__Show and tell__があります。
- Oriol Vinyals and et.al.,Show and Tell: A Neural Image Caption Generator, Arxiv 2015
- (実装コード)github.com/nikhilmaram/Show_and_Tell
-(解説記事)@expさん 「画像から説明文を生成するShow and Tellの論文要約」
-(解説記事)@harmegiddoさん 「Show attend and tellへ入門する」
__Show and tell__を動かしている記事もたくさんあります。
(方法3)
- Step 1 動画を、動画から内容説明文を生成するエンジンに入力する
(入力)動画 -> (出力)「動画の内容説明文(動画キャプション文)」の配列
動画 -> ["動画の内容説明文"]: List(str)
動画から、特定のフレーム区間ごとに、(部分)動画の内容説明文を生成する。
1本の動画から、複数の(部分)動画に紐づいた動画キャプション文が生み出される。
- Step 2 ユーザ入力ワードに類似する動画キャプション文を持つ(部分)動画領域を見つける
ユーザが入力した__検索キーワードにマッチする「キャプション文」__がある場合、__その「キャプション文」が紐づくフレーム画像番号__を返却する。
方法2と同様に、『ユーザ入力ワードにマッチする「動画キャプション文」』を探すとき、次の2つの方法を選択できる。
- 検索「単語」が、キャプション「文」のなかに含まれるかどうかを探す。(「文字列部分一致」)
- 検索「単語」の単語特徴ベクトルと、キャプション文のセンテンス特徴ベクトルのcosine類似度を採用。指定した閾値以上の類似度を示す「画像キャプション文」を持つ画像フレームを見つける。
__動画の内容説明文(キャプション文)を出力するモデル手法__としては、以下があります。
- (解説記事)ALBERT Official Blog 2020年6月5日 「動画認識手法の紹介とキャプション生成手法Masked Transformerについての解説」
- (解説記事の実装コード)(GitHub)Masked Transformer再現実装公開用リポジトリ
2. 各社リリース済みの「動画内検索」サービス
(1) Clarifai
まず最初に、__Clarifai社__を取り上げます。
この会社が提供する動画検索サービスは、Wiredも注目しています。
・ Wired 2015.02.10 「人工知能が動画から見たいシーンを探してくれる検索システム」
動画に映っているシーンを検索し、そのシーンから動画を再生できる画期的な検索システムを、人工知能(AI)を専門とする新興企業Clarifai社が開発している。
( ・・・ )
この動画に映っているのは、飼い主の女性と遊んでいるとても可愛らしい子犬だが、興味深いのは、下の折れ線グラフのような画面で起こっていることだ。Clarifai社は、動画に映っている映像をソフトウェアで追跡し、「dog」(犬)、「female」(女性)、「eyes」(目)などの説明を自動的に表示している。「cute」(可愛い)という言葉もある。
つまり、このソフトウェアは、ユーザーがある言葉を検索すると、動画の中でその言葉に対応する映像が登場するときを教えてくれるというわけだ。この表示には、半年間で10,000件作成された視覚カテゴリのデータベースが使われている。
次の画面で、API keyの発行を受けることで、使うことができるみたいです。
API keyの発行画面
(2) ALGORITHMIA
次に、__ALGORITHMIA__を見てみます。
・ ALGORITHMIA Search Unstructured Video Use Computer Vision and Deep Learning to search untagged video
同社のウェブページ上には、同社が提供するAPIを、Pythonから利用する際のサンプルコードが掲載されている。
・ ALGORITHMIA Developer Center Resources to get you started with Algorithmia
・ (GitHub)lgorithmiaio/algorithmia-python
以下はまさに、「方法1」を採用している典型例と思われる。
・ GitHub algorithmiaio/algorithmia-python
Algorithmia Common Library (python)
Python client library for accessing the Algorithmia API For API documentation, see the PythonDocsPyPI
Install from PyPi
The official Algorithmia python client is available on PyPi. Install it with pip:pip install algorithmia
以下、入りました!
% pyenv versions
system
3.6.0
3.6.0/envs/TensorFlow
3.9.0
* TensorFlow (set by /Users/ocean/Desktop/.python-version)
%
% python --version
Python 3.6.0
%
% pip install algorithmia
Collecting algorithmia
Downloading algorithmia-1.7.1-py2.py3-none-any.whl (20 kB)
Requirement already satisfied: six in /Users/ocean/.pyenv/versions/3.6.0/envs/TensorFlow/lib/python3.6/site-packages (from algorithmia) (1.15.0)
Requirement already satisfied: requests in /Users/ocean/.pyenv/versions/3.6.0/envs/TensorFlow/lib/python3.6/site-packages (from algorithmia) (2.25.0)
Collecting algorithmia-api-client==1.3.0
Downloading algorithmia_api_client-1.3.0-py2.py3-none-any.whl (150 kB)
|████████████████████████████████| 150 kB 8.7 MB/s
( ・・・省略・・・ )
Collecting toml
Using cached toml-0.10.2-py2.py3-none-any.whl (16 kB)
Installing collected packages: python-dateutil, toml, enum34, argparse, algorithmia-api-client, algorithmia
Successfully installed algorithmia-1.7.1 algorithmia-api-client-1.3.0 argparse-1.4.0 enum34-1.1.10 python-dateutil-2.8.1 toml-0.10.2
%
パスを通す
% echo 'export PATH=$HOME/.local/bin:$PATH' >> ~/.bashrc
% pip list | grep algorithmia
algorithmia 1.7.1
algorithmia-api-client 1.3.0
%
% python
Python 3.6.0 (default, Dec 8 2020, 23:48:20)
[GCC Apple LLVM 12.0.0 (clang-1200.0.32.27)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import Algorithmia
>>> quit()
%
(3) Google Vision Intelligence API
__Google Vision Intelligence APIは、「キーワードによる動画内検索」__ができる機能も提供しています。
@yoh_nさんのQiitaの記事によると、Google Vision Intelligenceに動画ファイルをアップロードすると、返り値として、次の情報が返されてくるとのことです。
- Description: オブジェクトの説明(名前), entity.description
- Confidence: 検出の信頼性 , confidence
- SegmentStartTime: オブジェクトが映っているセグメントの開始時間, segment.start_time_offset
- SegmentEndTime: オブジェクトが映っているセグメントの終了時間, segment.end_time_offset
- FrameTime: オブジェクトが検出されたフレームが動画の先頭から何秒目にあるか, frames[i].time_offset
- Box{XXX}: オブジェクトのbounding boxの各辺の座標を100分率にしたもの, frames[i].normalized_bounding_box
__@yoh_nさんの記事では、上に示した返り値をもとに、検出された個々の物体がそれぞれ、動画内のどの時刻位置のフレームに出現するのか、フレームの時間位置を計算することで、特定の物体が映っているフレーム画像を静止画像として切り出すコード__を掲載してくれています。
・ @yoh_nさん 「Video Intelligence APIで動画の物体検出をする」
####やること
動画のどのフレームのどの位置にどんなものが映っているかを特定する。
googleのVideo Intelligence APIを使用して動画から物体検出を行う。
本記事で紹介するコードは公式の入門ガイドをベースにした実装になっている。( ・・・省略・・・ )
####オブジェクトが検出されたフレームを静止画で一覧表示する
jupyter notebookはpandasのDataFrameを良い感じに勝手に描画してくれるので、レスポンスから必要な情報だけ抜き取ってDataFrameを生成する。( ・・・省略・・・ )
####オブジェクトが検出されたフレームを静止画で一覧表示する
まず、上述のtime_offsetの情報をもとに動画からフレームを抜き出す。
動画から静止画の取得はopenCVを使用する。切り出す静止画をフレームで指定する必要があるため、動画のFPSと>time_offset(秒)からおおよそのフレーム数を算出する。( ・・・省略・・・ )
最後に各画像にDescriptionとConfidenceを添えて表示する。
なお、動画の尺や検出されたオブジェクトの数によってはすべて表示すると時間がかかるためConfidenceにしきい値を設けている。
・ ITmedia NEWS 2017年03月09日「Google、動画内検索を可能にするディープラーニング採用APIのβ提供開始」
基調講演のデモでは、1本の動画内で「犬」を検索すると、動画のどの部分に犬が登場するかをタイムライン上の赤いポイントで示す様子や、動画ライブラリ内で「野球」を検索すると、野球に関連する動画一覧が、関連する場面が分かるタイムライン付きで表示されるWebサービスなどが披露された。
このAPIでは、上記のような動物名などの名詞による検索だけでなく、「泳ぐ」「走る」などの動詞での検索もできる。また、シーンの切り替え箇所も検出できる。このAPIは、Google Cloud Storage上の動画で利用できる。プライベートβへの参加は特設ページから申し込める。
・ Google の Cloud Vision API、Video Intelligence API で従来より安価・スピーディーな ”AI/ディープラーニング活用”を始めましょう
Vision API
目的) 画像から様々な属性・関連性を識別できます。
概要) 学習済API経由で推論できるので、未知の画像データへ属性情報を付与できます。
物体検知として「人・顔・帽子・服装(ズボン・スカート・トップス・ドレス・アウター)・車・自転車・ドア・タイヤ・写真フレームなどあらゆる物」を画像から識別し、カラートーン・状況(シーン識別)についての説明・切り抜き用の座標も取得出来ます。
その他、製品ロゴ、顔属性(7つの感情:喜・悲・怒・驚・表出/ぼやけ、顔の向き、帽子有無)、著名な場所、テキストも識別。
さらには、安全な画像かの判定として、アダルト/暴力/医療に関わるかどうか画像判定。
類似画像検索も可能となります。
pip install virtualenv
virtualenv <your-env>
source <your-env>/bin/activate
<your-env>/bin/pip install google-cloud-videointelligence
from google.cloud import videointelligence
client = videointelligence.VideoIntelligenceServiceClient()
job = client.annotate_video(
input_uri='gs://<bucket-name>/my_video.mp4',
features=['LABEL_DETECTION', 'SHOT_CHANGE_DETECTION'],
)
result = job.result()
(4)Amazon AWS
__Amazon Rekognitionも、「キーワードによる動画内検索」__ができる機能も提供しています。
・ Amazon Rekognition 機械学習を使用して画像と動画の分析を自動化します。
ラベル
Amazon Rekognition では、何千もの対象物体 (自転車、電話、ビルなど) とシーン (駐車場、ビーチ、都市など) を特定できます。動画を分析する際には、「小包の配達」や「サッカーの試合」など、特定のアクティビティも特定できます。カスタムラベル
Amazon Rekognition カスタムラベルを使用すると、Amazon Rekognition の検出機能を拡張して、ビジネスに独自に役立つ画像から情報を抽出できます。たとえば、ソーシャルメディアで会社のロゴを検索したり、店頭で商品を特定したり、アセンブリラインで機械部品を分類したり、ビデオでアニメーションキャラクターを検出したりできます。有名人の認識
動画と画像ライブラリにある有名人を素早く特定し、動画や写真をカタログ化してマーケティング、広告、メディア産業でのユースケースに使えます。
最後の段落で、__「動画」__の文字が出てきます。
( 隣接領域 )
・ AI SCHOLAR 2019年04月28日 「Google & Deep Mind 、複数のビデオ内から同じ出来事を抽出する動画解析モデル「TCCL」を発表」
先週Google BrainとDeep Mindが”動画認識”の新しい論文を発表しました。
この論文では、動画認識の発展として、ある特定の動きをする複数の動画の足並み(動作始めから動作終わりまでの一>連の動き)を揃える動画解析モデル”Temporal Cycle-Consistency Learning(TCCL)”を提案しています。
例えば、ピッチャーの投球フォームは、足を振りかぶってからボールを投げるまで、人によって様々です。動き始めの動作も違えば、振りかぶっている時間も異なります。TCLLを用いることで、複数の投球フォームの動き始めから動き終わりまでの行動を全て一律のタイミングで表示させることができます。
( ・・・ )
この研究では、”時間一律化の表現”をいくつかの動画を学習させることによる教師なし学習によって実現します。それらのフレームデータから特徴量を抽出し、最近傍法により動画の各時点における類似度が高い点を同じ動作として認識します。
ここで注目しておくべきは、ただ動画の再生時間を合わせているわけではなく、動画の内容である”投球フォームの動作”が”再生時間内の各点において同じ”という点です。例えば、動画開始から1秒後には振りかぶっており、1.5秒後にはボールが手から離れているといった一律さを保っています。まるでAIが動画の内容を認識しているかのような一律化を再現します。
動画内の行為(アクション)内容で検索する例
__静止画像や動画__の中で、__人物が行っている動作(アクション)の種類を、アノテーション付けするモデル__もあります。
このモデルを使うことで、__「アクション内容」をクエリ(テキスト)として入力__し、__該当するアクションが登場する動画フレーム部分を出力__するタイプの__動画検索システム__を考えることもできます。
なお、__(方法2)と(方法3)__で考えた、__静止画象のキャプション文__や、__動画のキャプション文を利用する方法__でも、__動画中の特定のアクションが行われているシーンを検索できる__と思われます。
__キャプション文の文中には、runningやsitting down onなどの表現がテキストで埋め込まれている場合が多い__からです。
- Rohit Girdhar et.al., Video Action Transformer Network, Arxiv 2019
- ShotaroKataoka /paper_summary 「Video Action Transformer Network #23」
- https://github.com/kmwallio/VideoTransformer
- Vicky Kalogeiton et.al., Action Tubelet Detector for Spatio-Temporal Action Localization, ICCV2017
- (上記の実装コード)imatge-upc/ Action-Tubelet-Detection-in-AVA
( 参考 )