Компьютерное зрение стало проще: 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. Vision API, API перевода, Cloud Run и Artifact Registry API включены.
  3. Cloud Shell активирован
  4. API Cloud Storage включен, создана корзина и загружены изображения с текстом или рукописным текстом на местных поддерживаемых языках (или вы можете использовать примеры ссылок на изображения, представленные в этом блоге).

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

Активировать 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

Это создает структуру проекта в рамках «весеннего видения», как показано ниже:

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 в приведенной выше реализации имеет метод, который вызывает службу 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);
     }

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

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

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

Для начала убедитесь, что у вас есть необходимые зависимости для Thymeleaf в вашем проекте Spring Boot. Вы можете включить зависимость 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 реестра артефактов (рекомендуется использовать реестр артефактов вместо реестра контейнеров). Затем запустите 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. Разверните контейнер (который мы отправили в реестр артефактов на предыдущем шаге) в 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 Console и найдите службу Cloud Run. Нажмите «Создать услугу» и следуйте инструкциям на экране. Укажите образ контейнера, который вы ранее отправили в реестр, настройте нужные параметры развертывания (например, распределение ЦП и автоматическое масштабирование) и выберите соответствующий регион для развертывания. Вы можете установить переменные среды, специфичные для вашего приложения. Эти переменные могут включать учетные данные аутентификации (ключи API и т. д.), строки подключения к базе данных или любую другую конфигурацию, необходимую для правильной работы вашего приложения Vision AI. После успешного завершения развертывания вы должны получить конечную точку для своего приложения.

Игра с приложением Vision AI

В демонстрационных целях вы можете использовать URL-адрес изображения ниже, чтобы ваше приложение могло читать и переводить: 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 .