Visione artificiale semplificata: Vision AI su Spring Boot e Java

1. Introduzione

Nell'era attuale delle applicazioni basate sui dati, sfruttare servizi avanzati di machine learning e intelligenza artificiale come la visione artificiale è diventato sempre più importante. Uno di questi servizi è l'API Vision, che offre potenti funzionalità di analisi delle immagini. In questo codelab, imparerai a creare un'applicazione di visione artificiale utilizzando Spring Boot e Java, in modo da sfruttare il potenziale del riconoscimento e dell'analisi delle immagini nei tuoi progetti. La UI dell'applicazione accetterà come input gli URL pubblici delle immagini che contengono testo scritto o stampato, estrarrà il testo, rileverà la lingua e, se è una delle lingue supportate, genererà la traduzione in inglese di quel testo.

Cosa creerai

Dovrai creare un

  • Un'applicazione Java Spring Boot per utilizzare l'API Vision e l'API Google Cloud Translation
  • Deployment eseguito in Cloud Run

2. Requisiti

  • Un browser, ad esempio Chrome o Firefox
  • Un progetto Google Cloud con fatturazione abilitata

Di seguito sono riportati i prerequisiti:

Creazione di un progetto

  1. Un account Google Cloud con un progetto creato e con la fatturazione abilitata
  2. API Vision, API Translation, Cloud Run e Artifact Registry abilitate
  3. Cloud Shell attivato
  4. API Cloud Storage abilitata con un bucket creato e sono state caricate immagini con testo o scrittura a mano libera nelle lingue locali supportate (oppure puoi utilizzare i link immagine di esempio forniti in questo blog)

Per la procedura di abilitazione delle API Google Cloud, consulta la documentazione.

Attiva Cloud Shell

  1. Utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione su Google Cloud in cui è precaricato bq:

Dalla console Cloud, fai clic su Attiva Cloud Shell nell'angolo in alto a destra.

51622c00acec2fa.png

  1. Una volta eseguita la connessione a Cloud Shell, dovresti vedere che il tuo account è già autenticato e il progetto è già impostato sul tuo ID progetto. Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
gcloud auth list
  1. Esegui questo comando in Cloud Shell per confermare che il comando gcloud sia a conoscenza del tuo progetto
gcloud config list project
  1. Se il progetto non è configurato, utilizza il comando seguente per impostarlo:
gcloud config set project <PROJECT_ID>

Consulta la documentazione per i comandi e l'utilizzo di gcloud.

3. Eseguire il bootstrap di un progetto di avvio a molla

Per iniziare, crea un nuovo progetto Spring Boot utilizzando il tuo IDE o Spring Initializr che preferisci. Includi le dipendenze necessarie, come Spring Web, Spring Cloud Google Cloud e Vision AI, nella configurazione del tuo progetto. In alternativa, puoi utilizzare Spring Initializr da Cloud Shell seguendo i passaggi riportati di seguito per eseguire facilmente il bootstrap della tua applicazione Spring Boot.

Esegui questo comando per creare il tuo progetto di avvio a molla:

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 è il nome del tuo progetto; modificalo in base alle tue esigenze.

bootVersion è la versione di Spring Boot. Assicurati di aggiornarla, se necessario, al momento dell'implementazione.

type è la versione del tipo di strumento di creazione del progetto, se preferisci puoi modificarlo in Gradle.

37813d3982ce2e42.png

Viene così creata una struttura di progetto sotto la "visione primaverile" come mostrato di seguito:

3e70d45d88ac6935.png

pom.xml contiene tutte le dipendenze del progetto (le dipendenze configurate utilizzando questo comando sono già state aggiunte al file pom.xml).

src/main/java/com/example/demo contiene i file .java delle classi di origine.

Le risorse contengono le immagini, il codice XML, i file di testo e i contenuti statici utilizzati dal progetto che vengono gestiti in modo indipendente.

application.properties consente di mantenere le funzionalità di amministrazione per definire le proprietà specifiche del profilo dell'applicazione.

4. Configurazione dell'API Vision

