ラベル検出のチュートリアル

対象

このチュートリアルは、Cloud Video Intelligence API を使用するアプリケーションの探索と開発をすぐに開始できるように作られています。このチュートリアルを終了すると、リファレンス ドキュメントを使用して独自の基本的なアプリケーションを作成できるようになります。

このチュートリアルでは、Python コードの Video Intelligence API アプリケーションを使用します。ここでの目的は、Python クライアント ライブラリについて説明することではなく、Video Intelligence API を呼び出す方法について説明することです。Java と Node.js のアプリケーションは基本的に似ています。

コードのみの例や他の言語のサンプルについては、関連する入門ガイドをご覧ください。

前提条件

このチュートリアルにはいくつかの前提条件があります。

ラベル検出で動画にアノテーションを付ける

このチュートリアルでは、LABEL_DETECTION リクエストを使用する基本的な Video API アプリケーションの作成について順を追って説明します。LABEL_DETECTION リクエストは、動画にアノテーションとしてラベル(タグ)を付けるものですが、このラベルは画像の内容に基づいて選択されます。たとえば、踏切を通過する列車の動画には、「train」、「transportation」、「railroad crossing」などのラベルが生成されます。

まずコード全体を示します。このコードのコメントのほとんどは削除されています。これは、コードそのものは単純であることを示すためです。コードについて説明していく中で、コメントを追加で示します。

import argparse

from google.cloud import videointelligence

def analyze_labels(path):
    """ Detects labels given a GCS path. """
    video_client = videointelligence.VideoIntelligenceServiceClient()
    features = [videointelligence.enums.Feature.LABEL_DETECTION]
    operation = video_client.annotate_video(path, features=features)
    print('\nProcessing video for label annotations:')

    result = operation.result(timeout=90)
    print('\nFinished processing.')

    segment_labels = result.annotation_results[0].segment_label_annotations
    for i, segment_label in enumerate(segment_labels):
        print('Video label description: {}'.format(
            segment_label.entity.description))
        for category_entity in segment_label.category_entities:
            print('\tLabel category description: {}'.format(
                category_entity.description))

        for i, segment in enumerate(segment_label.segments):
            start_time = (segment.segment.start_time_offset.seconds +
                          segment.segment.start_time_offset.nanos / 1e9)
            end_time = (segment.segment.end_time_offset.seconds +
                        segment.segment.end_time_offset.nanos / 1e9)
            positions = '{}s to {}s'.format(start_time, end_time)
            confidence = segment.confidence
            print('\tSegment {}: {}'.format(i, positions))
            print('\tConfidence: {}'.format(confidence))
        print('\n')

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('path', help='GCS file path for label detection.')
    args = parser.parse_args()

    analyze_labels(args.path)

この単純なアプリケーションでは、次のタスクを実行します。

  • アプリケーションの実行に必要なライブラリをインポートする
  • Google Cloud Storage URI に保存されている動画ファイルを引数として受け取り、main() 関数に渡す
  • Video Intelligence API サービスの実行に必要な認証情報を取得する
  • 動画サービスに送信する動画アノテーション リクエストを作成する
  • リクエストを送信し、長時間実行オペレーションを返す
  • 動画が処理されて戻り値が返されるまで、長時間実行オペレーションをループする
  • サービスのレスポンスを解析してユーザーに表示する

これらのステップについて、下記で詳しく説明します。

ライブラリのインポート

import argparse

from google.cloud import videointelligence

いくつかの標準ライブラリをインポートします。argparse は、アプリケーションが入力ファイル名を引数として受け取れるようにします。sys は、API レスポンスを待っている間に出力のフォーマットを行います。また、簡単な待機ループを実行するために time をインポートします。

Cloud Video Intelligence API を使用するため、google.cloud.videointelligence_v1 と列挙型クラスをインポートし、API 呼び出しのディレクトリを格納します。

アプリケーションの実行

