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

1. Einführung

Im heutigen Zeitalter datengesteuerter Anwendungen wird die Nutzung fortschrittlicher Dienste für maschinelles Lernen und künstliche Intelligenz wie maschinelles Sehen immer wichtiger. Einer dieser Dienste ist die Vision API, die leistungsstarke Bildanalysefunktionen bietet. In diesem Codelab erfahren Sie, wie Sie mit Spring Boot und Java eine Anwendung für maschinelles Sehen erstellen, um das Potenzial der Bilderkennung und -analyse in Ihren Projekten zu nutzen. Die Benutzeroberfläche der Anwendung akzeptiert öffentliche URLs von Bildern, die geschriebenen oder gedruckten Text enthalten, als Eingabe, extrahiert den Text und erkennt die Sprache. Wenn es sich um eine der unterstützten Sprachen handelt, wird die englische Übersetzung des Texts generiert.

Aufgaben

Sie erstellen ein

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

2. Voraussetzungen

  • Ein Browser wie Chrome oder Firefox
  • Ein Google Cloud-Projekt mit aktivierter Abrechnung

Voraussetzungen:

Projekt erstellen

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

In der Dokumentation finden Sie eine Anleitung zum Aktivieren von Google Cloud APIs.

Cloud Shell aktivieren

  1. Sie verwenden Cloud Shell, eine in Google Cloud ausgeführte Befehlszeilenumgebung mit vorinstalliertem bq:

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

51622c00acec2fa.png

  1. Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie bereits authentifiziert sind und dass das Projekt bereits auf Ihre Projekt-ID eingestellt ist. Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list
  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob der gcloud-Befehl Ihr Projekt kennt
gcloud config list project
  1. Wenn Ihr Projekt noch nicht eingerichtet 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. Bootstrapping eines Spring Boot-Projekts

Erstellen Sie zuerst ein neues Spring Boot-Projekt mit Ihrer bevorzugten IDE oder Spring Initializr. Nehmen Sie die erforderlichen Abhängigkeiten wie Spring Web, Spring Cloud GCP und Vision AI in die Konfiguration Ihres Projekts auf. Alternativ können Sie Spring Initializr über Cloud Shell mit den folgenden Schritten verwenden, um Ihre Spring Boot-Anwendung 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, falls zum Zeitpunkt der Implementierung erforderlich.

type ist die Version des Projekterstellungstooltyps. Sie können ihn nach Wunsch zu Gradle ändern.

37813d3982ce2e42.png

Dadurch wird eine Projektstruktur unter „Frühlingsvision“ erstellt. wie unten dargestellt:

3e70d45d88ac6935.png

pom.xml enthält alle Abhängigkeiten für das Projekt. Abhängigkeiten, die Sie mit diesem Befehl konfiguriert haben, wurden bereits in der pom.xml-Datei hinzugefügt.

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

resources enthalten die Bilder, XML-Dateien, Textdateien und die vom Projekt verwendeten statischen Inhalte, die unabhängig verwaltet werden.

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

4. Vision API konfigurieren

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

Visions- und Übersetzungsdienste implementieren

Erstellen Sie eine Dienstklasse, die mit der Vision API interagiert. Injizieren Sie die erforderlichen Abhängigkeiten und verwenden Sie den Vision API-Client, um Bildanalyseanfragen zu senden. Sie können je nach den Anforderungen Ihrer Anwendung Methoden zur Durchführung von Aufgaben wie Bildbeschriftung, Gesichtserkennung, Erkennung usw. implementieren. In dieser Demo verwenden wir Methoden zur Handschrift-Extraktion und Übersetzung.

Dazu müssen Sie die folgenden Abhängigkeiten in die Datei pom.xml einbeziehen.

<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 der Bildeingabe extrahieren. Mit der Methode getTranslatedText des Dienstes 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 abrufen (falls die Quelle in einer der unterstützten Sprachen ist).

REST API erstellen

Entwerfen und implementieren Sie die REST-Endpunkte, über die die Vision API-Funktionen bereitgestellt werden. Erstellen Sie Controller, die eingehende Anfragen verarbeiten, und nutzen Sie den Vision API-Dienst, 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 läuft so ab:

@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 ist die GET-Methode für die REST implementiert.

Thymeleaf in die Frontend-Entwicklung einbinden

Beim Erstellen einer Anwendung mit Spring Boot ist eine beliebte Wahl für die Frontend-Entwicklung die Nutzung der Leistungsfähigkeit von Thymeleaf. Thymeleaf ist eine serverseitige Java-Vorlagen-Engine, mit der du dynamische Inhalte nahtlos in deine HTML-Seiten integrieren kannst. Thymeleaf ermöglicht eine reibungslose Entwicklung, da du HTML-Vorlagen mit eingebetteten serverseitigen Ausdrücken erstellen kannst. Diese Ausdrücke können verwendet werden, um Daten aus Ihrem Spring Boot-Back-End dynamisch zu rendern. So können Sie die Ergebnisse der vom Vision API-Dienst durchgeführten Bildanalyse leichter anzeigen.

