Cloud Video Intelligence APIで動画の自動認識を試す

Cloud Video Intelligence API, Google Cloud Platform, Google Cloud Storage, TensorFlow

こんにちは。ソリューション開発部の飯出(いいで)です。

先日3月9日に米サンフランシスコで開催された「Google Cloud Next 2017」の基調講演にて、新しい機械学習APIが発表されました。これは「Cloud Video Intelligence API」と言われるもので、動画中の対象を自動認識してラベル付けすることができるものです。

上記の公式ブログによると、

Cloud Video Intelligence API (now in Private Beta) uses powerful deep-learning models, built using frameworks like TensorFlow and applied on large-scale media platforms like YouTube. The API is the first of its kind, enabling developers to easily search and discover video content by providing information about entities (nouns such as “dog,” “flower” or “human” or verbs such as “run,” “swim” or “fly”) inside video content.

Cloud Video Intelligence API(現在はプライベートベータ版)は、TensorFlowなどのフレームワークを使用して構築され、YouTubeなどの大規模なメディアプラットフォームに適用される強力なディープラーニングモデルを使用します。 APIはその種の最初のもので、開発者はエンティティ(「犬」、「花」や「人間」などの名詞、または「走る」、「泳ぐ」、「飛ぶ」などの動詞)に関する情報を提供することで簡単に動画コンテンツを検索して発見できます。

と記載があります。

これは面白そうですね。Google が準備したデモ動画を使って試している方が多いようですが、折角ですのでオリジナルの動画を使って対象を自動認識させてみましょう。

Cloud Video Intelligence API のページにアクセス

こちらです。

まず、オリジナルの動画を用いる場合にはプライベートベータ版の利用申請が必要です。「SIGN UP FOR PRIVATE BETA」へ進みましょう。なお、デモ動画を楽しむだけでしたら利用申請をせずに誰でもすぐに試すことができます。

申請が終わったら、Google Cloud Storage に動画をアップロードして、一般公開で共有しましょう。(ちなみに私、一般共有をすることを忘れて動画が全く再生できず、1時間位右往左往していました…)

アップロードした動画はコレ

手っ取り早く、このブログで公開している記事の動画を使います。

では試してみましょう

「TRY THE API」欄の「Select a Sample Video to Annotate」から「Custom Google Cloud Storage (GCS) URL」を選択します。その後表示される「Custom GCS URL」欄に自動認識させる動画のパスを入力し、「ANNOTATE VIDEO」ボタンをクリックすると、動画の再生が始まります。そして、動画の再生開始から30秒ほどで、ラベルが表示されました。

Labels タブの内容

まずは全体のラベルを見てみます。

Labelsタブに表示された動画の解析結果

「Clinic」「Medical equipment」… まぁそう見えなくもないですが。Pepper を医療機器と判定しているのでしょうか。

Shots タブの内容

次はシーンごとに解析結果が切り替わるショット毎のラベルです。

Shot5: Pepperがアップで再生されるシーン

Shotsタブに表示されたPepper動画の解析結果

Pepper を正しく「Robot」と認識しています。そして「Toy」…おもちゃですか。確かにおもちゃにされている気もしなくもないですが。

Shot8: Pepperを中心に周辺も再生されるシーン

Shotsタブに表示されたPepper動画の解析結果

「Standing」「Door」は、ちゃんと認識されていますね。「Bathroom」「Toilet」…部屋の全体像を認識するには、情報が少なすぎるということでしょうか。

Shot9: 人物像と共に部屋の全体とPepperが再生されるシーン

Shotsタブに表示された人物とPepper動画の解析結果

今度は「Office」が先頭に来ていますね。しかし、「Clinic」「Medical equipment」「Medicine」… 診察室に見えるようです。(動画は診察行為をしているみたいなものですが。)

このシーンでは他に「Patient」「Hospital」「Desk」というラベルも表示されました。

他の動画ではどうなるか

単一の動画であれこれ評価するのも微妙なので、他の動画も試してみました。

この動画は、弊社の同僚達と瀬戸大橋本州四国連絡橋)をドライブしたときに後部座席から撮影していた動画です。認識対象が多い動画だからでしょうか。動画の再生開始からラベルが初めて表示されるまでに2分10秒ほど時間が掛かりました。

夜、瀬戸大橋をドライブしたときの動画

「Night」「Road」「Highway」「Vehicle」「Street light」「Lane」「Evening」「Car」

ほぼ完ぺき!良好な結果が返却されています。

他にも「Infrastructure」「Light」「Lightning」「Dashcam」「Motor vehicle」「Bridge」「Traffic」「Asphalt」「Metropolitan area」とラベルが返却されています。「Dashcam」を返却してくるところには驚きました。

APIタブの内容

ラベルばかり見ていないで、APIの内容も見てみましょう。

