La visión artificial se facilitó: Vision AI en Spring Boot y Java

1. Introducción

En la era actual de las aplicaciones basadas en datos, aprovechar los servicios avanzados de inteligencia artificial y aprendizaje automático, como la visión artificial, es cada vez más importante. Uno de esos servicios es la API de Vision, que proporciona potentes capacidades de análisis de imágenes. En este codelab, aprenderás a crear una aplicación de visión artificial con Spring Boot y Java, lo que te permitirá desbloquear el potencial del reconocimiento y análisis de imágenes en tus proyectos. La IU de la aplicación aceptará como entrada URLs públicas de imágenes que contengan texto escrito o impreso, extraerá el texto, detectará el idioma y, si es uno de los idiomas compatibles, generará la traducción al inglés de ese texto.

Qué compilarás

Crearás un

  • Una aplicación de Java Spring Boot para usar la API de Vision y la API de Google Cloud Translation
  • Implementado en Cloud Run

2. Requisitos

  • Un navegador, como Chrome o Firefox.
  • Un proyecto de Google Cloud con la facturación habilitada.

Estos son los requisitos previos:

Crea tu proyecto

  1. Una cuenta de Google Cloud con un proyecto creado y la facturación habilitada
  2. Se habilitaron la API de Vision, Translation, Cloud Run y las APIs de Artifact Registry
  3. Cloud Shell activado
  4. La API de Cloud Storage habilitada con un bucket creado y las imágenes con texto o escritura a mano en los idiomas locales admitidos (o puedes usar los vínculos de imagen de muestra que se proporcionan en este blog)

Consulta la documentación a fin de obtener los pasos para habilitar las APIs de Google Cloud.

Activa Cloud Shell

  1. Usarás Cloud Shell, un entorno de línea de comandos que se ejecuta en Google Cloud y que viene precargado con bq:

En la consola de Cloud, haz clic en Activar Cloud Shell en la esquina superior derecha.

51622c00acec2fa.png

  1. Una vez que te conectes a Cloud Shell, deberías ver que ya se te autenticó y que el proyecto ya se configuró con el ID de tu proyecto. En Cloud Shell, ejecuta el siguiente comando para confirmar que tienes la autenticación:
gcloud auth list
  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que el comando gcloud conoce tu proyecto.
gcloud config list project
  1. Si tu proyecto no está configurado, usa el siguiente comando para hacerlo:
gcloud config set project <PROJECT_ID>

Consulta la documentación para ver los comandos y el uso de gcloud.

3. Cómo iniciar un proyecto de Spring Boot

Para comenzar, crea un nuevo proyecto de Spring Boot con tu IDE o Spring Initializr preferido. Incluye las dependencias necesarias, como Spring Web, Spring Cloud GCP y Vision AI, en la configuración de tu proyecto. Como alternativa, puedes usar Spring Initializr desde Cloud Shell con los siguientes pasos para iniciar tu aplicación de Spring Boot fácilmente.

Ejecuta el siguiente comando para crear tu proyecto de 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 es el nombre de tu proyecto. Cámbialo según tus necesidades.

bootVersion es la versión de Spring Boot. Asegúrate de actualizarla si es necesario en el momento de la implementación.

type es la versión del tipo de herramienta de compilación de proyectos. Puedes cambiarla a Gradle si lo prefieres.

37813d3982ce2e42.png

Esto crea una estructura de proyecto bajo "visión de primavera" como se muestra a continuación:

3e70d45d88ac6935.png

pom.xml contiene todas las dependencias para el proyecto (las dependencias que configuraste con este comando ya están agregadas en tu pom.xml).

src/main/java/com/example/demo tiene los archivos de clase fuente .java.

resources contiene las imágenes, los archivos XML, los archivos de texto y el contenido estático que utiliza el proyecto, que se mantienen de forma independiente.

application.properties te permiten mantener las funciones de administrador para definir propiedades específicas del perfil de la aplicación.

4. Configura la API de Vision

Una vez que hayas habilitado la API de Vision, tienes la opción de configurar las credenciales de la API en tu aplicación. De manera opcional, puedes usar credenciales predeterminadas de la aplicación para configurar la autenticación. Sin embargo, en esta implementación de demostración, no implementé el uso de credenciales.

Implementa los servicios de visión y traducción

Crear una clase de servicio que interactúe con la API de Vision Inyecta las dependencias necesarias y usa el cliente de la API de Vision para enviar solicitudes de análisis de imágenes. Puedes implementar métodos para realizar tareas, como etiquetado de imágenes, detección de rostros, reconocimiento y mucho más, según los requisitos de tu aplicación. En esta demostración, usaremos métodos de extracción y traducción de escritura a mano.

Para ello, asegúrate de incluir las siguientes dependencias en 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 o reemplaza los siguientes archivos del repositorio y agrégalos a las carpetas o rutas correspondientes en la estructura del proyecto:

  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

El método extractTextFromImage en el servicio org.springframework.cloud.gcp.vision.CloudVisionTemplate te permite extraer texto de la entrada de imagen. El método getTranslatedText del servicio com.google.cloud.translate.v3 te permite pasar el texto extraído de tu imagen y obtener el texto traducido en el idioma de destino deseado como respuesta (si la fuente está en una de las listas de idiomas compatibles).

Cómo compilar la API de REST

Diseñar e implementar los extremos de REST que expondrán las funciones de la API de Vision Crear controladores que controlen las solicitudes entrantes y utilizar el servicio de la API de Vision para procesar las imágenes y mostrar los resultados del análisis En esta demostración, la clase VisionController implementa el extremo, controla la solicitud entrante, invoca la API de Vision y los servicios de Cloud Translation, y muestra el resultado a la capa de vista. La implementación del método GET para el extremo REST es la siguiente:

