2023年8月18日

【Google Cloud】BigQuery MLの推論エンジン使ってみた!(Vision API,OCR,画像分析)


Content
みなさま、こんにちは。Google Cloud研究開発チームのY.Yです。

今回は2023年3月にGoogle Cloud(GCP)で公開された、BigQuery ML 推論エンジンという新機能を検証します。
このエンジンを使うと、下記のことがBigQueryで実行できるようになります。
 1. ONNX、XGBoost、TensorFlow等の BigQuery外部でトレーニングされたカスタムモデルをインポートして推論を実行する
 2. Vertex AI エンドポイントでホストされたモデルを使用して推論を実行する
 3. 最先端の事前トレーニング済み Cloud AI モデル(Vision、NLP、Translate)を用いて推論を実行する

本記事では上記3番を実際に使い、Cloud Storageに格納した画像ファイルへの推論を実行します。
(テキストの抽出、ラベル付け、オブジェクト検出)
BigQuery上でのSQLを使った画像分析処理について興味のある方は是非ご覧ください!

事前準備

オブジェクトテーブルの作成

まずはオブジェクトテーブルを作成します。
オブジェクトテーブルとは、Cloud Storageに格納したオブジェクトのメタデータを参照できる外部テーブルです。
オブジェクトテーブルを作成することで、Cloud Storage内のオブジェクト(今回は画像ファイル)に対して、BigQueryで分析できるようになります。

◆外部接続の作成

オブジェクトテーブルを作成するには外部接続(Cloud Storageへの接続)を作成する必要があります。

①BigQuery API & BigQuery Connection API が有効になっていない場合は、有効にします。

gcloud services enable bigquery.googleapis.com --project="プロジェクトID"
gcloud services enable bigqueryconnection.googleapis.com --project="プロジェクトID"

②コンソールからBigQueryのページを開き、エクスプローラから「+追加」を押下します。

③「外部データソースへの接続」を押下します。

④接続タイプを「Biglakeとリモート関数(クラウド リソース)」にし、接続を作成します。

作成すると、プロジェクト配下に追加されます。

◆テーブル作成

『外部接続の作成』で作成した外部接続を用いて、Cloud Storage内のオブジェクトを参照するテーブルを作成します。
①外部接続の接続情報を開き、接続に使用するサービスアカウントIDを確認します。

② ① のサービスアカウントにCloud Storageのオブジェクトに対する閲覧権限を付与します。

gcloud projects add-iam-policy-binding プロジェクトID \
--member='serviceAccount:サービスアカウントID' \
--role='roles/storage.objectViewer'

③オブジェクトテーブル作成に必要なリソースを準備します。(詳細は省略)
・Cloud Storageでバケットを作成し、推論に使うオブジェクトを格納する
・BigQueryでデータセットを作成する

④CREATE文でテーブルを作成します。

CREATE EXTERNAL TABLE dataset_id.table_id
WITH CONNECTION `接続を作成したリージョン.接続ID`
OPTIONS(
object_metadata = 'SIMPLE',
uris = ["gs://バケット名/オブジェクトパス"]
);