Una volta abilitata l'API Vision, puoi configurare le credenziali dell'API nella tua applicazione. Facoltativamente, puoi utilizzare le Credenziali predefinite dell'applicazione per configurare l'autenticazione. In questa implementazione demo, tuttavia, non ho implementato l'uso delle credenziali.

Implementazione dei servizi di visione artificiale e di traduzione

Creare una classe di servizio che interagisce con l'API Vision. Inserisci le dipendenze necessarie e utilizza il client dell'API Vision per inviare richieste di analisi delle immagini. In base ai requisiti della tua applicazione, puoi implementare metodi per eseguire attività come l'etichettatura delle immagini, il rilevamento dei volti, il riconoscimento e altro ancora. In questa demo useremo metodi di estrazione e traduzione della scrittura a mano libera.

Per questo, assicurati di includere le seguenti dipendenze in 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>

Clona / sostituisci i seguenti file dal repo e aggiungili alle rispettive cartelle / percorso nella struttura del progetto:

  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

Il metodo extractTextFromImage nel servizio org.springframework.cloud.gcp.vision.CloudVisionTemplate consente di estrarre testo dall'input dell'immagine. Il metodo getTranslatedText del servizio com.google.cloud.translate.v3 ti consente di passare il testo estratto dalla tua immagine e ottenere come risposta il testo tradotto nella lingua di destinazione desiderata (se la fonte è in una delle lingue supportate).

Creazione dell'API REST

Progettare e implementare gli endpoint REST che esporranno le funzionalità dell'API Vision. Creare controller che gestiscono le richieste in entrata e utilizzare il servizio API Vision per elaborare le immagini e restituire i risultati dell'analisi. In questa demo, la nostra classe VisionController implementa l'endpoint, gestisce la richiesta in entrata, richiama l'API Vision e i servizi Cloud Translation e restituisce il risultato al livello di visualizzazione. L'implementazione del metodo GET per l'endpoint REST è la seguente:

@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 dell'implementazione precedente utilizza il metodo che richiama il servizio 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);
     }

Con la classe VisionController è implementato il metodo GET per REST.

Integrazione di Thymeleaf per lo sviluppo frontend

Quando si crea un'applicazione con Spring Boot, una scelta molto diffusa per lo sviluppo frontend è sfruttare la potenza di Thymeleaf. Thymeleaf è un motore di modelli Java lato server che consente di integrare perfettamente contenuti dinamici nelle pagine HTML. Thymeleaf offre un'esperienza di sviluppo fluida consentendoti di creare modelli HTML con espressioni lato server incorporate. Queste espressioni possono essere utilizzate per eseguire il rendering dinamico dei dati dal backend Spring Boot, semplificando la visualizzazione dei risultati dell'analisi delle immagini eseguita dal servizio API Vision.

Per iniziare, assicurati di disporre delle dipendenze necessarie per Thymeleaf nel progetto Spring Boot. Puoi includere la dipendenza Thymeleaf Starter nel tuo file pom.xml:

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

Nel metodo controller, recupera il risultato dell'analisi dal servizio API Vision e aggiungilo al modello. Il modello rappresenta i dati che verranno utilizzati da Thymeleaf per eseguire il rendering del modello HTML. Una volta compilato il modello, restituisci il nome del modello Thymeleaf di cui vuoi eseguire il rendering. Thymeleaf si occuperà di elaborare il modello, sostituendo le espressioni lato server con i dati effettivi e generando il codice HTML finale che verrà inviato al browser del client.

Nel caso del metodo extractText in VisionController, abbiamo restituito il risultato come String al modello e non l'abbiamo aggiunto. Tuttavia, abbiamo richiamato il metodo GET extractText all'invio della pagina index.html. Con Thymeleaf, puoi creare un'esperienza utente semplificata, in cui gli utenti possono caricare immagini, attivare analisi dell'API Vision e visualizzare i risultati in tempo reale. Sblocca il pieno potenziale della tua applicazione Vision AI sfruttando la potenza di Thymeleaf per lo sviluppo frontend.

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