parser = argparse.ArgumentParser(
    description=__doc__,
    formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('path', help='GCS file path for label detection.')
args = parser.parse_args()

analyze_labels(args.path)

ここでは、引数として渡された動画ファイル名の Google Cloud Storage URI を解析し、main() 関数に渡します。

API に対する認証

Video Intelligence API サービスと通信する前に、事前に取得した認証情報を使用してサービスを認証する必要があります。アプリケーション内で認証情報を取得する最も簡単な方法は、アプリケーションのデフォルト認証情報(ADC)を使用することです。デフォルトでは、ADC は GOOGLE_APPLICATION_CREDENTIALS 環境ファイルから認証情報の取得を試行します。このファイルは、サービス アカウントの JSON キーファイルを指すように設定されているはずです(クイックスタートで、ADC を使用するためのサービス アカウントと環境を設定しました)。

リクエストの作成

video_client = videointelligence.VideoIntelligenceServiceClient()
features = [videointelligence.enums.Feature.LABEL_DETECTION]
operation = video_client.annotate_video(path, features=features)

Video Intelligence API サービスの準備ができたので、そのサービスに対するリクエストを作成できます。Cloud Video Intelligence API に対するリクエストは、JSON オブジェクトとして作成します。このようなリクエストの具体的な構造については、Video Intelligence API リファレンスをご覧ください。

このコード スニペットによって、次のタスクが実行されます。

  1. annotate_video() メソッドに対する POST リクエストの JSON を作成する。
  2. 渡された動画ファイルが存在する Google Cloud Storage の場所をリクエストに挿入する。
  3. annotate メソッドに LABEL_DETECTION を実行するよう指示する。

オペレーションの確認

result = operation.result(timeout=90)
print('\nFinished processing.')

既存のオペレーションのリクエストを使用して while ループを作成し、オペレーションの状態を定期的に確認します。オペレーションが done 状態になったら、ループを抜け、レスポンスを解析します。

レスポンスの解析

segment_labels = result.annotation_results[0].segment_label_annotations
for i, segment_label in enumerate(segment_labels):
    print('Video label description: {}'.format(
        segment_label.entity.description))
    for category_entity in segment_label.category_entities:
        print('\tLabel category description: {}'.format(
            category_entity.description))

    for i, segment in enumerate(segment_label.segments):
        start_time = (segment.segment.start_time_offset.seconds +
                      segment.segment.start_time_offset.nanos / 1e9)
        end_time = (segment.segment.end_time_offset.seconds +
                    segment.segment.end_time_offset.nanos / 1e9)
        positions = '{}s to {}s'.format(start_time, end_time)
        confidence = segment.confidence
        print('\tSegment {}: {}'.format(i, positions))
        print('\tConfidence: {}'.format(confidence))
    print('\n')

オペレーションが完了すると、結果を含む AnnotateVideoResponse がレスポンスで返されます。これは、リクエストで送信された各動画に対応する annotationResults のリストで構成されています。この例では 1 つの動画のみをリクエストで送信したため、結果の最初の segmentLabelAnnotations を使用します。segmentLabelAnnotations のすべてのラベルに同じ処理を繰り返します。このチュートリアルでは、動画レベルのアノテーションのみを表示します。動画レベルのアノテーションを確認するため、結果から segment_label_annotations データを pull します。各セグメントのラベル アノテーションには、説明(segment_label.description)、エンティティ カテゴリのリスト(category_entity.description)、セグメント内での位置(動画の先頭からの開始時間と終了時間のオフセット)が含まれます。

{
   "name":"us-west1.12089999971048628582",
   "metadata":{
      "@type":"type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoProgress",
      "annotationProgress":[
         {
            "inputUri":"/cloud-ml-sandbox/video/chicago.mp4",
            "updateTime":"2017-01-31T01:49:52.498015Z",
            "startTime":"2017-01-31T01:49:43.056481Z"
         }
      ]
   },
   "done": true,
   "response":{
      "@type":"type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoResponse",
      "annotationResults":[
         {
            "inputUri":"/cloud-ml-sandbox/video/chicago.mp4",
            "segmentLabelAnnotations": [
              {
                "entity": {
                  "entityId": "/m/01yrx",
                  "languageCode": "en-US"
                },
                "segments": [
                  {
                    "segment": {
                      "startTimeOffset": "0s",
                      "endTimeOffset": "14.833664s"
                    },
                    "confidence": 0.98509187
                  }
                ]
              },
               ...
            ]
         }
      ]
   }
}

リクエストで送信された動画は 1 つのため、最初の結果の最初の description を使用し、その description を出力します。

アプリケーションの実行

アプリケーションを実行するには、動画の Google Cloud Storage URI をアプリケーションに渡します。

$ python label_det.py gs://cloud-ml-sandbox/video/chicago.mp4
Operation us-west1.4757250774497581229 started: 2017-01-30T01:46:30.158989Z
Operation processing ...
The video has been successfully processed.

Video label description: urban area
        Label category description: city
        Segment 0: 0.0s to 38.752016s
        Confidence: 0.946980476379

Video label description: traffic
        Segment 0: 0.0s to 38.752016s
        Confidence: 0.94105899334

Video label description: vehicle
        Segment 0: 0.0s to 38.752016s
        Confidence: 0.919958174229
...
 

これで、Cloud Video Intelligence API を使用したアノテーション タスクを実行できました。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Video Intelligence API ドキュメント