Prüfen Sie zuerst, ob in Ihrem Spring Boot-Projekt die erforderlichen Abhängigkeiten für Thymeleaf vorhanden sind. Sie können die Thymeleaf Starter-Abhängigkeit in Ihre pom.xml-Datei aufnehmen:

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

Rufen Sie in Ihrer Controller-Methode das Analyseergebnis aus dem 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. Wenn das Modell ausgefüllt ist, geben Sie den Namen der Thymeleaf-Vorlage zurück, die Sie rendern möchten. 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 dem Modell nicht hinzugefügt. Wir haben jedoch die GET-Methode extractText für die index.html beim Senden der Seite aufgerufen. Mit Thymeleaf können Sie eine nahtlose User Experience 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 das Potenzial von 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. Anwendung für maschinelles Sehen in Cloud Run bereitstellen

Schreiben Sie Einheitentests für Ihre Dienst- und Controllerklassen, um die ordnungsgemäße Funktionalität im Ordner /src/test/java/com/example zu gewährleisten. Wenn Sie von der Stabilität überzeugt sind, verpacken Sie es in einem bereitstellbaren Artefakt, z. B. in einer JAR-Datei, und stellen Sie es in Cloud Run, einer serverlosen Computing-Plattform in Google Cloud, bereit. In diesem Schritt konzentrieren wir uns auf die Bereitstellung Ihrer Spring Boot-Containeranwendung mit Cloud Run.

  1. Verpacken Sie Ihre Anwendung, indem Sie die folgenden Schritte über Cloud Shell ausführen. Achten Sie darauf, dass das Terminal im Stammordner des Projekts eine Eingabeaufforderung ausführt.

Build:

./mvnw package

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

./mvnw spring-boot:run
  1. Containerisieren Sie Ihre Spring Boot-Anwendung mit Jib:

Anstatt manuell ein Dockerfile zu erstellen und das Container-Image zu generieren, können Sie das Dienstprogramm Jib verwenden, um die Containerisierung zu vereinfachen. Jib ist ein Plug-in, das sich direkt in Ihr Build-Tool (z. B. Maven oder Gradle) einbinden lässt. Damit können Sie optimierte Container-Images erstellen, ohne ein Dockerfile schreiben zu müssen. Bevor Sie fortfahren, müssen Sie die Artifact Registry API aktivieren. Die Verwendung von Artifact Registry wird ü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 Experiment haben wir das Jib Maven-Plug-in nicht in pom.xml konfiguriert. Für eine fortgeschrittene Nutzung ist es jedoch möglich, es mit mehr Konfigurationsoptionen in pom.xml hinzuzufügen.

  1. Stellen Sie den Container, den wir im vorherigen Schritt an Artifact Registry übertragen haben, für Cloud Run bereit. Dazu muss nur ein Befehl verwendet werden:
gcloud run deploy vision-app --image gcr.io/$GOOGLE_CLOUD_PROJECT/vision-jib --platform managed --region us-central1 --allow-unauthenticated --update-env-vars

Sie können dies auch über die Benutzeroberfläche tun. Rufen Sie die Google Cloud Console auf und suchen Sie den 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 geeignete Region für die Bereitstellung aus. Sie können für Ihre Anwendung spezifische Umgebungsvariablen festlegen. Diese Variablen können Anmeldedaten zur Authentifizierung (API-Schlüssel usw.), Datenbank-Verbindungsstrings oder jede andere Konfiguration umfassen, die erforderlich ist, damit Ihre Vision AI-Anwendung ordnungsgemäß funktioniert. Wenn die Bereitstellung erfolgreich abgeschlossen wurde, sollten Sie einen Endpunkt für Ihre Anwendung erhalten.

Mit der Vision AI-Anwendung experimentieren

Zu Demozwecken können Sie die folgende Bild-URL für Ihre App zum Lesen und Übersetzen verwenden: 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. Rufen Sie in der Google Cloud Console die Seite „Ressourcen verwalten“ auf.
  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf „Löschen“.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie dann 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 komplexe Bildanalysen durchführen, einschließlich Beschriftungen, Gesichtserkennung usw. Die Einbindung von Spring Boot bietet eine solide Grundlage für die Erstellung skalierbarer und robuster Google Cloud Native-Anwendungen. Entdecken Sie weiter die vielfältigen Funktionen von Vision AI, Cloud Run, Cloud Translation und mehr, um Ihre Anwendung um zusätzliche Features und Funktionalitäten zu erweitern. Weitere Informationen finden Sie in der Dokumentation zur Vision API, zu Cloud Translation und GCP Spring. Testen Sie den gleichen Test auch mit der Option Spring Native. Sehen Sie sich auch als Vorschau auf die generative KI an, wie diese API in Model Garden angezeigt wird.