La vision par ordinateur simplifiée: Vision AI sur Spring Boot et Java

1. Introduction

À l'ère actuelle des applications basées sur les données, l'exploitation de services avancés de machine learning et d'intelligence artificielle comme la vision par ordinateur est devenue de plus en plus importante. L'API Vision en est un exemple, et elle offre de puissantes fonctionnalités d'analyse d'images. Dans cet atelier de programmation, vous allez apprendre à créer une application de vision par ordinateur à l'aide de Spring Boot et de Java, afin d'exploiter tout le potentiel de la reconnaissance et de l'analyse d'images dans vos projets. L'interface utilisateur de l'application accepte en entrée les URL publiques d'images contenant du texte écrit ou imprimé, extrait le texte, détecte la langue et, s'il s'agit de l'une des langues compatibles, génère la traduction en anglais du texte.

Ce que vous allez faire

Vous allez créer un

  • Une application Java Spring Boot pour utiliser l'API Vision et l'API Google Cloud Translation
  • Déployé sur Cloud Run

2. Conditions requises

  • Un navigateur tel que Chrome ou Firefox
  • Un projet Google Cloud avec facturation activée

Voici les conditions préalables:

Créer un projet

  1. Un compte Google Cloud avec un projet créé et la facturation activée
  2. API Vision, Translation, Cloud Run et Artifact Registry activées
  3. Cloud Shell activé
  4. API Cloud Storage activée avec un bucket créé et des images de texte ou d'écriture manuscrite importées dans les langues locales compatibles (vous pouvez également utiliser les exemples de liens d'image fournis sur ce blog)

Reportez-vous à la documentation pour découvrir comment activer les API Google Cloud.

Activer Cloud Shell

  1. Vous allez utiliser Cloud Shell, un environnement de ligne de commande exécuté dans Google Cloud et doté de la commande bq:

Dans la console Cloud, cliquez sur "Activer Cloud Shell" en haut à droite.

51622c00acec2fa.png

  1. Une fois connecté à Cloud Shell, vous êtes en principe authentifié, et le projet est déjà défini avec votre ID de projet. Exécutez la commande suivante dans Cloud Shell pour vérifier que vous êtes authentifié :
gcloud auth list
  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud reconnaît votre projet
gcloud config list project
  1. Si votre projet n'est pas défini, utilisez la commande suivante pour le définir :
gcloud config set project <PROJECT_ID>

Consultez la documentation pour connaître les commandes gcloud ainsi que leur utilisation.

3. Amorcer un projet Spring Boot

Pour commencer, créez un projet Spring Boot à l'aide de l'IDE ou de Spring Initializr de votre choix. Incluez les dépendances nécessaires, telles que Spring Web, Spring Cloud GCP et Vision AI, dans la configuration de votre projet. Vous pouvez également utiliser Spring Initializr à partir de Cloud Shell en suivant la procédure ci-dessous pour amorcer facilement votre application Spring Boot.

Exécutez la commande suivante pour créer votre projet 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 est le nom de votre projet. Modifiez-le selon vos besoins.

bootVersion est la version de Spring Boot. Veillez à la mettre à jour si nécessaire au moment de l'implémentation.

type est la version du type d'outil de création de projet, vous pouvez la remplacer par Gradle si vous le souhaitez.

37813d3982ce2e42.png

Cela crée une structure de projet sous « vision du printemps ». comme suit:

3e70d45d88ac6935.png

