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

1. はじめに

このデータドリブン アプリケーションの時代、コンピュータ ビジョンのような高度な ML サービスと AI サービスを活用することの重要性はますます高まっています。これらのサービスの一つである Vision API は、高度な画像解析機能を提供しています。この Codelab では、Spring Boot と Java を使用してコンピュータ ビジョン アプリケーションを作成し、プロジェクトにおける画像認識と画像解析を実現する方法について説明します。このアプリケーションの UI は、記述または印刷されたテキストを含む画像の公開 URL を入力として受け付け、そのテキストを抽出し、言語を検出して、その言語がサポート対象の言語のいずれかであれば、そのテキストの英訳を生成します。

作成するアプリの概要

このチュートリアルでは、

  • Vision API と Google Cloud Translation API を使用する Java Spring Boot アプリケーション
  • Cloud Run にデプロイ済み

2. 必要なもの

  • ブラウザ(ChromeFirefox など)
  • 課金を有効にした Google Cloud プロジェクト

前提条件は次のとおりです。

プロジェクトを作成する

  1. プロジェクトが作成され、課金が有効になっている Google Cloud アカウント
  2. Vision API、Translation API、Cloud Run API、Artifact Registry API が有効になっている
  3. Cloud Shell が有効になっている
  4. バケットが作成された Cloud Storage API が有効になっており、サポートされている言語のテキストまたは手書き文字を含む画像がアップロードされている(または、このブログ記事で提示しているサンプル画像のリンクを使用してもかまいません)

Google Cloud APIs を有効にする手順については、ドキュメントをご覧ください。

Cloud Shell をアクティブにする

  1. Cloud Shell(Google Cloud で動作するコマンドライン環境)を使用します。この環境には bq がプリロードされています。

Cloud コンソールで、右上にある [Cloud Shell をアクティブにする] をクリックします。

51622c00acec2fa.png

  1. Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。Cloud Shell で次のコマンドを実行して、認証されたことを確認します。
gcloud auth list
  1. Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project
  1. プロジェクトが設定されていない場合は、次のコマンドを使用して設定します。
gcloud config set project <PROJECT_ID>

gcloud コマンドとその使用方法については、ドキュメントをご覧ください。

3. Spring Boot プロジェクトのブートストラップ

まず、お好みの IDE または Spring Initializr を使用して、新しい Spring Boot プロジェクトを作成します。Spring Web、Spring Cloud GCP、Vision AI など、必要な依存関係をプロジェクトの構成に含めます。または、Cloud Shell から Spring Initializr を使用して、以下の手順で Spring Boot アプリケーションを簡単にブートストラップすることもできます。

次のコマンドを実行して、Spring Boot プロジェクトを作成します。

curl https://start.spring.io/starter.tgz -d packaging=jar -d dependencies=cloud-gcp,web,lombok -d baseDir=spring-vision -d type=maven-project -d bootVersion=3.0.1.RELEASE | tar -xzvf -

spring-vision はプロジェクトの名前です。要件に応じて変更してください。

bootVersion は Spring Boot のバージョンです。実装時に必要に応じて更新してください。

type はプロジェクト ビルドツールのタイプのバージョンです。必要に応じて gradle に変更できます。

37813d3982ce2e42.png

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

3e70d45d88ac6935.png

pom.xml には、プロジェクトのすべての依存関係が含まれています(このコマンドを使用して構成した依存関係は、pom.xml にすでに追加されています)。

src/main/java/com/example/demo には、ソースクラスの .java ファイルがあります。

resources には、プロジェクトで使用される画像、XML、テキスト ファイル、静的コンテンツが含まれており、これらは個別に管理されます。

application.properties を使用すると、アプリケーションのプロファイル固有のプロパティを定義する管理者機能を維持できます。

4. Vision API の構成

Vision API を有効にすると、アプリケーションで API 認証情報を構成できるようになります。認証を設定するために、オプションでアプリケーションのデフォルト認証情報を使用することもできます。ただし、このデモ実装では、認証情報の使用は実装していません。

ビジョン サービスと翻訳サービスの実装

Vision API とやり取りするサービスクラスを作成します。必要な依存関係を挿入し、Vision API クライアントを使用して画像分析リクエストを送信します。アプリケーションの要件に応じて、画像のラベリング、顔検出、認識などのタスクを実行するメソッドを実装できます。このデモでは、手書き入力の抽出と翻訳のメソッドを使用します。

このために、pom.xml に以下の依存関係が含まれていることを確認してください。

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-gcp-starter-vision</artifactId>
</dependency>
<dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-translate</artifactId>
</dependency>

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

  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 メソッドの実装は、以下のとおりです。

@GetMapping("/extractText")
  public String extractText(String imageUrl) throws IOException {
    String textFromImage =
   this.cloudVisionTemplate.extractTextFromImage(this.resourceLoader.getResource(imageUrl));


    TranslateText translateText = new TranslateText();
    String result = translateText.translateText(textFromImage);
    return "Text from image translated: " + result;
  }

上記の実装の TranslateText クラスには、Cloud Translation サービスを呼び出すメソッドがあります。

 String targetLanguage = "en";
 TranslateTextRequest request =
         TranslateTextRequest.newBuilder()
             .setParent(parent.toString())
             .setMimeType("text/plain")
             .setTargetLanguageCode(targetLanguage)
             .addContents(text)
             .build();
     TranslateTextResponse response = client.translateText(request);
     // Display the translation for each input text provided
     for (Translation translation : response.getTranslationsList()) {
       res = res + " ::: " + translation.getTranslatedText();
        System.out.printf("Translated text : %s\n", res);
     }

