C# での Video Intelligence API の使用

1. 概要

Google Cloud Video Intelligence API により、デベロッパーはアプリケーションの一部として Google の動画分析テクノロジーを使用できます。

これは次の目的で使用できます。

REST API を使用すると、ローカルまたは Google Cloud Storage に保存されている動画に、動画全体、セグメントごと、ショットごと、フレームごとのレベルでコンテキスト情報でアノテーションを付けることができます。

この Codelab では、C# での Video Intelligence API の使用に焦点を当てます。動画を分析して、ラベル、ショット変更、露骨な表現を含むコンテンツを検出する方法を学びます。

学習内容

  • Cloud Shell を使用する方法
  • Video Intelligence API を有効にする方法
  • API リクエストを認証する方法
  • C# 用 Google Cloud クライアント ライブラリをインストールする方法
  • 動画のラベル分析方法
  • 動画のショット変更を分析する方法
  • 動画を分析して露骨な表現を含むコンテンツを検出する方法

必要なもの

  • Google Cloud Platform プロジェクト
  • ChromeFirefox などのブラウザ
  • C# の使用経験

アンケート

このチュートリアルをどのように使用されますか?

通読するのみ 通読し、演習を行う

C# の使用感をどのように評価されますか。

初心者 中級者 上級者

Google Cloud Platform サービスのご利用経験についてどのように評価されますか?

<ph type="x-smartling-placeholder"></ph> 初心者 中級 上達 をご覧ください。

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell を起動する

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Cloud Shell をアクティブにする

  1. Cloud Console で、[Cloud Shell をアクティブにする] d1264ca30785e435.png をクリックします。

cb81e7c8e34bc8d.png

Cloud Shell を初めて起動する場合は、内容を説明する中間画面が表示されます。中間画面が表示されたら、[続行] をクリックします。

d95252b003979716.png

Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。

7833d5e1c5d18f54.png

この仮想マシンには、必要なすべての開発ツールが読み込まれます。5 GB の永続的なホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワークのパフォーマンスと認証が大幅に向上しています。この Codelab での作業のほとんどはブラウザを使って行うことができます。

Cloud Shell に接続すると、認証が完了し、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。

  1. Cloud Shell で次のコマンドを実行して、認証されたことを確認します。
gcloud auth list

コマンド出力

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project

コマンド出力

[core]
project = <PROJECT_ID>

上記のようになっていない場合は、次のコマンドで設定できます。

gcloud config set project <PROJECT_ID>

コマンド出力

Updated property [core/project].

3. Video Intelligence API を有効にする

Video Intelligence API を使用するには、この API を有効にする必要があります。この API を有効にするには、Cloud Shell で次のコマンドを使用します。

gcloud services enable videointelligence.googleapis.com

4. C# 用 Google Cloud Video Intelligence API クライアント ライブラリをインストールする

まず、Video Intelligence API サンプルの実行に使用するシンプルな C# コンソール アプリケーションを作成します。

dotnet new console -n VideoIntApiDemo

アプリケーションが作成され、依存関係が解決されたことがわかります。

The template "Console Application" was created successfully.
Processing post-creation actions...
...
Restore succeeded.

次に、VideoIntApiDemo フォルダに移動します。

cd VideoIntApiDemo/

次に、Google.Cloud.VideoIntelligence.V1 NuGet パッケージをプロジェクトに追加します。

dotnet add package Google.Cloud.VideoIntelligence.V1
info : Adding PackageReference for package 'Google.Cloud.VideoIntelligence.V1' into project '/home/atameldev/VideoIntApiDemo/VideoIntApiDemo.csproj'.
log  : Restoring packages for /home/atameldev/VideoIntApiDemo/VideoIntApiDemo.csproj...
...
info : PackageReference for package 'Google.Cloud.VideoIntelligence.V1' version '1.0.0' added to file '/home/atameldev/VideoIntApiDemo/VideoIntApiDemo.csproj'.

これで、Video Intelligence API を使用する準備が整いました。

5. ラベル検出

ラベル分析は、ローカルまたは Google Cloud Storage に保存されている動画のラベルを検出します。このセクションでは、動画を分析して Google Cloud Storage に保存されているラベルを確認します。

まず、Cloud Shell の右上からコードエディタを開きます。

fd3fc1303e63572.png

VideoIntApiDemo フォルダ内の Program.cs ファイルに移動し、コードを次のように置き換えます。

using System;
using System.Collections.Generic;
using Google.Cloud.VideoIntelligence.V1;

namespace VideoIntApiDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = VideoIntelligenceServiceClient.Create();
            var request = new AnnotateVideoRequest
            {
                InputUri = "gs://cloud-samples-data/video/gbikes_dinosaur.mp4",
                Features = { Feature.LabelDetection }
            };
            var op = client.AnnotateVideo(request).PollUntilCompleted();
            foreach (var result in op.Result.AnnotationResults)
            {
                PrintLabels("Video", result.SegmentLabelAnnotations);
                PrintLabels("Shot", result.ShotLabelAnnotations);
                PrintLabels("Frame", result.FrameLabelAnnotations);
            }
        }

        static void PrintLabels(string labelName,
            IEnumerable<LabelAnnotation> labelAnnotations)
        {
            foreach (var annotation in labelAnnotations)
            {
                Console.WriteLine($"{labelName} label: {annotation.Entity.Description}");
                foreach (var entity in annotation.CategoryEntities)
                {
                    Console.WriteLine($"{labelName} label category: {entity.Description}");
                }
                foreach (var segment in annotation.Segments)
                {
                    Console.Write("Segment location: ");
                    Console.Write(segment.Segment.StartTimeOffset);
                    Console.Write(":");
                    Console.WriteLine(segment.Segment.EndTimeOffset);
                    Console.WriteLine($"Confidence: {segment.Confidence}");
                }
            }
        }
    }
}

