コンテンツに移動
AI & 機械学習

コンピュータ ビジョンで簡単に: Spring Boot と Java による Vision AI の作成

2023年6月9日
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 プロジェクト構造をブートストラップし、要件に応じたコード変更を開始できます。機能の全一覧については、このドキュメントをご覧ください。

前提条件

開発プロセスを詳しく見ていく前に、以下の前提条件を満たしていることをご確認ください。

  1. プロジェクトが作成され、課金が有効になっている Google Cloud アカウントを取得している

  2. Vision API、Translation API、Cloud Run API、Artifact Registry API が有効になっている

  3. Cloud Shell が有効になっている

  4. バケットが作成された 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 に変更してください。

https://storage.googleapis.com/gweb-cloudblog-publish/images/1_HAvUg7S.max-1500x1500.JPG

これにより、以下のとおり「spring-vision」配下にプロジェクト構造が作成されます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/2_GBASO36.max-700x700.JPG

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 に以下の依存関係が含まれていることを確認してください。

読み込んでいます...

読み込んでいます...

リポジトリ から次のファイルのクローンを作成し、置き換えます。プロジェクトの構造で、個々のフォルダ / パスにそれらを追加します。

  1. Application.java (/src/main/java/com/example/demo)

  2. TranslateText.java (/src/main/java/com/example/demo)

  3. VisionController.java (/src/main/java/com/example/demo)

  4. index.html (/src/main/resources/static)

  5. result.html (/src/main/resources/templates)

  6. 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 を生成します。以下に例を示します。

読み込んでいます...

VisionControllerextractText メソッドの場合は、結果を 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

https://storage.googleapis.com/gweb-cloudblog-publish/original_images/Cloud_Vision_AI.gif

まとめ

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


- Google、デベロッパー アドボケイト Abirami Sukumaran
投稿先