Компьютерное зрение стало проще: Vision AI на Spring Boot и Java

1. Введение

В современную эпоху приложений, основанных на данных, использование передовых сервисов машинного обучения и искусственного интеллекта, таких как компьютерное зрение, приобретает все большее значение. Одним из таких сервисов является Vision API , предоставляющий мощные возможности анализа изображений. В этом практическом занятии вы научитесь создавать приложение компьютерного зрения с использованием Spring Boot и Java, что позволит вам раскрыть потенциал распознавания и анализа изображений в ваших проектах. Пользовательский интерфейс приложения будет принимать в качестве входных данных общедоступные URL-адреса изображений, содержащих письменный или печатный текст, извлекать текст, определять язык и, если это один из поддерживаемых языков, генерировать английский перевод этого текста.

Что вы построите

Вы создадите

  • Java Spring Boot приложение, использующее Vision API и Google Cloud Translation API.
  • Развернуто на Cloud Run

2. Требования

  • Браузер, например Chrome или Firefox.
  • Проект Google Cloud с включенной функцией выставления счетов.

Ниже перечислены необходимые условия:

Создайте свой проект

  1. Учетная запись Google Cloud с созданным проектом и включенной функцией выставления счетов .
  2. Включены API Vision, Translation, Cloud Run и Artifact Registry.
  3. Облачная оболочка активирована
  4. API облачного хранилища активирован, создан сегмент и загружены изображения с текстом или рукописным вводом на поддерживаемых локальных языках (или вы можете использовать примеры ссылок на изображения, представленные в этом блоге).

Инструкции по включению API Google Cloud см. в документации .

Активировать Cloud Shell

  1. Вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud и поставляемую с предустановленным пакетом bq :

В консоли Cloud Console нажмите кнопку «Активировать Cloud Shell» в правом верхнем углу.

51622c00acec2fa.png

  1. После подключения к Cloud Shell вы увидите, что ваша аутентификация пройдена и проект уже настроен на ваш идентификатор проекта. Для подтверждения аутентификации выполните следующую команду в Cloud Shell:
gcloud auth list
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте.
gcloud config list project
  1. Если ваш проект не задан, используйте следующую команду для его установки:
gcloud config set project <PROJECT_ID>

Для получения информации о командах gcloud и их использовании обратитесь к документации .

3. Создание проекта на Spring Boot с нуля.

Для начала создайте новый проект Spring Boot, используя предпочитаемую IDE или Spring Initializr. Добавьте необходимые зависимости, такие как Spring Web, Spring Cloud GCP и Vision AI, в конфигурацию проекта. В качестве альтернативы вы можете использовать Spring Initializr из Cloud Shell, выполнив описанные ниже шаги для простой инициализации вашего приложения Spring Boot.

Выполните следующую команду, чтобы создать свой проект 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 — это название вашего проекта, измените его в соответствии с вашими потребностями.

bootVersion — это версия Spring Boot; при необходимости обновите её во время реализации.

Параметр `type` указывает версию инструмента сборки проекта; при желании его можно изменить на `gradle`.

37813d3982ce2e42.png

Это создаст структуру проекта в рамках "spring-vision", как показано ниже:

3e70d45d88ac6935.png

Файл pom.xml содержит все зависимости для проекта (зависимости, которые вы настроили с помощью этой команды, уже добавлены в ваш файл pom.xml).

В папке src/main/java/com/example/demo находятся исходные файлы классов с расширением .java.

Ресурсы включают изображения, XML-файлы, текстовые файлы и статический контент, используемый проектом, которые поддерживаются независимо.

Файл application.properties позволяет управлять административными функциями и определять свойства приложения, специфичные для каждого профиля пользователя.

4. Настройка Vision API

После включения Vision API у вас появится возможность настроить учетные данные API в вашем приложении. При желании вы можете использовать учетные данные приложения по умолчанию для настройки аутентификации. Однако в этой демонстрационной реализации я не использовал учетные данные.

Внедрение услуг по визуализации и переводу.

Создайте сервисный класс, взаимодействующий с Vision API. Внедрите необходимые зависимости и используйте клиент Vision API для отправки запросов на анализ изображений. Вы можете реализовать методы для выполнения таких задач, как разметка изображений, обнаружение и распознавание лиц и многое другое, в зависимости от требований вашего приложения. В этом примере мы будем использовать методы извлечения и перевода рукописного текста.

Для этого убедитесь, что вы добавили следующие зависимости в файл 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>

Клонируйте/замените следующие файлы из репозитория и добавьте их в соответствующие папки/пути в структуре проекта:

  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

Метод extractTextFromImage в сервисе org.springframework.cloud.gcp.vision.CloudVisionTemplate позволяет извлекать текст из входного изображения. Метод getTranslatedText из сервиса com.google.cloud.translate.v3 позволяет передать извлеченный текст из изображения и получить в ответ переведенный текст на желаемом целевом языке (если исходный текст находится в списке поддерживаемых языков).

Создание REST API

Разработайте и реализуйте REST-конечные точки, которые будут предоставлять доступ к функционалу Vision API. Создайте контроллеры, которые обрабатывают входящие запросы и используют сервис Vision API для обработки изображений и возврата результатов анализа. В этом примере наш класс VisionController реализует конечную точку, обрабатывает входящий запрос, вызывает сервисы Vision API и Cloud Translation и возвращает результат на уровень представления. Реализация метода GET для REST-конечной точки выглядит следующим образом:

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

В приведенной выше реализации класс TranslateText содержит метод, вызывающий службу облачного перевода:

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

В классе VisionController реализован метод GET для работы с REST-запросами.

Интеграция Thymeleaf для фронтенд-разработки.

