Maschinelles Sehen leicht gemacht: Vision AI auf Spring Boot und Java

1. Einführung

In der heutigen Zeit datengesteuerter Anwendungen wird es immer wichtiger, fortschrittliche Dienste für maschinelles Lernen und künstliche Intelligenz wie Computer Vision zu nutzen. Ein solcher Dienst ist die Vision API, die leistungsstarke Funktionen zur Bildanalyse bietet. In diesem Codelab erfahren Sie, wie Sie eine Computer Vision-Anwendung mit Spring Boot und Java erstellen, um das Potenzial der Bilderkennung und -analyse in Ihren Projekten zu nutzen. Die Anwendungs-UI akzeptiert öffentliche URLs von Bildern, die geschriebenen oder gedruckten Text enthalten, als Eingabe, extrahiert den Text, erkennt die Sprache und generiert, sofern es sich um eine der unterstützten Sprachen handelt, die englische Übersetzung dieses Texts.

Aufgaben

Sie erstellen

  • Eine Java Spring Boot-Anwendung zur Verwendung der Vision API und der Google Cloud Translation API
  • In Cloud Run bereitgestellt

2. Voraussetzungen

  • Ein Browser, z. B. Chrome oder Firefox
  • Ein Google Cloud-Projekt mit aktivierter Abrechnung

Es gelten die folgenden Voraussetzungen:

Projekt erstellen

  1. Ein Google Cloud-Konto mit einem erstellten Projekt und aktivierter Abrechnung
  2. Vision API, Translation API, Cloud Run API und Artifact Registry API aktiviert
  3. Cloud Shell aktiviert
  4. Die Cloud Storage API ist aktiviert, ein Bucket wurde erstellt und Bilder mit Text oder Handschrift in lokal unterstützten Sprachen wurden hochgeladen (oder Sie können die in diesem Blog bereitgestellten Beispielbildlinks verwenden).

Eine Anleitung zum Aktivieren von Google Cloud APIs finden Sie in der Dokumentation.

Cloud Shell aktivieren

  1. Sie verwenden Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird und in der bq vorinstalliert ist:

Klicken Sie in der Cloud Console rechts oben auf „Cloud Shell aktivieren“.

51622c00acec2fa.png

  1. Sobald die Verbindung mit der Cloud Shell hergestellt ist, sehen Sie, dass Sie bereits authentifiziert sind und für das Projekt schon Ihre Projekt-ID eingestellt ist. Führen Sie in der Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list
  1. Führen Sie den folgenden Befehl in Cloud Shell aus, um zu bestätigen, dass der gcloud-Befehl Ihr Projekt kennt.
gcloud config list project
  1. Wenn Ihr Projekt nicht festgelegt ist, verwenden Sie den folgenden Befehl, um es festzulegen:
gcloud config set project <PROJECT_ID>

Informationen zu gcloud-Befehlen und deren Verwendung finden Sie in der Dokumentation.

3. Spring Boot-Projekt booten

Erstellen Sie zuerst ein neues Spring Boot-Projekt mit Ihrer bevorzugten IDE oder Spring Initializr. Fügen Sie der Konfiguration Ihres Projekts die erforderlichen Abhängigkeiten wie Spring Web, Spring Cloud GCP und Vision AI hinzu. Alternativ können Sie Spring Initializr über Cloud Shell verwenden, um Ihre Spring Boot-Anwendung ganz einfach zu starten.

Führen Sie den folgenden Befehl aus, um Ihr Spring Boot-Projekt zu erstellen:

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 ist der Name Ihres Projekts. Ändern Sie ihn nach Bedarf.

bootVersion ist die Version von Spring Boot. Aktualisieren Sie sie bei Bedarf zum Zeitpunkt der Implementierung.

type ist die Version des Projekt-Build-Tool-Typs. Sie können sie bei Bedarf in „gradle“ ändern.

37813d3982ce2e42.png

Dadurch wird eine Projektstruktur unter „spring-vision“ erstellt, wie unten dargestellt:

3e70d45d88ac6935.png

Die Datei pom.xml enthält alle Abhängigkeiten für das Projekt. Die Abhängigkeiten, die Sie mit diesem Befehl konfiguriert haben, sind bereits in Ihrer Datei „pom.xml“ enthalten.

src/main/java/com/example/demo enthält die Quellklassen-Java-Dateien.

Ressourcen enthalten die Bilder, XML- und Textdateien sowie die statischen Inhalte, die im Projekt verwendet werden und unabhängig voneinander verwaltet werden.

Mit application.properties können Sie die Administratorfunktionen beibehalten, um profilspezifische Eigenschaften der Anwendung zu definieren.

4. Vision API konfigurieren

Nachdem Sie die Vision API aktiviert haben, können Sie die Anmeldedaten der API in Ihrer Anwendung konfigurieren. Optional können Sie Standardanmeldedaten für Anwendungen für die Einrichtung der Authentifizierung verwenden. In dieser Demoimplementierung habe ich die Verwendung von Anmeldedaten jedoch nicht implementiert.