@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 clase TranslateText en la implementación anterior tiene el método que invoca el servicio de 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 clase VisionController, tenemos implementado el método GET para REST.

Integra Thymeleaf para el desarrollo de frontend

Cuando compilas una aplicación con Spring Boot, una opción popular para el desarrollo de frontend es aprovechar la potencia de Thymeleaf. Thymeleaf es un motor de plantillas de Java del servidor que permite integrar sin problemas contenido dinámico en páginas HTML. Thymeleaf proporciona una experiencia de desarrollo fluida, ya que permite crear plantillas HTML con expresiones del servidor incorporadas. Estas expresiones se pueden usar para renderizar datos de forma dinámica desde tu backend de Spring Boot, lo que facilita la visualización de los resultados del análisis de imágenes que realiza el servicio de la API de Vision.

Para comenzar, asegúrate de tener las dependencias necesarias para Thymeleaf en tu proyecto de Spring Boot. Puedes incluir la dependencia de Thymeleaf Starter en tu pom.xml:

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

En el método de tu controlador, recupera el resultado del análisis del servicio de la API de Vision y agrégalo al modelo. El modelo representa los datos que usará Thymeleaf para renderizar la plantilla HTML. Una vez que se propague el modelo, muestra el nombre de la plantilla Thymeleaf que deseas renderizar. Thymeleaf se encarga de procesar la plantilla, sustituir las expresiones del servidor por los datos reales y generar el HTML final que se enviará al navegador del cliente.

En el caso del método extractText en VisionController, devolvimos el resultado como String y no se agregó al modelo. Sin embargo, invocamos el método extractText del método GET en el envío de index.html de la página. Con Thymeleaf, puede crear una experiencia del usuario fluida, en la que los usuarios pueden subir imágenes, activar análisis de la API de Vision y ver los resultados en tiempo real. Aprovecha todo el potencial de tu aplicación de Vision AI aprovechando la potencia de Thymeleaf para el desarrollo de 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. Implementa tu app de visión artificial en Cloud Run

Escribe pruebas de unidades para las clases de tu servicio y controlador a fin de garantizar una funcionalidad adecuada en la carpeta /src/test/java/com/example. Cuando consideres su estabilidad, empaquétala en un artefacto implementable, como un archivo JAR, e impleméntalo en Cloud Run, una plataforma de computación sin servidores de Google Cloud. En este paso, nos enfocaremos en implementar tu aplicación de Spring Boot alojada en contenedores con Cloud Run.

  1. Para empaquetar tu aplicación, ejecuta los siguientes pasos desde Cloud Shell(asegúrate de que la terminal esté enviando mensajes en la carpeta raíz del proyecto).

Compilación:

./mvnw package

Una vez que la compilación se complete correctamente, ejecútala a nivel local para realizar la prueba:

./mvnw spring-boot:run
  1. Aloja en contenedores tu aplicación de Spring Boot con Jib:

En lugar de crear un Dockerfile de forma manual y compilar la imagen de contenedor, puedes usar la utilidad Jib para simplificar el proceso de creación de contenedores. Jib es un complemento que se integra directamente con tu herramienta de compilación (como Maven o Gradle) y te permite compilar imágenes de contenedor optimizadas sin escribir un Dockerfile. Antes de continuar, debes habilitar la API de Artifact Registry (se recomienda usar Artifact Registry en lugar de Container Registry). Luego, ejecuta Jib para compilar una imagen de Docker y publicarla en el registro:

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

Nota: En este experimento, no configuramos el complemento Jib Maven en pom.xml, pero para un uso avanzado, es posible agregarlo a pom.xml con más opciones de configuración.

  1. Implementa el contenedor (que enviamos a Artifact Registry en el paso anterior) en Cloud Run. Este es, de nuevo, un paso de 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

Como alternativa, también puedes hacerlo desde la IU. Navega a la consola de Google Cloud y ubica el servicio de Cloud Run. Haz clic en “Crear servicio”. y sigue las instrucciones en pantalla. Especifica la imagen de contenedor que enviaste antes al registro, establece la configuración de implementación deseada (como la asignación de CPU y el ajuste de escala automático) y elige la región adecuada para la implementación. Puedes establecer variables de entorno específicas para tu aplicación. Estas variables pueden incluir credenciales de autenticación (claves de API, etc.), cadenas de conexión a bases de datos o cualquier otra configuración necesaria para que tu aplicación de Vision AI funcione correctamente. Cuando la implementación se complete correctamente, deberías obtener un extremo para tu aplicación.

Juega con la app de Vision AI

Para fines de demostración, puedes usar la siguiente URL de imagen para que tu aplicación lea y traduzca: https://storage.googleapis.com/img_public_test/tamilwriting1.jfif

654c1b0de0db482.gif

6. Limpia

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en esta publicación:

  1. En la consola de Google Cloud, ve a la página Administrar recursos
  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrarlo.

7. Felicitaciones

¡Felicitaciones! Creaste correctamente una aplicación de Vision AI con Spring Boot y Java. Con la potencia de Vision AI, tu aplicación ahora puede realizar análisis sofisticados de imágenes, incluidos etiquetado, detección de rostro y mucho más. La integración de Spring Boot proporciona una base sólida para crear aplicaciones nativas de Google Cloud escalables y sólidas. Sigue explorando las vastas capacidades de Vision AI, Cloud Run, Cloud Translation y mucho más para mejorar tu aplicación con funciones y funcionalidades adicionales. Para obtener más información, consulta los documentos de la API de Vision, Cloud Translation y GCP Spring. Realiza el mismo experimento con la opción Spring Native. Además, como un adelanto del mundo de la IA generativa, consulta cómo aparece esta API en Model Garden.