(※「gs://バケット名/*.jpg」のように複数ファイルを指定することもできます)

モデル作成

次に、Vision APIを使用するモデルを作成します。
①Vision APIがまだ有効になっていない場合は有効にします。

gcloud services enable vision.googleapis.com --project="プロジェクトID"

②『外部接続の作成』で作成した外部接続用のサービスアカウントに必要なロールを付与します。

gcloud projects add-iam-policy-binding 'プロジェクトNo' --member='serviceAccount:接続サービスアカウントID' --role='roles/serviceusage.serviceUsageConsumer' --condition=None
gcloud projects add-iam-policy-binding 'プロジェクトNo' --member='serviceAccount:接続サービスアカウントID' --role='roles/bigquery.connectionUser' --condition=None

③CREATE MODEL文でモデルを作成します。

CREATE MODEL `(プロジェクトID.)データセットID.モデルID`
REMOTE WITH CONNECTION `(プロジェクトID.)接続リージョン.接続名`
OPTIONS(REMOTE_SERVICE_TYPE = 'CLOUD_AI_VISION_V1'
);

推論の実行

Vision APIで推論を実行するには、ML.ANNOTATE_IMAGEテーブル値関数(TVF)を使用します。
この関数で以下のVision API機能のどれを使用するかを指定します。
 • FACE_DETECTION(顔検出)
 • LANDMARK_DETECTION(ランドマーク検出)
 • LOGO_DETECTION(ロゴ検出)
 • LABEL_DETECTION(ラベル検出)
 • TEXT_DETECTION(画像からのテキスト検出)
 • DOCUMENT_TEXT_DETECTION(PDF/TIFファイルからのテキスト検出)
 • IMAGE_PROPERTIES(画像プロパティ検出)
 • OBJECT_LOCALIZATION(オブジェクト検出)

テキスト検出

まずは、JPG画像ファイルからテキストを検出してみます。
下の画像をデータソースとするオブジェクトテーブルにクエリを実行します。
(今回の検証では「パブリックドメインOCR学習用データセット(令和3年度OCRテキスト化事業分)」という国立国会図書館のデータを利用しています。)

SELECT
ml_annotate_image_result, ml_annotate_image_status
FROM
ML.ANNOTATE_IMAGE( MODEL `vision_research.vision_model`,
TABLE `vision_research.ocr_testdata`,
STRUCT(['TEXT_DETECTION'] AS vision_features));

※ml_annotate_image_result:Vision APIからの応答(JSON)
 ml_annotate_image_status:APIからの応答ステータス(成功時は空)
 vision_research:データセットID
 ocr_testdata:オブジェクトテーブル名
 vision_model:モデル名
 画像からテキストを取得するため、使用する機能はTEXT_DETECTIONを指定しています。
 SELECT句を*(アスタリスク)にすると、上記の2フィールドとオブジェクトテーブルの全フィールドを取得できます。

ml_annotate_image_resultフィールドから読み取ったテキスト部分のみを取得してみます。
先程のSQLのSELECT句を

SELECT  JSON_VALUE(ml_annotate_image_result.full_text_annotation.text) AS FULL_TEXT

に置き換えます。

【読み取り結果】

一、神勅 大御言葉としては天照大神が仰せられました。然し天照大神の
御徳のあらはれとしての大御言葉であります。
のみならず、いざなぎ、 いざなみ二神の御徳のあらはれであります。
のみならず、代々の神様の御徳のあらはれであります。
のみならず、神話の最初の神様の御徳のあらはれであります。
のみならず、日本語の發生と同時に神奉戴の精神が活躍してゐます。
のみならず、代々の天皇の御徳のあらはれであります。(十九頁)
一、敵前上陸 排戰 地物利用 攻敵情偵察必勝の信念、陛下の軍
人といふ信念等みな~神武天皇様に始まつてゐます。

ラベル・オブジェクト検出

続いて、下記の画像に対してラベル検出とオブジェクト検出をしてみます。

以下のクエリを実行します。
今回はオブジェクトとラベルを検出するため、’OBJECT_LOCALIZATION’と’LABEL_DETECTION’を指定します。

SELECT
ml_annotate_image_result
FROM
ML.ANNOTATE_IMAGE( MODEL `vision_research.vision_model`,
TABLE `vision_research.ocr_testdata`,
STRUCT(['OBJECT_LOCALIZATION','LABEL_DETECTION'] AS vision_features));

ラベルはPenguin、オブジェクトはFootballと返ってきました。
一方、Vision APIの試してみましょうページで検出したときは、下のような検出結果を得られました。
上のクエリではスコアが一番高いものがクエリ結果として返されたようです。
【オブジェクト】

【ラベル】

まとめ

本記事では、BigQuery MLの推論エンジンでVision APIのトレーニング済みモデルを使い、画像ファイルへの推論を検証いたしました。

Vision APIによる画像分析を簡単なSQLを書くだけでできるのでとても便利ですね。
推論エンジンにより、高度なプログラミング知識がなくても、Googleの様々なML技術を簡単に使用することができます。
みなさまも是非お試しください。

※本検証時点では、ML.ANNOTATE_IMAGE関数はプレビュー段階の機能であり、利用するには登録フォームから申請が必要でした。利用を検討されている方は公式ドキュメントをご確認ください。
また、オブジェクトテーブル用の BigQuery ML は、予約による定額料金を使用している場合にのみサポートされていました。こちらも公式ドキュメントをご確認ください。

当社、システムサポートは、Google Cloudの導入・移行・運営支援を行っています。
本記事で行ったような画像認識などのGoogleのAI・ML技術の導入もご支援いたします。
お問い合わせは以下よりお願い致します。

Google Cloud導入についてのお問い合わせはこちら

2023年8月18日 【Google Cloud】BigQuery MLの推論エンジン使ってみた!(Vision API,OCR,画像分析)

Category Google Cloud

ご意見・ご相談・料金のお見積もりなど、
お気軽にお問い合わせください。

お問い合わせはこちら