1 ~ 2 分ほどかけてコードを学習し、動画がどのようにラベル付けされているかを確認しましょう**。

Cloud Shell に戻り、アプリを実行します。

dotnet run

Video Intelligence API がラベルを抽出するまでに数秒かかりますが、最終的には次のような出力が表示されます。

Video label: bicycle
Video label category: vehicle
Segment location: "0s":"42.766666s"
Confidence: 0.475821
Video label: tyrannosaurus
Video label category: dinosaur
Segment location: "0s":"42.766666s"
Confidence: 0.4222222
Video label: tree
Video label category: plant
Segment location: "0s":"42.766666s"
Confidence: 0.4231415
...

概要

このステップでは、Video Intelligence API を使用して動画のすべてのラベルを一覧表示しました。詳しくは、ラベル検出のページをご覧ください。

6. ショット変更の検出

Video Intelligence API を使用すると、ローカルまたは Google Cloud Storage に保存されている動画のショットの変更を検出できます。このセクションでは、Google Cloud Storage にあるファイルのショット変更の動画分析を実行します。

ショットの変更を検出するには、VideoIntApiDemo フォルダ内の Program.cs ファイルに移動し、コードを次のように置き換えます。

using System;
using Google.Cloud.VideoIntelligence.V1;

namespace VideoIntApiDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = VideoIntelligenceServiceClient.Create();
            var request = new AnnotateVideoRequest
            {
                InputUri = "gs://cloud-samples-data/video/gbikes_dinosaur.mp4",
                Features = { Feature.ShotChangeDetection }
            };
            var op = client.AnnotateVideo(request).PollUntilCompleted();
            foreach (var result in op.Result.AnnotationResults)
            {
                foreach (var annotation in result.ShotAnnotations)
                {
                    Console.Out.WriteLine("Start Time Offset: {0}\tEnd Time Offset: {1}",
                        annotation.StartTimeOffset, annotation.EndTimeOffset);
                }
            }
        }
    }
}

1 ~ 2 分ほどかけてコードを読み、ショット検出がどのように機能するかを確認してください。

Cloud Shell に戻り、アプリを実行します。次のような出力が表示されます。

dotnet run

次の出力が表示されます。

Start Time Offset: "0s" End Time Offset: "5.166666s"
Start Time Offset: "5.233333s"  End Time Offset: "10.066666s"
Start Time Offset: "10.100s"    End Time Offset: "28.133333s"
Start Time Offset: "28.166666s" End Time Offset: "42.766666s"

概要

このステップでは、Video Intelligence API を使用して、Google Cloud Storage に保存されているファイルのショットの変更を検出しました。詳しくは、ショットの変更をご覧ください。

7. 不適切なコンテンツの検出

不適切なコンテンツの検出では、動画内のアダルト コンテンツを検出します。アダルト コンテンツとは、一般的に 18 歳以上に適したコンテンツです。これには、ヌード、性行為、ポルノ(アニメやアニメを含む)などが含まれますが、これらに限定されません。レスポンスには、バケット化された可能性の値(VERY_UNLIKELY から VERY_LIKELY まで)が含まれます。

不適切なコンテンツの検出で動画を評価する際は、フレームごとに評価を行い、映像コンテンツのみが考慮されます。動画の音声コンポーネントは、不適切なコンテンツのレベルの評価には使用されません。

露骨な表現を含むコンテンツを検出するには、VideoIntApiDemo フォルダ内の Program.cs ファイルに移動し、コードを次のように置き換えます。

using System;
using Google.Cloud.VideoIntelligence.V1;

namespace VideoIntApiDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = VideoIntelligenceServiceClient.Create();
            var request = new AnnotateVideoRequest
            {
                InputUri = "gs://cloud-samples-data/video/gbikes_dinosaur.mp4",
                Features = { Feature.ExplicitContentDetection }
            };
            var op = client.AnnotateVideo(request).PollUntilCompleted();
            foreach (var result in op.Result.AnnotationResults)
            {
                foreach (var frame in result.ExplicitAnnotation.Frames)
                {
                    Console.WriteLine("Time Offset: {0}", frame.TimeOffset);
                    Console.WriteLine("Pornography Likelihood: {0}", frame.PornographyLikelihood);
                    Console.WriteLine();
                }
            }
        }
    }
}

1 ~ 2 分かけてコードを読み、不適切なコンテンツの検出がどのように行われたかを確認します**。

Cloud Shell に戻り、アプリを実行します。

dotnet run

数秒かかる場合がありますが、最終的には次のような出力が表示されます。

dotnet run

Time Offset: "0.056149s"
Pornography Likelihood: VeryUnlikely

Time Offset: "1.166841s"
Pornography Likelihood: VeryUnlikely
...
Time Offset: "41.678209s"
Pornography Likelihood: VeryUnlikely

Time Offset: "42.596413s"
Pornography Likelihood: VeryUnlikely

概要

このステップでは、Video Intelligence API を使用して、動画に対して露骨な表現を含むコンテンツの検出を実行しました。詳しくは、不適切なコンテンツの検出をご覧ください。

8. 完了

C# を使用して Video Intelligence API を使用する方法を学びました。

クリーンアップ

このクイックスタートで使用するリソースに対して Google Cloud Platform アカウントに課金されないようにするには:

  • Cloud Platform コンソールに移動します。
  • シャットダウンするプロジェクトを選択し、[削除] をクリックしますプロジェクトの削除がスケジュールされます。

詳細

ライセンス

この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。