VisionController クラスにより、REST の GET メソッドを実装しています。

フロントエンド開発のために Thymeleaf を統合する

Spring Boot でアプリケーションを構築する場合、フロントエンド開発でよく選ばれる手段として、Thymeleaf の活用が挙げられます。Thymeleaf はサーバー側の Java テンプレート エンジンで、動的コンテンツを HTML ページにシームレスに統合できます。Thymeleaf は、サーバー側の式を組み込んだ HTML テンプレートをユーザーに作成させることで、スムーズな開発を可能にします。これらの式は、Spring Boot バックエンドからのデータを動的にレンダリングするために使用でき、これによって、Vision API サービスにより実行された画像解析の結果を表示しやすくなります。

まず、Spring Boot プロジェクトに Thymeleaf の必要な依存関係があることを確認します。以下のとおり、pom.xml に Thymeleaf Starter の依存関係を含めることができます。

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

コントローラ メソッドで、Vision API サービスから解析結果を取得し、モデルに追加します。モデルは、Thymeleaf が HTML テンプレートをレンダリングするために使用されるデータを表します。モデルにデータが入力されると、レンダリングしたい Thymeleaf のテンプレート名が返されます。Thymeleaf はテンプレートを処理し、サーバー側の式を実際のデータに置き換え、クライアントのブラウザに送信される最終的な HTML を生成します。

VisionControllerextractText メソッドの場合は、結果を String 形式で返しており、モデルには追加していません。しかし、ページ送信時の index.html で GET メソッドの extractText メソッドを呼び出しています。Thymeleaf を使用すると、ユーザーが画像をアップロードし、Vision API の分析をトリガーして、その結果をリアルタイムで確認できる、シームレスなユーザー体験を実現できます。フロントエンド開発に Thymeleaf を活用することで、Vision AI アプリケーションの可能性を最大限に引き出しましょう。

<form action="/extractText">
        Web URL of image to analyze:
        <input type="text"
               name="imageUrl"
               value=""
        <input type="submit" value="Read and Translate" />
</form>

5. Cloud Run にコンピュータ ビジョン アプリをデプロイする

サービスクラスとコントローラ クラスのユニットテストを記述し、/src/test/java/com/example フォルダの内の適切な機能を確保します。安定性に確信を持てたら、JAR ファイルのようなデプロイ可能なアーティファクトに Spring Boot アプリケーションをパッケージ化し、Google Cloud 上のサーバーレス コンピューティング プラットフォームである Cloud Run にデプロイします。このステップでは、Cloud Run を使用して、コンテナ化した Spring Boot アプリケーションをデプロイすることに焦点を当てます。

  1. Cloud Shell から以下の手順を実行し、アプリケーションをパッケージ化します(ターミナルのプロンプトがプロジェクトのルートフォルダを指しているか確認してください)。

構築:

./mvnw package

ビルドが成功したら、以下のとおりローカルで実行してテストします。

./mvnw spring-boot:run
  1. 以下のとおり、Jib で Spring Boot アプリケーションをコンテナ化します。

Dockerfile を手動で作成してコンテナ イメージをビルドする代わりに、Jib ユーティリティを使用してコンテナ化プロセスを簡略化できます。Jib は、ビルドツール(Maven や Gradle など)と直接統合できるプラグインで、Dockerfile を記述せずに最適化されたコンテナ イメージをビルドできます。先に進む前に、Artifact Registry API を有効にする必要があります(コンテナ レジストリよりも Artifact Registry の使用をおすすめします)。その後、以下のとおり Jib を実行して Docker イメージを構築し、レジストリに公開します。

$ ./mvnw com.google.cloud.tools:jib-maven-plugin:3.1.1:build -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/vision-jib

注: このテストでは Jib Maven プラグインを pom.xml で構成していませんが、高度な使用の場合は、より多くの構成オプションのあるプラグインを pom.xml に追加することもできます。

  1. コンテナ(前のステップで Artifact Registry にプッシュしたもの)を Cloud Run にデプロイします。これも、以下のとおり 1 つのコマンドで行えます。
gcloud run deploy vision-app --image gcr.io/$GOOGLE_CLOUD_PROJECT/vision-jib --platform managed --region us-central1 --allow-unauthenticated --update-env-vars

これは、UI から行うこともできます。Google Cloud コンソールに移動し、Cloud Run サービスを探します。[サービスの作成] をクリックし、画面の指示に従います。レジストリに push したコンテナ イメージを指定し、必要なデプロイ設定(CPU 割り当てや自動スケーリングなど)を行い、デプロイに適したリージョンを選択します。アプリケーションに固有の環境変数を設定できます。これらの変数には、認証情報(API キーなど)、データベース接続文字列、または Vision AI アプリケーションが正しく機能するために必要なその他の構成を含めることができます。デプロイが正常に完了すると、アプリケーションへのエンドポイントが表示されます。

Vision AI アプリを使ってみる

デモ用として、以下の画像 URL をアプリに読み込ませ、翻訳できます。https://storage.googleapis.com/img_public_test/tamilwriting1.jfif

654c1b0de0db482.gif

6. クリーンアップ

この投稿で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。
  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

7. 完了

おめでとうございます!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 の世界を覗いてみましょう。