見出し画像

PythonスクリプトからGCP AutoML Visionで作成したモデルを利用する

はじめに

この記事ではGoogleが提供しているクラウドサービスであるAutoML Visionを使用して作成した画像認識モデルをPythonスクリプトから使用する方法をご紹介します。

今回は物体検出モデルを使用して、いくつかの物体が映っている画像から自動的にモノが映っている範囲でトリミングした画像を生成してみます。
この記事で使用している物体検出モデルの作り方は以下の記事をご確認ください。
https://note.com/mug_cup/n/ncf12655972b8

必要な知識と環境

この記事ではPython 3系を使用しています。
そのため、この記事の方法をお試ししたい方は予めPython 3系を実行できる環境が必要になります。また、Pythonそのものの文法の説明などはしていないため、Pythonに関する基本的な知識を必要とします。

1. GCPサービスアカウントと認証情報の準備

GCPのサービスを任意のアプリケーションから利用するためにサービスアカウントとその認証情報を予め作成しておきます。
GCPのWebコンソールからIAMと管理のページを開きます。
https://console.cloud.google.com/iam-admin/serviceaccounts

画像1

サービスアカウントを作成をクリックし、下図の通りアカウントの設定をしていきます。アカウントの詳細では適当なアカウント名を入力し、作成をクリックします。

画像9

権限の設定でこのサービスアカウントが行うことができる操作を設定できます。今回はAutoMLで作成したモデルから予測を取得できれば十分であるため、AutoML 予測者というロールを選択し、続行をクリックします。

画像3

最後の設定は特に何も入力せず、サービスアカウントの作成を完了します。

画像4

そうすると、下図のようにサービスアカウントが作成されるため、このサービスアカウントをアプリケーションから利用するために、認証情報を作成してダウンロードしておきます。

画像9

サービスアカウントの詳細画面を開くと下図のような鍵を作成するための画面が表示されますので、鍵を追加をクリックして新しい鍵を作成します。

画像6

鍵のタイプにはJSONを選択し作成をクリックすると、作成された鍵ファイルが自動的にダウンロードされます。

画像7

ダウンロードされた鍵ファイルは後ほどPythonスクリプトで利用するので、無くなさないようにしてください。

2. Pythonスクリプトの依存モジュールをインストールする

今回ご紹介するPythonスクリプトは以下のモジュールに依存しているため、pip installコマンドなどで予めインストールしておいてください。

1. google-cloud-automl
2. Pillow

3. Pythonスクリプトを実装するディレクトリを作成する

スクリプトの実装の前に以下のようなディレクトリ構成でファルダを作成しておきます。また、作成したフォルダのルート階層(automl_detection_demo)に先ほどダウンロードしておいた鍵ファイルを格納しておきます。
※下記の鍵ファイルは名前を変更しています。

└── automl_detection_demo
   ├── input/
   ├── output/
   └── credentials.json

4. Pythonスクリプトを実装する

それではdetector.pyという名前でPythonのスクリプトファイルを作成し、AutoML Visionで作成した物体検出モデルを利用してみます。
detector.pyは作成したフォルダのルート階層(automl_detection_demo)に格納します。

└── automl_detection_demo
   ├── input/
   ├── output/
   ├── credentials.json
   └── detector.py

detector.pyの実装内容は下記の通りです。
最低限の実装しかしておりませんので、必要に応じてパラメータの外部定義化、入力画像に対する前処理は実装してください。

import io
from glob import glob
from PIL import Image
from google.cloud import automl_v1beta1

# GCP
GCP_PROJECT_ID = 'ご自身のプロジェクトIDを設定してください'
AUTOML_MODEL_ID = 'ご自身のモデルIDを設定してください'
SERVICE_ACCOUNT_CREDENTIALS = 'credentials.json'

# Environments
INPUT_DIR = './input'
OUTPUT_DIR = './output'


def predict(client, image_bytes, project_id, model_id):
   model = f'projects/{project_id}/locations/us-central1/models/{model_id}'
   payload = {'image': {'image_bytes': image_bytes}}
   params = {}
   result = client.predict(model, payload, params)
   return result.payload


def image_to_byte_array(image):
   bytea = io.BytesIO()
   image.save(bytea, format=image.format)
   return bytea.getvalue()


def detect(client, image):
   image_bytes = image_to_byte_array(image)
   predictions = predict(client, image_bytes, GCP_PROJECT_ID, AUTOML_MODEL_ID)
   results = []
   for pred in predictions:
       detected_box = pred.image_object_detection.bounding_box
       detected_points = (
           detected_box.normalized_vertices[0].x,
           detected_box.normalized_vertices[0].y,
           detected_box.normalized_vertices[1].x,
           detected_box.normalized_vertices[1].y
       )
       results.append(detected_points)
   return results


def crop_image(image, box):
   w, h = image.size
   return image.crop((box[0]*w, box[1]*h, box[2]*w, box[3]*h))


def main():
   automl_client = automl_v1beta1.PredictionServiceClient.from_service_account_file(SERVICE_ACCOUNT_CREDENTIALS)
   input_files = glob(f'{INPUT_DIR}/*')
   for filepath in input_files:
       filename = filepath.split('/')[-1].split('.')[0]
       
       # detect inputs
       image = Image.open(filepath)
       results = detect(automl_client, image)
   
       # output results
       for index, result in enumerate(results):
           cropped_image = crop_image(image, result)
           output_path = f'{OUTPUT_DIR}/{filename}-{index}.jpg'
           cropped_image.save(output_path)


if __name__ == '__main__':
    main()

5. Pythonスクリプトを実行してみる

用意しておいたinputフォルダに入力用の画像を格納しておきます。
今回は下記のような画像を格納しておきました。

画像9

detector.pyを実行してoutputフォルダを確認してみると、正常にモデルから取得した検出結果を使用してトリミングされた画像が出力されています。

画像9

おわり

今回はPythonスクリプトからAutoML Visionで作成した物体検出モデルを使用し、物体が写っている範囲でトリミングした画像を自動生成する処理を実装してみました。
最後に、デプロイしたAutoML Visionのモデルが必要でなくなったら、デプロイを解除しておいて費用が発生しないようにしておきましょう。

この記事が気に入ったらサポートをしてみませんか?