Annotate Request Body の内容のとおり、動画のURIとパラメータを設定して、Annotate Request の記載のとおりにリクエストを出します。

Annotate Request

https://videointelligence.googleapis.com/v1beta1/videos:annotate?key=YOUR_API_KEY_HERE

Annotate Request Body

{
  "inputUri": "gs://gcp-via_test/ATAC2016.mp4",
  "features": [
    "LABEL_DETECTION",
    "SHOT_CHANGE_DETECTION"
  ]
}

と、下記 Annotate Response に記載した API KEY が返却されます。

Annotate Response

{
  "name": "asia-east1.921040550355766996"
}

そして、Operation Request の内容のとおり、Annotate Response で取得した API KEY を設定してリクエストします。

Operation Request

https://videointelligence.googleapis.com/v1/operations/asia-east1.921040550355766996?key=YOUR_API_KEY_HERE

そして返却されたレスポンスは以下のとおり。APIタブが表示されている実際の画面には Operation Request と書いてありますが、きっと Response の間違いでしょう。

レスポンスの中身を見てみると、”progressPercent” の記載が。これは進捗状況でしょうか。”done” は解析完了でしょうか。

“response” には解析したラベルの情報が格納されていますね。”level” には全体のラベルであるかショット毎のラベルであるかという情報が入っています。”segment” には動画の開始時間~終了時間とみられるオフセットが入っています。

“shotAnnotations” にはショットがいくつ存在するか、ショット毎の動画開始時間~終了時間が入っています。このサンプルではショットを1つしか認識していないのですが、ショットの個数に合わせた形で返却されてくる模様です。

Operation Response(実際の画面上には、Operation Request と記載されています。)

{
  "name": "asia-east1.921040550355766996",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.videointelligence.v1beta1.AnnotateVideoProgress",
    "annotationProgress": [
      {
        "inputUri": "/gcp-via_test/ATAC2016.mp4",
        "progressPercent": 100,
        "startTime": "2017-03-11T06:51:21.001296Z",
        "updateTime": "2017-03-11T06:52:40.819215Z"
      },
      {
        "inputUri": "/gcp-via_test/ATAC2016.mp4",
        "progressPercent": 100,
        "startTime": "2017-03-11T06:51:21.001296Z",
        "updateTime": "2017-03-11T06:52:34.307775Z"
      }
    ]
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.videointelligence.v1beta1.AnnotateVideoResponse",
    "annotationResults": [
      {
        "inputUri": "/gcp-via_test/ATAC2016.mp4",
        "labelAnnotations": [
          {
            "description": "Car",
            "languageCode": "en-us",
            "locations": [
              {
                "segment": {
                  "startTimeOffset": "-1",
                  "endTimeOffset": "-1"
                },
                "confidence": 0.69072515,
                "level": "VIDEO_LEVEL"
              },
              {
                "segment": {
                  "startTimeOffset": "16641",
                  "endTimeOffset": "171571372"
                },
                "confidence": 0.69072515,
                "level": "SHOT_LEVEL"
              }
            ]
          },
          {
            "description": "Dashcam",
            "languageCode": "en-us",
            "locations": [
              {
                "segment": {
                  "startTimeOffset": "-1",
                  "endTimeOffset": "-1"
                },
                "confidence": 0.4777151,
                "level": "VIDEO_LEVEL"
              },
              {
                "segment": {
                  "startTimeOffset": "16641",
                  "endTimeOffset": "171571372"
                },
                "confidence": 0.4777151,
                "level": "SHOT_LEVEL"
              }
            ]
          },
          ・・・中略・・・
          {
            "description": "Highway",
            "languageCode": "en-us",
            "locations": [
              {
                "segment": {
                  "startTimeOffset": "-1",
                  "endTimeOffset": "-1"
                },
                "confidence": 0.9263109,
                "level": "VIDEO_LEVEL"
              },
              {
                "segment": {
                  "startTimeOffset": "16641",
                  "endTimeOffset": "171571372"
                },
                "confidence": 0.9263109,
                "level": "SHOT_LEVEL"
              }
            ]
          }
        ],
        "shotAnnotations": [
          {
            "startTimeOffset": "16641",
            "endTimeOffset": "171571372"
          }
        ]
      }
    ]
  }
}

おわりに…

今回は Cloud Video Intelligence API がどのようなものであるか試してみました。この技術が機械学習によってもっと認識精度があがり、より早く、より的確な解析結果を返却するようになることによって、様々な利用用途が増えてくるのではないかと思います。同時に、利用用途によってはちょっとした怖さも感じることになりました。

ただ、面白い技術ではありますので、みなさんも一度試してみたらいかがでしょうか。

  • 株式会社アークシステムの来訪管理・会議室予約システム BRoomHubs
  • 低コスト・短納期で提供するまるごとおまかせZabbix