5. Deployment dell'app di visione artificiale su Cloud Run

Scrivi i test delle unità per le classi di servizio e controller per garantire il corretto funzionamento nella cartella /src/test/java/com/example. Dopo aver verificato la sua stabilità, pacchettizzalo in un artefatto di cui è possibile eseguire il deployment, ad esempio un file JAR, ed eseguine il deployment su Cloud Run, una piattaforma di serverless computing su Google Cloud. In questo passaggio, ci concentreremo sul deployment dell'applicazione Spring Boot containerizzata utilizzando Cloud Run.

  1. Pacchettizza la tua applicazione eseguendo questi passaggi da Cloud Shell(assicurati che il terminale faccia richiesta nella cartella principale del progetto)

Build:

./mvnw package

Una volta completata la build, eseguila in locale per testare:

./mvnw spring-boot:run
  1. Containerizza l'applicazione Spring Boot con Jib:

Anziché creare manualmente un Dockerfile e creare l'immagine container, puoi utilizzare l'utilità Jib per semplificare il processo di containerizzazione. Jib è un plug-in che si integra direttamente con il tuo strumento di creazione (come Maven o Gradle) e ti consente di creare immagini container ottimizzate senza scrivere un Dockerfile. Prima di procedere, devi abilitare l'API Artifact Registry (si consiglia l'uso di Artifact Registry rispetto a Container Registry). Quindi esegui Jib per creare un'immagine Docker e pubblicarla nel registro:

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

Nota: in questo esperimento non abbiamo configurato il plug-in Jib Maven in pom.xml, ma per un utilizzo avanzato, è possibile aggiungerlo in pom.xml con più opzioni di configurazione

  1. Esegui il deployment del container (di cui abbiamo eseguito il push su Artifact Registry nel passaggio precedente) in Cloud Run. Anche in questo caso si tratta di un passaggio con un solo comando:
gcloud run deploy vision-app --image gcr.io/$GOOGLE_CLOUD_PROJECT/vision-jib --platform managed --region us-central1 --allow-unauthenticated --update-env-vars

In alternativa, puoi eseguire questa operazione anche dalla UI. Accedi alla console Google Cloud e individua il servizio Cloud Run. Fai clic su "Crea servizio" e segui le istruzioni. Specifica l'immagine container di cui hai precedentemente eseguito il push al registro, configura le impostazioni di deployment desiderate (ad esempio allocazione della CPU e scalabilità automatica) e scegli la regione appropriata per il deployment. Puoi impostare variabili di ambiente specifiche per la tua applicazione. Queste variabili possono includere credenziali di autenticazione (chiavi API e così via), stringhe di connessione del database o qualsiasi altra configurazione necessaria per il corretto funzionamento dell'applicazione Vision AI. Una volta completato il deployment, dovresti ottenere un endpoint per l'applicazione.

Gioca con l'app Vision AI

A scopo dimostrativo, puoi utilizzare l'URL dell'immagine riportato di seguito per la lettura e la traduzione della tua app: https://storage.googleapis.com/img_public_test/tamilwriting1.jfif

654c1b0de0db482.gif

6. Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo post, segui questi passaggi:

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse
  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Arresta per eliminare il progetto

7. Complimenti

Complimenti! Hai creato un'applicazione Vision AI utilizzando Spring Boot e Java. Grazie alla potenza di Vision AI, la tua applicazione ora può eseguire sofisticate analisi delle immagini, tra cui etichettatura, rilevamento dei volti e altro ancora. L'integrazione di Spring Boot fornisce una solida base per la creazione di applicazioni Google Cloud Native scalabili e solide. Continua a esplorare le vaste funzionalità di Vision AI, Cloud Run, Cloud Translation e altro ancora per migliorare la tua applicazione con ulteriori caratteristiche e funzionalità. Per ulteriori informazioni, consulta la documentazione su API Vision, Cloud Translation e GCP Spring. Prova lo stesso esperimento con l'opzione Spring Native. Inoltre, per dare un'occhiata al mondo dell'IA generativa, dai un'occhiata a come questa API si presenta in Model Garden.