チュートリアル: 特徴ベクトルモデルを使用してオブジェクト テーブルで推論を実行する
このチュートリアルでは、花のデータセットからの画像に基づいてオブジェクト テーブルを作成し、MobileNet V3 モデルを使用してそのオブジェクト テーブルで推論を実行する方法を示します。
MobileNet V3 モデル
MobileNet V3 モデルは、画像ファイルを分析して、特徴ベクトル配列を返します。特徴ベクトル配列は、分析された画像の特性を記述する数値要素からなるリストです。各特徴ベクトルは多次元特徴空間を表し、この空間における画像の座標を提供します。画像の特徴ベクトル情報を使用して、画像をさらに分類できます。たとえば、コサイン類似度を使用してよく似た画像をグループ化できます。
MobileNet V3 モデルの入力は、形状 [-1, 224, 224, 3]
の DType
tf.float32
のテンソルを取ります。出力は、形状 [-1, 1024]
の tf.float32
のテンソルの配列です。
必要な権限
- データセットを作成するには、
bigquery.datasets.create
権限が必要です。 接続リソースを作成するには、次の権限が必要です。
bigquery.connections.create
bigquery.connections.get
接続のサービス アカウントに権限を付与するには、次の権限が必要です。
resourcemanager.projects.setIamPolicy
オブジェクト テーブルを作成するには、次の権限が必要です。
bigquery.tables.create
bigquery.tables.update
bigquery.connections.delegate
バケットを作成するには、
storage.buckets.create
権限が必要です。データセットとモデルを Cloud Storage にアップロードするには、
storage.objects.create
権限とstorage.objects.get
権限が必要です。モデルを BigQuery ML に読み込むには、次の権限が必要です。
bigquery.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
推論を実行するには、次の権限が必要です。
- オブジェクト テーブルに対する
bigquery.tables.getData
- モデルに対する
bigquery.models.getData
bigquery.jobs.create
- オブジェクト テーブルに対する
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
- BigQuery: You incur storage costs for the object table you create in BigQuery.
- BigQuery ML: You incur costs for the model you create and the inference you perform in BigQuery ML.
- Cloud Storage: You incur costs for the objects you store in Cloud Storage.
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
BigQuery ストレージの料金について詳しくは、BigQuery のドキュメントのストレージの料金をご覧ください。
BigQuery ML の料金について詳しくは、BigQuery ドキュメントの BigQuery ML の料金をご覧ください。
Cloud Storage の料金設定の詳細については、クラウドの料金設定のページをご覧ください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery and BigQuery Connection API APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery and BigQuery Connection API APIs.
予約を作成する
オブジェクト テーブルでインポートされたモデルを使用するには、BigQuery の Enterprise エディションまたは Enterprise Plus エディションを使用する予約を作成し、QUERY
ジョブタイプを使用する予約の割り当てを作成する必要があります。
データセットの作成
mobilenet_inference_test
という名前のデータセットを作成します。
SQL
BigQuery ページに移動します。
[エディタ] ペインで、次の SQL ステートメントを実行します。
CREATE SCHEMA `PROJECT_ID.mobilenet_inference_test`;
PROJECT_ID
は、実際のプロジェクト ID に置き換えます。
bq
Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。
bq mk
コマンドを実行してデータセットを作成します。bq mk --dataset --location=us PROJECT_ID:resnet_inference_test
PROJECT_ID
は、実際のプロジェクト ID に置き換えます。
接続を作成する
lake-connection
という名前の接続を作成します。
コンソール
BigQuery ページに移動します。
[
追加]、[外部データソース] の順にクリックします。[接続タイプ] リストで、[BigLake とリモート関数(クラウド リソース)] を選択します。
[接続 ID] フィールドに「
lake-connection
」と入力します。[接続を作成] をクリックします。
[エクスプローラ] ペインでプロジェクトを開き、[外部接続] ノードを開いて、
us.lake-connection
接続を選択します。[接続情報] ペインで、[サービス アカウント ID] フィールドの値をコピーします。この情報は、次の手順で作成する Cloud Storage バケットで接続のサービス アカウントに権限を付与する際に必要になります。
bq
Cloud Shell で
bq mk
コマンドを実行して、接続を作成します。bq mk --connection --location=us --connection_type=CLOUD_RESOURCE \ lake-connection
bq show
コマンドを実行して、接続に関する情報を取得します。bq show --connection us.lake-connection
properties
列からserviceAccountId
プロパティの値をコピーし、任意の場所に保存します。接続のサービス アカウントに権限を付与するには、この情報が必要です。
Cloud Storage バケットを作成する
- Cloud Storage バケットを作成する。
- バケット内に 2 つのフォルダを作成します。1 つはモデルファイル用の
mobilenet
という名前で、もう 1 つはデータセット用のflowers
という名前のフォルダです。
接続のサービス アカウントに権限を付与する
コンソール
[IAM と管理] ページに移動
[アクセス権を付与] をクリックします。
[プリンシパルを追加します] ダイアログが開きます。
[新しいプリンシパル] フィールドに、前の手順でコピーしたサービス アカウント ID を入力します。
[ロールを選択] フィールドで、[Cloud Storage] を選択し、続いて [Storage オブジェクト閲覧者] を選択します。
[保存] をクリックします。
gcloud
Cloud Shell で gcloud storage buckets add-iam-policy-binding
コマンドを実行します。
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member=serviceAccount:MEMBER \ --role=roles/storage.objectViewer
MEMBER
は、先ほどコピーしたサービス アカウント ID に置き換えます。BUCKET_NAME
は、作成したバケットの名前に置き換えます。
詳細については、バケットレベルのポリシーにプリンシパルを追加するをご覧ください。
データセットを Cloud Storage にアップロードする
データセット ファイルを取得して、Cloud Storage で使用できるようにします。
- ローカルマシンに花のデータセットをダウンロードします。
flower_photos.tgz
ファイルを解凍します。flower_photos
フォルダを、さきほど作成したバケット内のflowers
フォルダにアップロードします。- アップロードが完了したら、
flower_photos
フォルダ内のLICENSE.txt
ファイルを削除します。
オブジェクト テーブルを作成する
アップロードした花のデータセットに基づいて、sample_images
という名前のオブジェクト テーブルを作成します。
SQL
BigQuery ページに移動します。
[エディタ] ペインで、次の SQL ステートメントを実行します。
CREATE EXTERNAL TABLE mobilenet_inference_test.sample_images WITH CONNECTION `us.lake-connection` OPTIONS( object_metadata = 'SIMPLE', uris = ['gs://BUCKET_NAME/flowers/*']);
BUCKET_NAME
は、作成したバケットの名前に置き換えます。
bq
Cloud Shell で bq mk
コマンドを実行して、接続を作成します。
bq mk --table \ --external_table_definition='gs://BUCKET_NAME/flowers/*@us.lake-connection' \ --object_metadata=SIMPLE \ mobilenet_inference_test.sample_images
BUCKET_NAME
は、作成したバケットの名前に置き換えます。
モデルを Cloud Storage にアップロードする
モデルファイルを取得して、Cloud Storage で使用できるようにします。
- MobileNet V3 モデルをローカルマシンにダウンロードします。これにより、モデル用の
saved_model.pb
ファイルとvariables
フォルダが提供されます。 saved_model.pb
ファイルとvariables
フォルダを、さきほど作成したバケット内のmobilenet
フォルダにアップロードします。
モデルを BigQuery ML に読み込む
BigQuery ページに移動します。
[エディタ] ペインで、次の SQL ステートメントを実行します。
CREATE MODEL `mobilenet_inference_test.mobilenet` OPTIONS( model_type = 'TENSORFLOW', model_path = 'gs://BUCKET_NAME/mobilenet/*');
BUCKET_NAME
は、作成したバケットの名前に置き換えます。
モデルを検査する
アップロードされたモデルを調べて、モデルの入力フィールドと出力フィールドを確認します
BigQuery ページに移動します。
[エクスプローラ] ペインでプロジェクトを開き、
mobilenet_inference_test
データセットを開き、[モデル] ノードを開きます。mobilenet
モデルをクリックします。表示されたモデルペインで、[スキーマ] タブをクリックします。
[ラベル] セクションを確認します。これは、モデルによって出力されるフィールドを示します。この場合、フィールド名の値は
feature_vector
です。[特徴] セクションを確認します。これは、モデルに入力する必要があるフィールドを示します。
ML.DECODE_IMAGE
関数のSELECT
ステートメントでこれらを参照します。この場合、フィールド名の値はinputs
です。
推論を実行する
mobilenet
モデルを使用して、sample_images
オブジェクト テーブルで推論を実行します。
BigQuery ページに移動します。
[エディタ] ペインで、次の SQL ステートメントを実行します。
SELECT * FROM ML.PREDICT( MODEL `mobilenet_inference_test.mobilenet`, (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 224, 224, FALSE) AS inputs FROM mobilenet_inference_test.sample_images) );
結果は次のようになります。
-------------------------------------------------------------------------------------------------------------- | feature_vector | uri | inputs | —------------------------------------------------------------------------------------------------------------- | 0.850297749042511 | gs://mybucket/flowers/dandelion/3844111216_742ea491a0.jpg | 0.29019609093666077 | —------------------------------------------------------------------------------------------------------------- | -0.27427938580513 | | 0.31372550129890442 | —------------------------- ------------------------ | -0.23189745843410492 | | 0.039215687662363052 | —------------------------- ------------------------ | -0.058292809873819351 | | 0.29985997080802917 | —-------------------------------------------------------------------------------------------------------------
クリーンアップ
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.