Vision- und Übersetzungsdienste implementieren

Erstellen Sie eine Dienstklasse, die mit der Vision API interagiert. Fügen Sie die erforderlichen Abhängigkeiten ein und verwenden Sie den Vision API-Client, um Bildanalyseanfragen zu senden. Sie können Methoden implementieren, um Aufgaben wie Bildbeschriftung, Gesichtserkennung und ‑identifizierung auszuführen, je nach den Anforderungen Ihrer Anwendung. In dieser Demo verwenden wir Methoden zur Handschrifterkennung und ‑übersetzung.

Dazu müssen Sie die folgenden Abhängigkeiten in „pom.xml“ einfügen.

<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>

Klonen / Ersetzen Sie die folgenden Dateien aus dem Repository und fügen Sie sie den entsprechenden Ordnern / Pfaden in der Projektstruktur hinzu:

  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

Mit der Methode extractTextFromImage im Dienst org.springframework.cloud.gcp.vision.CloudVisionTemplate können Sie Text aus Ihrer Bildeingabe extrahieren. Mit der Methode getTranslatedText aus dem Dienst com.google.cloud.translate.v3 können Sie den extrahierten Text aus Ihrem Bild übergeben und den übersetzten Text in der gewünschten Zielsprache als Antwort erhalten, sofern die Quelle in einer der unterstützten Sprachen ist.

REST API erstellen

Entwerfen und implementieren Sie die REST-Endpunkte, die die Vision API-Funktionen verfügbar machen. Erstellen Sie Controller, die eingehende Anfragen verarbeiten und den Vision API-Dienst verwenden, um die Bilder zu verarbeiten und die Analyseergebnisse zurückzugeben. In dieser Demo implementiert die Klasse VisionController den Endpunkt, verarbeitet die eingehende Anfrage, ruft die Vision API- und Cloud Translation-Dienste auf und gibt das Ergebnis an die Ansichtsebene zurück. Die Implementierung der GET-Methode für den REST-Endpunkt sieht so aus:

@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;
  }

Die Klasse TranslateText in der obigen Implementierung hat die Methode, die den Cloud Translation-Dienst aufruft:

 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);
     }

Mit der Klasse VisionController haben wir die GET-Methode für die REST-Implementierung.

Thymeleaf für die Front-End-Entwicklung einbinden

Wenn Sie eine Anwendung mit Spring Boot erstellen, ist Thymeleaf eine beliebte Wahl für die Frontend-Entwicklung. Thymeleaf ist eine serverseitige Java-Vorlagen-Engine, mit der Sie dynamische Inhalte nahtlos in Ihre HTML-Seiten einfügen können. Thymeleaf ermöglicht eine reibungslose Entwicklung, da Sie HTML-Vorlagen mit eingebetteten serverseitigen Ausdrücken erstellen können. Mit diesen Ausdrücken können Sie Daten aus Ihrem Spring Boot-Backend dynamisch rendern. So lassen sich die Ergebnisse der Bildanalyse durch den Vision API-Dienst einfacher darstellen.

Prüfen Sie, ob Sie die erforderlichen Abhängigkeiten für Thymeleaf in Ihrem Spring Boot-Projekt haben. Sie können die Thymeleaf Starter-Abhängigkeit in Ihre pom.xml einfügen:

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

Rufen Sie in der Controllermethode das Analyseergebnis vom Vision API-Dienst ab und fügen Sie es dem Modell hinzu. Das Modell stellt die Daten dar, die von Thymeleaf zum Rendern der HTML-Vorlage verwendet werden. Sobald das Modell gefüllt ist, geben Sie den Namen der Thymeleaf-Vorlage zurück, die gerendert werden soll. Thymeleaf verarbeitet die Vorlage, ersetzt die serverseitigen Ausdrücke durch die tatsächlichen Daten und generiert den endgültigen HTML-Code, der an den Browser des Clients gesendet wird.

Im Fall der Methode extractText in VisionController haben wir das Ergebnis als String zurückgegeben und nicht dem Modell hinzugefügt. Wir haben jedoch die GET-Methode extractText für das index.html beim Senden der Seite aufgerufen. Mit Thymeleaf können Sie eine nahtlose Nutzererfahrung schaffen, bei der Nutzer Bilder hochladen, Vision API-Analysen auslösen und die Ergebnisse in Echtzeit ansehen können. Schöpfen Sie das volle Potenzial Ihrer Vision AI-Anwendung aus, indem Sie Thymeleaf für die Frontend-Entwicklung nutzen.

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

5. Computer Vision-App in Cloud Run bereitstellen