При разработке приложений с использованием Spring Boot одним из популярных вариантов для фронтенд-разработки является использование возможностей Thymeleaf. Thymeleaf — это серверный шаблонизатор на Java, который позволяет легко интегрировать динамический контент в ваши HTML-страницы. Thymeleaf обеспечивает удобный процесс разработки, позволяя создавать HTML-шаблоны со встроенными серверными выражениями. Эти выражения можно использовать для динамической отрисовки данных из вашего бэкенда Spring Boot, что упрощает отображение результатов анализа изображений, выполняемого сервисом Vision API.

Для начала убедитесь, что в вашем проекте Spring Boot установлены необходимые зависимости для Thymeleaf. Вы можете добавить зависимость Thymeleaf Starter в свой файл pom.xml:

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

В методе контроллера получите результаты анализа из сервиса Vision API и добавьте их в модель. Модель представляет данные, которые будут использоваться Thymeleaf для рендеринга HTML-шаблона. После заполнения модели верните имя шаблона Thymeleaf, который вы хотите отобразить. Thymeleaf позаботится об обработке шаблона, заменив выражения на стороне сервера фактическими данными и сгенерировав окончательный HTML-код, который будет отправлен в браузер клиента.

В случае метода extractText в VisionController мы вернули результат в виде String , а не добавили его в модель. Но мы вызвали метод extractText из GET-запроса в файле index.html при отправке страницы. С помощью Thymeleaf вы можете создать удобный пользовательский интерфейс, где пользователи могут загружать изображения, запускать анализ Vision API и просматривать результаты в режиме реального времени. Раскройте весь потенциал вашего приложения Vision AI, используя возможности Thymeleaf для фронтенд-разработки.

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

5. Развертывание вашего приложения компьютерного зрения на Cloud Run.

Напишите модульные тесты для ваших классов сервиса и контроллера, чтобы обеспечить их корректную работу в папке /src/test/java/com/example . Как только вы убедитесь в стабильности, упакуйте его в развертываемый артефакт, например, JAR-файл, и разверните на Cloud Run — платформе бессерверных вычислений в Google Cloud. На этом этапе мы сосредоточимся на развертывании вашего контейнеризированного приложения Spring Boot с помощью Cloud Run.

  1. Упакуйте ваше приложение, выполнив следующие шаги в Cloud Shell (убедитесь, что терминал находится в корневой папке проекта).

Строить:

./mvnw package

После успешной сборки запустите программу локально для тестирования:

./mvnw spring-boot:run
  1. Создайте контейнер для вашего Spring Boot приложения с помощью Jib:

Вместо того чтобы вручную создавать Dockerfile и собирать образ контейнера, вы можете использовать утилиту Jib для упрощения процесса контейнеризации. Jib — это плагин, который напрямую интегрируется с вашим инструментом сборки (например, Maven или Gradle) и позволяет создавать оптимизированные образы контейнеров без написания Dockerfile . Прежде чем продолжить, необходимо включить API Artifact Registry (рекомендуется использовать Artifact Registry вместо реестра контейнеров). Затем запустите Jib для сборки образа Docker и публикации его в реестре:

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

Примечание: В этом эксперименте мы не настраивали плагин Jib Maven в файле pom.xml, но для более продвинутого использования его можно добавить в pom.xml с дополнительными параметрами конфигурации.

  1. Разверните контейнер (который мы загрузили в Artifact Registry на предыдущем шаге) в Cloud Run. Это снова делается одной командой:
gcloud run deploy vision-app --image gcr.io/$GOOGLE_CLOUD_PROJECT/vision-jib --platform managed --region us-central1 --allow-unauthenticated --update-env-vars

Также это можно сделать через пользовательский интерфейс. Перейдите в консоль Google Cloud и найдите службу Cloud Run. Нажмите «Создать службу» и следуйте инструкциям на экране. Укажите образ контейнера, который вы ранее загрузили в реестр, настройте необходимые параметры развертывания (например, распределение ЦП и автомасштабирование) и выберите соответствующий регион для развертывания. Вы можете установить переменные среды, специфичные для вашего приложения. Эти переменные могут включать учетные данные аутентификации (ключи API и т. д.), строки подключения к базе данных или любую другую конфигурацию, необходимую для корректной работы вашего приложения Vision AI. После успешного завершения развертывания вы должны получить конечную точку для вашего приложения.

Эксперименты с вашим приложением Vision AI

В демонстрационных целях вы можете использовать указанную ниже ссылку на изображение, чтобы ваше приложение могло его читать и переводить: https://storage.googleapis.com/img_public_test/tamilwriting1.jfif

654c1b0de0db482.gif

6. Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, использованные в этой статье, выполните следующие действия:

  1. В консоли Google Cloud перейдите на страницу «Управление ресурсами».
  2. В списке проектов выберите проект, который хотите удалить, и нажмите «Удалить».
  3. В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить», чтобы удалить проект.

7. Поздравляем!

Поздравляем! Вы успешно создали приложение Vision AI с использованием Spring Boot и Java. Благодаря возможностям Vision AI ваше приложение теперь может выполнять сложный анализ изображений, включая маркировку, распознавание лиц и многое другое. Интеграция Spring Boot обеспечивает прочную основу для создания масштабируемых и надежных приложений Google Cloud Native . Продолжайте изучать обширные возможности Vision AI, Cloud Run, Cloud Translation и других инструментов, чтобы расширить возможности вашего приложения. Чтобы узнать больше, ознакомьтесь с документацией Vision API , Cloud Translation и GCP Spring . Попробуйте тот же эксперимент с вариантом Spring Native ! А также, чтобы заглянуть в мир Gen-AI, посмотрите, как этот API отображается в Model Garden .