コンピュータ ビジョンで簡単に: Spring Boot と Java による Vision AI の作成
Google Cloud Japan Team
※この投稿は米国時間 2023 年 6 月 9 日に、Google Cloud blog に投稿されたものの抄訳です。
このデータドリブン アプリケーションの時代、コンピュータ ビジョンのような高度な ML サービスと AI サービスを活用することの重要性はますます高まっています。これらのサービスの一つである Vision API は、高度な画像解析機能を提供しています。このブログ記事では、Spring Boot と Java を使用してコンピュータ ビジョン アプリケーションを作成し、プロジェクトにおける画像認識と画像解析を実現する方法について説明します。このアプリケーションの UI は、記述または印刷されたテキストを含む画像の公開 URL を入力として受け付け、そのテキストを抽出し、言語を検出して、その言語がサポート対象の言語のいずれかであれば、そのテキストの英訳を生成します。
Spring Boot と Google Cloud
Spring Boot は、Spring ベースのアプリケーションを作成するための優れたオープンソースのフレームワークです。自動構成、開始条件の依存関係、組み込みサーバーが準備されているため、開発が簡単になります。また、指標やヘルスチェックなどの本番環境に対応した機能も備わっています。Spring Boot を使用すると、複雑な構成や依存関係を気にすることなく、コードの記述と効率の良いアプリケーションのデプロイに集中できます。この機能がエンタープライズ アプリに最適な選択肢であることはよく知られていますが、新たに GraalVM を使用したネイティブ イメージ ビルダーのサポートを正式に開始しました。これにより、Java ランタイムを必要としないネイティブのスタンドアロン実行ファイルの作成が可能となり、無駄の少ない、きわめて迅速な起動が実現します。Google Cloud で Spring Native をお試しください。
Spring Cloud GCP ライブラリを採用することで、Spring Boot アプリケーションが Google Cloud サービスを簡単に利用できるようになります。Spring Cloud GCP は、10 種類を超える Google Cloud サービスに対して Spring Boot API を提供します。つまり、Google Cloud のクライアント ライブラリを個別に学習することなく、Google Cloud サービスの利点を活用できます。Google Cloud に Spring Boot アプリケーションを移行したり、Google Cloud で新しい Spring Boot アプリケーションを作成したりするのは非常に簡単です。たった 1 つのコマンドで、本番環境に対応した Spring Boot プロジェクト構造をブートストラップし、要件に応じたコード変更を開始できます。機能の全一覧については、このドキュメントをご覧ください。
前提条件
開発プロセスを詳しく見ていく前に、以下の前提条件を満たしていることをご確認ください。
プロジェクトが作成され、課金が有効になっている Google Cloud アカウントを取得している
Vision API、Translation API、Cloud Run API、Artifact Registry API が有効になっている
バケットが作成された Cloud Storage API が有効になっており、サポートされている言語のテキストまたは手書き文字を含む画像がアップロードされている(または、このブログ記事で提示しているサンプル画像のリンクを使用してもかまいません)
Google Cloud API を有効にする手順については、このドキュメントをご覧ください。
Spring Boot プロジェクトのブートストラップ
まず、お好みの IDE または Spring Initializr を使用して、新しい Spring Boot プロジェクトを作成します。Spring Web、Spring Cloud GCP、Vision AI など、必要な依存関係をプロジェクトの構成に含めます。または、Cloud Shell から Spring Initializr を使用して、以下の手順で Spring Boot アプリケーションを簡単にブートストラップすることもできます。
1. Cloud Shell のターミナルを開き、正しいプロジェクトを指定しているか、自身が認証されているかを確認します(正しいプロジェクトを指定できていない場合は、以下のコマンドで正しいプロジェクトを指定できます)。
2. 以下のコマンドを実行して、Spring Boot プロジェクトを作成します。
spring-vision はプロジェクト名です。必要に応じて変更してください。
bootVersion は Spring Boot のバージョンです。実装時に要求された場合は必ず更新してください。
type はプロジェクトのビルドツール タイプのバージョンです。必要に応じて gradle に変更してください。
これにより、以下のとおり「spring-vision」配下にプロジェクト構造が作成されます。
pom.xml
には、プロジェクトのすべての依存関係が含まれています(このコマンドを使用して構成した依存関係は、pom.xml にすでに追加されています)。
src/main/java/com/example/demo には、ソースクラス .java ファイルがあります。resources
には、プロジェクトが使用する画像、XML、テキストファイル、静的コンテンツが含まれており、これらは個別に管理されます。application.properties
を使うと、アプリケーションのプロファイル固有のプロパティを定義するための管理機能を維持、管理できます。
Vision API の構成
Vision API を有効にすると、アプリケーションで API 認証情報を構成できるようになります。認証を設定するために、オプションでアプリケーションのデフォルト認証情報を使用することもできます。ただし、このデモ実装では、認証情報の使用は実装していません。
ビジョン サービスと翻訳サービスの実装
Vision API とやり取りするサービスクラスを作成します。必要な依存関係を挿入し、Vision API クライアントを使用して画像分析リクエストを送信します。アプリケーションの要件に応じて、画像のラベリング、顔検出、認識などのタスクを実行するメソッドを実装できます。このデモでは、手書き入力の抽出と翻訳のメソッドを使用します。このために、pom.xml に以下の依存関係が含まれていることを確認してください。
リポジトリ から次のファイルのクローンを作成し、置き換えます。プロジェクトの構造で、個々のフォルダ / パスにそれらを追加します。
Application.java
(/src/main/java/com/example/demo
)TranslateText.java
(/src/main/java/com/example/demo
)VisionController.java
(/src/main/java/com/example/demo
)index.html
(/src/main/resources/static
)result.html
(/src/main/resources/templates)pom.xml
org.springframework.cloud.gcp.vision.CloudVisionTemplate
というサービスの extractTextFromImage
というメソッドで、画像入力からテキストを抽出できます。com.google.cloud.translate.v3
というサービスの getTranslatedText
というメソッドで、画像から抽出したテキストを渡し、レスポンスとして希望のターゲット言語の翻訳テキストを取得できます(ソースがサポートされている言語リストに含まれている場合)。
REST API の構築
Vision API の機能を公開する REST エンドポイントを設計、実装します。受信リクエストを処理し、Vision API サービスを利用して画像を処理するコントローラを作成し、解析結果を返すコントローラを作成します。
このデモでは、VisionController
クラスがエンドポイントを実装し、受信リクエストを処理し、Vision API と Cloud Translation サービスを呼び出して、ビューレイヤーに結果を返します。REST エンドポイントの GET メソッドの実装は、以下のとおりです。
上の実装の TranslateText クラスには、以下のとおり、Cloud Translation サービスを呼び出すメソッドがあります。
VisionController
クラスにより、REST の GET メソッドを実装しています。
フロントエンド開発のために Thymeleaf を統合
Spring Boot でアプリケーションを構築する場合、フロントエンド開発でよく選ばれる手段として、Thymeleaf の活用が挙げられます。Thymeleaf はサーバー側の Java テンプレート エンジンで、動的コンテンツを HTML ページにシームレスに統合できます。Thymeleaf は、サーバー側の式を組み込んだ HTML テンプレートをユーザーに作成させることで、スムーズな開発を可能にします。これらの式は、Spring Boot バックエンドからのデータを動的にレンダリングするために使用でき、これによって、Vision API サービスにより実行された画像解析の結果を表示しやすくなります。
まず、Spring Boot プロジェクトに Thymeleaf の必要な依存関係があることを確認します。以下のとおり、pom.xml に Thymeleaf Starter の依存関係を含めることができます。
コントローラ メソッドで、Vision API サービスから解析結果を取得し、モデルに追加します。モデルは、Thymeleaf が HTML テンプレートをレンダリングするために使用されるデータを表します。モデルにデータが入力されると、レンダリングしたい Thymeleaf のテンプレート名が返されます。Thymeleaf はテンプレートを処理し、サーバー側の式を実際のデータに置き換え、クライアントのブラウザに送信される最終的な HTML を生成します。以下に例を示します。
VisionController
の extractText
メソッドの場合は、結果を String 形式で返しており、モデルには追加していません。しかし、ページ送信時の index.html
で GET メソッドの extractText
メソッドを呼び出しています。
Thymeleaf を使用すると、ユーザーが画像をアップロードし、Vision API の分析をトリガーして、その結果をリアルタイムで確認できる、シームレスなユーザー体験を実現できます。フロントエンド開発に Thymeleaf を活用することで、Vision AI アプリケーションの可能性を最大限に引き出しましょう。
Cloud Run を使用した Spring Boot アプリケーションのデプロイ
サービスクラスとコントローラ クラスのユニットテストを記述し、src/test/java/com/example
フォルダの内の適切な機能を確保します。安定性に確信を持てたら、JAR ファイルのようなデプロイ可能なアーティファクトに Spring Boot アプリケーションをパッケージ化し、Google Cloud 上のサーバーレス コンピューティング プラットフォームである Cloud Run にデプロイします。このステップでは、Cloud Run を使用して、コンテナ化した Spring Boot アプリケーションをデプロイすることに焦点を当てます。
a. Cloud Shell から以下の手順を実行し、アプリケーションをパッケージ化します(ターミナルのプロンプトがプロジェクトのルートフォルダを指しているか確認してください)。
以下のコマンドでビルドします。
ビルドが成功したら、以下のとおりローカルで実行してテストします。
b. 以下のとおり、Jib で Spring Boot アプリケーションをコンテナ化します。
手動で Dockerfile
を作成してコンテナ イメージを構築する代わりに、Jib ユーティリティを使用してコンテナ化プロセスを簡略化できます。Jib は、ビルドツール(Maven や Gradle など)と直接統合できるプラグインで、Dockerfile
を記述せずに最適化されたコンテナ イメージをビルドできます。先に進む前に、Artifact Registry API を有効にする必要があります(コンテナ レジストリよりも Artifact Registry の使用をおすすめします)。その後、以下のとおり Jib を実行して Docker イメージを構築し、レジストリに公開します。
注: このテストでは Jib Maven プラグインを pom.xml
で構成していませんが、高度な使用の場合は、より多くの構成オプションのあるプラグインを pom.xml
に追加することもできます。
c. コンテナ(前のステップで Artifact Registry にプッシュしたもの)を Cloud Run にデプロイします。これも、以下のとおり 1 つのコマンドで行えます。
これは、UI から行うこともできます。Google Cloud コンソールに移動し、Cloud Run サービスを探します。[サービスの作成] をクリックし、画面の指示に従います。レジストリに push したコンテナ イメージを指定し、必要なデプロイ設定(CPU 割り当てや自動スケーリングなど)を行い、デプロイに適したリージョンを選択します。アプリケーションに固有の環境変数を設定できます。これらの変数には、認証情報(API キーなど)、データベース接続文字列、または Vision AI アプリケーションが正しく機能するために必要なその他の構成を含めることができます。デプロイが正常に完了すると、アプリケーションへのエンドポイントが表示されるはずです。
こちらのデモで Cloud Run が作成したエンドポイントは、https://vision-app-********-uc.a.run.app です。
Vision AI アプリを使ってみる
デモ用として、以下の画像 URL をアプリに読み込ませ、翻訳できます。
https://storage.googleapis.com/img_public_test/tamilwriting1.jfif


まとめ
これで、Spring Boot と Java を使用して、Vision AI アプリケーションを作成することができました。Vision AI を活用することで、アプリケーションがラベリング、顔検出などの高度な画像解析を実行できるようになりました。Spring Boot のインテグレーションは、スケーラブルで堅牢な Google Cloud ネイティブのアプリケーションを構築するための強固な基盤となります。Vision AI、Cloud Run、Cloud Translation などがもつ優れた性能を引き続き探求し、アプリケーションに機能を追加して強化しましょう。詳細については、Vision API、Cloud Translation、GCP Spring のドキュメントをご覧ください。Spring Native オプションを使用して同じ実験を試してみてください。さらに、この API の Model Garden での利用方法を確認して、ジェネレーティブ AI の世界を覗いてみましょう。