Schreiben Sie Unittests für Ihre Dienst- und Controllerklassen, um die ordnungsgemäße Funktionalität im Ordner /src/test/java/com/example sicherzustellen. Wenn Sie sich von der Stabilität überzeugt haben, verpacken Sie sie in ein bereitstellbares Artefakt, z. B. eine JAR-Datei, und stellen Sie sie in Cloud Run bereit, einer serverlosen Compute-Plattform auf Google Cloud. In diesem Schritt konzentrieren wir uns auf die Bereitstellung Ihrer containerisierten Spring Boot-Anwendung mit Cloud Run.

  1. Verpacken Sie Ihre Anwendung, indem Sie die folgenden Schritte in Cloud Shell ausführen. Achten Sie darauf, dass das Terminal im Projektstammordner geöffnet ist.

Build:

./mvnw package

Wenn der Build erfolgreich war, führen Sie ihn lokal aus, um ihn zu testen:

./mvnw spring-boot:run
  1. Spring Boot-Anwendung mit Jib containerisieren:

Anstatt eine Dockerfile-Datei manuell zu erstellen und das Container-Image zu erstellen, können Sie das Jib-Tool verwenden, um den Containerisierungsprozess zu vereinfachen. Jib ist ein Plug-in, das direkt in Ihr Build-Tool (z. B. Maven oder Gradle) eingebunden wird und mit dem Sie optimierte Container-Images erstellen können, ohne ein Dockerfile schreiben zu müssen. Bevor Sie fortfahren, müssen Sie die Artifact Registry API aktivieren. Die Verwendung von Artifact Registry wird gegenüber Container Registry empfohlen. Führen Sie dann Jib aus, um ein Docker-Image zu erstellen und in der Registry zu veröffentlichen:

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

Hinweis: In diesem Test haben wir das Jib-Maven-Plugin nicht in pom.xml konfiguriert. Bei erweiterter Nutzung kann es jedoch mit weiteren Konfigurationsoptionen in pom.xml hinzugefügt werden.

  1. Stellen Sie den Container, den Sie im vorherigen Schritt per Push an Artifact Registry übertragen haben, in Cloud Run bereit. Auch hier ist nur ein Befehl erforderlich:
gcloud run deploy vision-app --image gcr.io/$GOOGLE_CLOUD_PROJECT/vision-jib --platform managed --region us-central1 --allow-unauthenticated --update-env-vars

Alternativ können Sie dies auch über die Benutzeroberfläche tun. Rufen Sie die Google Cloud Console auf und suchen Sie nach dem Cloud Run-Dienst. Klicken Sie auf „Dienst erstellen“ und folgen Sie der Anleitung auf dem Bildschirm. Geben Sie das Container-Image an, das Sie zuvor in die Registry übertragen haben, konfigurieren Sie die gewünschten Bereitstellungseinstellungen (z. B. CPU-Zuweisung und Autoscaling) und wählen Sie die entsprechende Region für die Bereitstellung aus. Sie können Umgebungsvariablen festlegen, die für Ihre Anwendung spezifisch sind. Diese Variablen können Authentifizierungsanmeldedaten (API-Schlüssel usw.), Datenbankverbindungsstrings oder andere Konfigurationen enthalten, die für die korrekte Funktion Ihrer Vision AI-Anwendung erforderlich sind. Nach erfolgreicher Bereitstellung sollte ein Endpunkt für Ihre Anwendung angezeigt werden.

Mit Ihrer Vision AI-App arbeiten

Für Demozwecke können Sie die folgende Bild-URL verwenden, damit Ihre App das Bild lesen und übersetzen kann: https://storage.googleapis.com/img_public_test/tamilwriting1.jfif

654c1b0de0db482.gif

6. Bereinigen

So vermeiden Sie, dass Ihrem Google Cloud-Konto die in diesem Beitrag verwendeten Ressourcen in Rechnung gestellt werden:

  1. Wechseln Sie in der Google Cloud Console zur Seite „Ressourcen verwalten“.
  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf „Löschen“.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf „Beenden“, um das Projekt zu löschen.

7. Glückwunsch

Glückwunsch! Sie haben erfolgreich eine Vision AI-Anwendung mit Spring Boot und Java erstellt. Mit Vision AI kann Ihre Anwendung jetzt anspruchsvolle Bildanalysen durchführen, z. B. Labeling und Gesichtserkennung. Die Integration von Spring Boot bietet eine solide Grundlage für die Entwicklung skalierbarer und robuster Google Cloud Native-Anwendungen. Sehen Sie sich die vielfältigen Möglichkeiten von Vision AI, Cloud Run, Cloud Translation und anderen Produkten an, um Ihre Anwendung mit zusätzlichen Funktionen zu erweitern. Weitere Informationen finden Sie in der Dokumentation zur Vision API, zu Cloud Translation und zu GCP Spring. Probieren Sie dasselbe Experiment mit der Option Spring Native aus. Hier können Sie sich ansehen, wie diese API in Model Garden aussieht.