Colaboratory 上から Cloud Video Intelligence API を使い、動画を解析した結果を表示する。

## 最終的なノートブック

- https://colab.research.google.com/drive/1a3w79mEhUu6H8mnTQV-Tm4mGbBDpPkB-

解析する動画：
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/2e941e46-bfb1-f339-3cf8-4fcba8fb0736.png)](https://youtu.be/PxyK9mjbMNc)


## Cloud Video Intelligence API を使うための準備

次のクイックスタートの `始める前に` の準備をします。
1~3はプロジェクトの設定なのでクイックスタートの指示通りですが、4,5は少し違います。

- [クイックスタート: クライアント ライブラリの使用  |  Cloud Video Intelligence API ドキュメント  |  Google Cloud](https://cloud.google.com/video-intelligence/docs/quickstart-client-libraries?hl=ja)

### 1. GCPプロジェクトを作成する

<img width="561" alt="Screen Shot 2019-12-27 at 17.46.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/842bf4a0-bc67-bc99-fa7d-098d1b69f8af.png">

### 2. プロジェクトに対して課金が有効になっていることを確認する

1 で作ったプロジェクトが請求先アカウントにリンクされていることを確認します。
（課金の有効は自己責任でお願いします。）

### 3. Cloud Video Intelligence API を有効にする

`を有効にする` ボタンを選択すると、プロジェクトを選択する画面が表示されるので、 1 で作ったプロジェクトを選択し、 `続行` 。
（以前、APIが有効にできない時がありましたが、プロジェクトを作り直したら問題なくできました。原因はわかっていません。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/014f22f9-453e-05ad-8ea6-f354bae0e174.png)

### 4. サービスアカウントを作成する

まず、サービスアカウントとは、

> サービス アカウントは、個々のエンドユーザーではなく、アプリケーションや仮想マシン（VM）に属している特別な Google アカウントです。アプリケーションはサービス アカウントを使用して、ユーザーの関与を必要とせずに Google のサービス API を呼び出すことができます。
> 
> たとえば、あるサービス アカウントで Compute Engine VM が実行される場合、必要なリソースへのアクセス権をそのアカウントに付与できます。こうしてサービス アカウントはサービスの ID となり、サービス アカウントの権限はサービスがアクセスできるリソースを制御します。
> 
> [サービス アカウント  |  Cloud IAM のドキュメント  |  Google Cloud](https://cloud.google.com/iam/docs/service-accounts?hl=ja) より

サービスアカウントの権限を設定することで、サービスがアクセスできるリソースを制御するので、
ここでは、 `ストレージ` の `閲覧` 権限のみを付与したサービスアカウントを作成したいと思います。
（動画を一度、 `Google Cloud Storage` にアップロードして、そこから読み込んでもらうため。）

クイックスタートのリンクから作成すると、原因はわからなかったのですが、うまくいかなかったので、

- [サービス アカウント – IAM と管理 – Google Cloud Platform](https://console.cloud.google.com/iam-admin/serviceaccounts?hl=ja) から `+ サービスアカウントを作成` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/34ebb17d-31cd-87fc-fa9b-e935dd83eddf.png)

- `サービスアカウント名` を入力し、 `作成` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/97754837-bbf1-d730-70e0-c6b9c2714ea5.png)

- `役割` から `ストレージ>ストレージオブジェクト閲覧者` を選択
- `続行` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/813fb99b-dd73-719a-5a44-4e4f55a54340.png)
 
- `キーの作成` から `作成` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/91bf38e7-7fa0-afb9-c4c2-99c8a016836e.png)

- ポップアップと共に、JSONファイルをダウンロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/223c364a-5719-57ab-e4c9-73106b919da6.png)


### 環境変数の設定をする

JSONファイルのファイルパスを指定する必要があるため、クイックスタートとでは環境変数を設定していますが、
ここでは、Colaboratory上から直接パスを指定するので、設定は不要です。

## 動画を Google Cloud Storage にアップロードする

[ストレージ ブラウザ – Storage – Google Cloud Platform](https://console.cloud.google.com/storage/browser?hl=ja) にアクセスし、 `バケットの作成` を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/5bcf1599-c81c-64cd-7091-0a274dade491.png)

バケットの名前を入力し、 `作成` を選択します。
（ここでは、リージョンなどは気にしていません。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/20fab62d-3ad0-e23d-b585-04d6c7430173.png)

バケットが作成できたら、動画をアップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/78040c17-791b-a9ed-3697-10306e733aba.png)

バケット直下に `dog.mp4` をアップロードしました。


### 動画サイズなどについて

ストレージの容量やダウンロード容量の無料枠に気をつけてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/88a4591f-1a4f-4f54-5f6b-e86c7e8235ee.png)

[Cloud Storage の料金  |  Cloud Storage  |  Google Cloud](https://cloud.google.com/storage/pricing)

## Colaboratory 上でノートブックを作る

[Colaboratory](https://colab.research.google.com/notebooks/) 上で、

- `ファイル` > `Python 3 の新しいノートブック`

から新しいノートブックを作ります。

## Cloud Video Intelligence API で動画を解析する

### Cloud Video Intelligence API の Python パッケージをインストールする

`Cloud Video Intelligence API` の Python パッケージをインストールします。

```
!pip install -U google-cloud-videointelligence
```

### サービスアカウントの認証情報をアップロードする

サービスアカウント作成時にダウンロードした、JSON ファイルを Colaboratoryの左ペインの `ファイル` からアップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/12fe55e3-2db0-4e97-6b46-ba4c61332011.png)


### 認証情報から証明書を作成する

```
import json
from google.oauth2 import service_account

service_account_key_name = <JSON ファイル名>
info = json.load(open(service_account_key_name))
creds = service_account.Credentials.from_service_account_info(info)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/1c672602-1118-21eb-9fde-09ae09e190da.png)


### クライアントを作成する

証明書をここで、指定してクライアントを作成します。

```
from google.cloud import videointelligence

video_client = videointelligence.VideoIntelligenceServiceClient(credentials=creds)
```

### 動画の場所を指定する

今回はバケット直下に動画ファイルをアップロードしたので、次のようになります。

```
video_url = "gs://<バケット名>/<動画ファイル名>"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/6c34dfb4-f25c-3ab4-8c0d-b1cc7845d769.png)


### 動画を解析する

ここからは、クイックスタートと同じです。


```
features = [videointelligence.enums.Feature.LABEL_DETECTION]
operation = video_client.annotate_video(
    video_url, features=features)
print('\nProcessing video for label annotations:')

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

# first result is retrieved because a single video was processed
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')
```

無事、解析結果が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32636/5a1e9edd-e745-7962-511f-9e403305a5f1.png)


## 遭遇したエラー

### PermissionDenied: 403 The caller does not have permission

[IAM – IAM と管理 – Google Cloud Platform](https://console.cloud.google.com/iam-admin/iam?hl=ja) のページから、メンバー（サービスアカウント）に付与された権限を削除
した上で、サービスアカウントを作り直したら、うまく行きました
が、原因はわかっていません。