pom.xml contient toutes les dépendances du projet (les dépendances que vous avez configurées à l'aide de cette commande sont déjà ajoutées à votre fichier pom.xml).

src/main/java/com/example/demo contient les fichiers .java des classes sources.

resources contiennent les images, les fichiers XML, les fichiers texte et le contenu statique utilisés par le projet et gérés indépendamment.

application.properties vous permet de gérer les fonctionnalités d'administration et de définir les propriétés spécifiques au profil de l'application.

4. Configurer l'API Vision

Une fois l'API Vision activée, vous pouvez configurer ses identifiants dans votre application. Vous pouvez éventuellement utiliser les identifiants par défaut de l'application pour configurer l'authentification. Cependant, dans cette démonstration, je n'ai pas mis en œuvre l'utilisation des identifiants.

Mettre en œuvre les services de vision et de traduction

Créer une classe de service qui interagit avec l'API Vision Injectez les dépendances nécessaires et utilisez le client de l'API Vision pour envoyer des requêtes d'analyse d'image. Vous pouvez implémenter des méthodes pour effectuer des tâches telles que l'étiquetage d'images, la détection de visages, la reconnaissance, etc., en fonction des exigences de votre application. Dans cette démonstration, nous allons utiliser des méthodes d'extraction de l'écriture manuscrite et de traduction.

Pour ce faire, veillez à inclure les dépendances suivantes dans le fichier 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>

Clonez/Remplacez les fichiers suivants à partir du dépôt, puis ajoutez-les aux dossiers ou chemins d'accès respectifs dans la structure du projet:

  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

La méthode extractTextFromImage dans le service org.springframework.cloud.gcp.vision.CloudVisionTemplate vous permet d'extraire du texte à partir de l'entrée de votre image. La méthode getTranslatedText du service com.google.cloud.translate.v3 vous permet de transmettre le texte extrait de votre image et d'obtenir le texte traduit dans la langue cible souhaitée en tant que réponse (si la source figure dans l'une des listes de langues compatibles).

Créer l'API REST

Concevez et implémentez les points de terminaison REST qui exposeront les fonctionnalités de l'API Vision. Créez des contrôleurs qui traitent les requêtes entrantes et utilisent le service de l'API Vision pour traiter les images et renvoyer les résultats d'analyse. Dans cette démonstration, la classe VisionController implémente le point de terminaison, traite la requête entrante, appelle l'API Vision et les services Cloud Translation, puis renvoie le résultat à la couche d'affichage. L'implémentation de la méthode GET pour le point de terminaison REST est la suivante:

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

La classe TranslateText de l'implémentation ci-dessus contient la méthode qui appelle le service 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);
     }

Avec la classe VisionController, nous avons implémenté la méthode GET pour REST.

Intégrer Thymeleaf pour le développement de l'interface

Lorsque vous créez une application avec Spring Boot, l'une des options les plus populaires pour le développement de l'interface consiste à exploiter la puissance de Thymeleaf. Thymeleaf est un moteur de création de modèles Java côté serveur qui vous permet d'intégrer facilement du contenu dynamique à vos pages HTML. Thymeleaf simplifie le développement en vous permettant de créer des modèles HTML avec des expressions intégrées côté serveur. Ces expressions peuvent être utilisées pour afficher les données de manière dynamique depuis votre backend Spring Boot, ce qui facilite l'affichage des résultats de l'analyse d'image effectuée par le service de l'API Vision.

Pour commencer, assurez-vous que vous disposez des dépendances nécessaires pour Thymeleaf dans votre projet Spring Boot. Vous pouvez inclure la dépendance Thymeleaf Starter dans votre fichier pom.xml:

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

Dans votre méthode de contrôleur, récupérez le résultat de l'analyse à partir du service de l'API Vision et ajoutez-le au modèle. Le modèle représente les données qui seront utilisées par Thymeleaf pour afficher le modèle HTML. Une fois le modèle rempli, renvoyez le nom du modèle Thymeleaf que vous souhaitez afficher. Thymeleaf se charge de traiter le modèle, de remplacer les expressions côté serveur par les données réelles et de générer le code HTML final qui sera envoyé au navigateur du client.

Dans le cas de la méthode extractText dans VisionController, nous avons renvoyé le résultat en tant que String au modèle, mais nous n'avons pas pu l'ajouter. Mais nous avons appelé la méthode GET extractText sur index.html lors de l'envoi de la page. Avec Thymeleaf, vous pouvez créer une expérience utilisateur fluide, où les utilisateurs peuvent importer des images, déclencher des analyses de l'API Vision et afficher les résultats en temps réel. Exploitez tout le potentiel de votre application Vision AI en exploitant la puissance de Thymeleaf pour le développement de l'interface.

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

5. Déployer votre application de vision par ordinateur sur Cloud Run

