チュートリアル: 特徴ベクトルモデルを使用してオブジェクト テーブルで推論を実行する
このチュートリアルでは、花のデータセットからの画像に基づいてオブジェクト テーブルを作成し、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.
データセットを作成する
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.