Écrivez des tests unitaires pour vos classes de service et de contrôleur afin de vous assurer qu'ils fonctionnent correctement dans le dossier /src/test/java/com/example. Une fois que vous êtes sûr de sa stabilité, empaquetez-le dans un artefact déployable, tel qu'un fichier JAR, et déployez-le sur Cloud Run, une plate-forme de calcul sans serveur sur Google Cloud. Dans cette étape, nous allons nous concentrer sur le déploiement de votre application Spring Boot conteneurisée à l'aide de Cloud Run.

  1. Empaquetez votre application en exécutant les étapes suivantes à partir de Cloud Shell(assurez-vous que le terminal renvoie l'invite dans le dossier racine du projet).

Build :

./mvnw package

Une fois la compilation réussie, exécutez le test en local pour effectuer le test:

./mvnw spring-boot:run
  1. Conteneuriser votre application Spring Boot avec Jib:

Au lieu de créer manuellement un Dockerfile et de compiler l'image de conteneur, vous pouvez utiliser l'utilitaire Jib pour simplifier le processus de conteneurisation. Jib est un plug-in qui s'intègre directement à votre outil de compilation (tel que Maven ou Gradle) et vous permet de créer des images de conteneurs optimisées sans avoir à écrire de Dockerfile. Avant de continuer, vous devez activer l'API Artifact Registry (l'utilisation d'Artifact Registry est préférable à Container Registry). Exécutez ensuite Jib pour créer une image Docker et la publier dans le registre:

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

Remarque: Lors de cette expérience, nous n'avons pas configuré le plug-in Jib Maven dans le fichier pom.xml. Toutefois, pour une utilisation avancée, il est possible de l'ajouter dans le fichier pom.xml avec d'autres options de configuration.

  1. Déployez le conteneur (que nous avons transféré vers Artifact Registry à l'étape précédente) sur Cloud Run. Là encore, il s'agit d'une étape à une seule commande:
gcloud run deploy vision-app --image gcr.io/$GOOGLE_CLOUD_PROJECT/vision-jib --platform managed --region us-central1 --allow-unauthenticated --update-env-vars

Vous pouvez également effectuer cette opération à partir de l'interface utilisateur. Accédez à la console Google Cloud et localisez le service Cloud Run. Cliquez sur "Créer un service". et suivez les instructions à l'écran. Spécifiez l'image de conteneur que vous avez précédemment transférée au registre, configurez les paramètres de déploiement souhaités (tels que l'allocation du processeur et l'autoscaling), puis choisissez la région appropriée pour le déploiement. Vous pouvez définir des variables d'environnement spécifiques à votre application. Ces variables peuvent inclure des identifiants d'authentification (clés API, etc.), des chaînes de connexion à une base de données ou toute autre configuration nécessaire au bon fonctionnement de votre application Vision AI. Une fois le déploiement terminé, vous devriez obtenir un point de terminaison pour votre application.

Jouer avec l'application Vision AI

À des fins de démonstration, vous pouvez utiliser l'URL de l'image ci-dessous pour que votre application puisse la lire et la traduire: https://storage.googleapis.com/img_public_test/tamilwriting1.jfif.

654c1b0de0db482.gif

6. Effectuer un nettoyage

Pour éviter que les ressources utilisées dans cet article soient facturées sur votre compte Google Cloud, procédez comme suit:

  1. Dans la console Google Cloud, accédez à la page "Gérer les ressources".
  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur "Supprimer".
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur "Arrêter" pour supprimer le projet.

7. Félicitations

Félicitations ! Vous venez de créer une application Vision AI à l'aide de Spring Boot et de Java. Grâce à la puissance de Vision AI, votre application peut désormais effectuer des analyses d'images sophistiquées, y compris l'étiquetage, la détection de visages et plus encore. L'intégration de Spring Boot constitue une base solide pour créer des applications Google Cloud natives évolutives et robustes. Continuez à explorer les vastes possibilités offertes par Vision AI, Cloud Run, Cloud Translation et d'autres produits pour améliorer votre application grâce à des fonctionnalités supplémentaires. Pour en savoir plus, consultez la documentation sur l'API Vision, Cloud Translation et GCP Spring. Effectuez le même test avec l'option Spring Native ! Découvrez également comment cette API s'affiche dans Model Garden, qui offre également un aperçu du monde de l'IA générative.