Proste rozpoznawanie obrazów: Vision AI w Spring Boot i Javie

1. Wprowadzenie

W dzisiejszej erze aplikacji opartych na danych coraz większe znaczenie ma wykorzystywanie zaawansowanych usług uczenia maszynowego i sztucznej inteligencji, takich jak rozpoznawanie obrazu. Jedną z takich usług jest Vision API, która zapewnia zaawansowane funkcje analizy obrazów. Z tego ćwiczenia w Codelabs dowiesz się, jak utworzyć aplikację Computer Vision za pomocą Spring Boot i Javy, co pozwoli Ci wykorzystać potencjał rozpoznawania i analizy obrazów w Twoich projektach. Interfejs aplikacji będzie akceptować jako dane wejściowe publiczne adresy URL obrazów zawierających tekst pisany lub drukowany, wyodrębniać tekst, wykrywać język i, jeśli jest to jeden z obsługiwanych języków, generować tłumaczenie tego tekstu na język angielski.

Co utworzysz

Utworzysz

  • Aplikacja Java Spring Boot do korzystania z interfejsu Vision API i Google Cloud Translation API
  • Wdrożona w Cloud Run

2. Wymagania

  • przeglądarka, np. Chrome lub Firefox;
  • projekt Google Cloud z włączonymi płatnościami;

Wymagania wstępne:

Tworzenie projektu

  1. konto Google Cloud z utworzonym projektem i włączonymi płatnościami;
  2. Włączone interfejsy Vision API, Translation API, Cloud Run API i Artifact Registry API
  3. Cloud Shell aktywny
  4. Włączony interfejs Cloud Storage API z utworzonym zasobnikiem i przesłanymi obrazami z tekstem lub pismem odręcznym w obsługiwanych językach lokalnych (możesz też użyć przykładowych linków do obrazów podanych na tym blogu).

Instrukcje włączania interfejsów Google Cloud API znajdziesz w dokumentacji.

Aktywuj Cloud Shell

  1. Będziesz używać Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud, które jest wstępnie załadowane narzędziem bq:

W konsoli Cloud kliknij Aktywuj Cloud Shell w prawym górnym rogu.

51622c00acec2fa.png

  1. Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu. Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list
  1. Aby potwierdzić, że polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project
  1. Jeśli projekt nie jest ustawiony, użyj tego polecenia, aby go ustawić:
gcloud config set project <PROJECT_ID>

Informacje o poleceniach gcloud i ich użyciu znajdziesz w dokumentacji.

3. Tworzenie projektu Spring Boot

Aby rozpocząć, utwórz nowy projekt Spring Boot w wybranym środowisku IDE lub w Spring Initializr. W konfiguracji projektu uwzględnij niezbędne zależności, takie jak Spring Web, Spring Cloud GCP i Vision AI. Możesz też użyć Spring Initializr z Cloud Shell, wykonując poniższe czynności, aby łatwo uruchomić aplikację Spring Boot.

Aby utworzyć projekt Spring Boot, uruchom to polecenie:

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 to nazwa projektu. Zmień ją zgodnie ze swoimi potrzebami.

bootVersion to wersja Spring Boot. W razie potrzeby zaktualizuj ją w momencie implementacji.

type to wersja typu narzędzia do kompilacji projektu. W razie potrzeby możesz zmienić ją na gradle.

37813d3982ce2e42.png

Spowoduje to utworzenie struktury projektu w folderze „spring-vision” w sposób pokazany poniżej:

3e70d45d88ac6935.png

Plik pom.xml zawiera wszystkie zależności projektu (zależności skonfigurowane za pomocą tego polecenia są już dodane w pliku pom.xml).

W folderze src/main/java/com/example/demo znajdują się pliki .java z klasami źródłowymi.

resources zawiera obrazy, pliki XML, pliki tekstowe i treści statyczne używane w projekcie, które są utrzymywane niezależnie.

application.properties umożliwia zachowanie funkcji administracyjnych do definiowania właściwości aplikacji specyficznych dla profilu.

4. Konfigurowanie interfejsu Vision API

Po włączeniu interfejsu Vision API możesz skonfigurować dane logowania w aplikacji. Do skonfigurowania uwierzytelniania możesz opcjonalnie użyć domyślnego uwierzytelniania aplikacji. W tej wersji demonstracyjnej nie zaimplementowałem jednak używania danych logowania.

Wdrażanie usług związanych z widzeniem i tłumaczeniem

Utwórz klasę usługi, która będzie korzystać z interfejsu Vision API. Wstrzyknij niezbędne zależności i użyj klienta API Vision, aby wysłać żądania analizy obrazu. Możesz wdrożyć metody wykonywania zadań takich jak etykietowanie obrazów, wykrywanie i rozpoznawanie twarzy itp. w zależności od wymagań aplikacji. W tej wersji demonstracyjnej użyjemy metod wyodrębniania i tłumaczenia pisma odręcznego.

W tym celu upewnij się, że w pliku pom.xml znajdują się te zależności:

<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>

Skopiuj lub zastąp te pliki z repozytorium i dodaj je do odpowiednich folderów lub ścieżek w strukturze projektu:

  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

Metoda extractTextFromImage w usłudze org.springframework.cloud.gcp.vision.CloudVisionTemplate umożliwia wyodrębnianie tekstu z obrazu wejściowego. Metoda getTranslatedText w usłudze com.google.cloud.translate.v3 umożliwia przekazanie wyodrębnionego tekstu z obrazu i otrzymanie w odpowiedzi przetłumaczonego tekstu w wybranym języku docelowym (jeśli język źródłowy znajduje się na liście obsługiwanych języków).

Tworzenie interfejsu API typu REST

Zaprojektuj i wdroż interfejsy REST API, które będą udostępniać funkcje Vision API. Utwórz kontrolery, które obsługują żądania przychodzące i korzystają z usługi Vision API do przetwarzania obrazów i zwracania wyników analizy. W tym przykładzie klasa VisionController implementuje punkt końcowy, obsługuje przychodzące żądanie, wywołuje interfejs Vision API i usługi Cloud Translation oraz zwraca wynik do warstwy widoku. Implementacja metody GET dla punktu końcowego REST wygląda tak:

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

Klasa TranslateText w powyższej implementacji ma metodę, która wywołuje usługę 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);
     }

W przypadku VisionController zaimplementowaliśmy metodę GET dla interfejsu REST.

Integracja Thymeleaf na potrzeby tworzenia frontendu

Podczas tworzenia aplikacji za pomocą Spring Boot popularnym wyborem w przypadku programowania frontendu jest wykorzystanie możliwości Thymeleaf. Thymeleaf to serwerowy silnik szablonów Java, który umożliwia bezproblemowe integrowanie treści dynamicznych ze stronami HTML. Thymeleaf zapewnia płynne programowanie, ponieważ umożliwia tworzenie szablonów HTML z osadzonymi wyrażeniami po stronie serwera. Te wyrażenia można wykorzystać do dynamicznego renderowania danych z backendu Spring Boot, co ułatwia wyświetlanie wyników analizy obrazów przeprowadzanej przez usługę Vision API.

Na początek sprawdź, czy w projekcie Spring Boot masz niezbędne zależności dla Thymeleaf. Możesz dodać zależność Thymeleaf Starter do pliku pom.xml:

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

W metodzie kontrolera pobierz wynik analizy z usługi Vision API i dodaj go do modelu. Model reprezentuje dane, które będą używane przez Thymeleaf do renderowania szablonu HTML. Gdy model zostanie wypełniony, zwróć nazwę szablonu Thymeleaf, który chcesz wyrenderować. Thymeleaf przetworzy szablon, zastępując wyrażenia po stronie serwera rzeczywistymi danymi i generując końcowy kod HTML, który zostanie wysłany do przeglądarki klienta.

W przypadku metody extractTextVisionController zwróciliśmy wynik jako String i nie dodaliśmy go do modelu. Jednak po przesłaniu strony wywołaliśmy metodę GET extractTextindex.html. Dzięki Thymeleaf możesz zapewnić użytkownikom wygodę, umożliwiając im przesyłanie obrazów, wywoływanie analiz interfejsu Vision API i wyświetlanie wyników w czasie rzeczywistym. Wykorzystaj pełny potencjał aplikacji Vision AI, korzystając z możliwości Thymeleaf w zakresie tworzenia interfejsu.

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

5. Wdrażanie aplikacji do rozpoznawania obrazów w Cloud Run

Napisz testy jednostkowe dla klas usług i kontrolerów, aby zapewnić prawidłowe działanie w folderze /src/test/java/com/example. Gdy będziesz mieć pewność, że jest stabilna, spakuj ją w artefakt do wdrożenia, np. plik JAR, i wdroż ją w Cloud Run, bezserwerowej platformie obliczeniowej w Google Cloud. W tym kroku skupimy się na wdrożeniu skonteneryzowanej aplikacji Spring Boot za pomocą Cloud Run.

  1. Spakuj aplikację, wykonując te czynności w Cloud Shell(upewnij się, że Terminal wyświetla monit w folderze głównym projektu):

Kompilacja:

./mvnw package

Po pomyślnym utworzeniu kompilacji uruchom ją lokalnie, aby przetestować:

./mvnw spring-boot:run
  1. Konteneryzowanie aplikacji Spring Boot za pomocą Jib:

Zamiast ręcznie tworzyć Dockerfile i kompilować obraz kontenera, możesz użyć narzędzia Jib, aby uprościć proces konteneryzacji. Jib to wtyczka, która integruje się bezpośrednio z narzędziem do kompilacji (np. Maven lub Gradle) i umożliwia tworzenie zoptymalizowanych obrazów kontenerów bez pisania Dockerfile. Zanim przejdziesz dalej, musisz włączyć interfejs Artifact Registry API (zalecamy korzystanie z Artifact Registry zamiast z Container Registry). Następnie uruchom Jib, aby utworzyć obraz Dockera i opublikować go w rejestrze:

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

Uwaga: w tym eksperymencie nie skonfigurowaliśmy wtyczki Jib Maven w pliku pom.xml, ale w przypadku zaawansowanego użycia można ją dodać do pliku pom.xml z większą liczbą opcji konfiguracji.

  1. Wdróż w Cloud Run kontener, który w poprzednim kroku został przeniesiony do Artifact Registry. To kolejny krok, który wymaga tylko jednego polecenia:
gcloud run deploy vision-app --image gcr.io/$GOOGLE_CLOUD_PROJECT/vision-jib --platform managed --region us-central1 --allow-unauthenticated --update-env-vars

Możesz to też zrobić w interfejsie. Otwórz konsolę Google Cloud i znajdź usługę Cloud Run. Kliknij „Utwórz usługę” i postępuj zgodnie z instrukcjami wyświetlanymi na ekranie. Określ obraz kontenera, który został wcześniej przesłany do rejestru, skonfiguruj żądane ustawienia wdrożenia (np. przydział procesora i autoskalowanie) i wybierz odpowiedni region wdrożenia. Możesz ustawić zmienne środowiskowe specyficzne dla aplikacji. Te zmienne mogą obejmować dane logowania (klucze interfejsu API itp.), ciągi połączenia z bazą danych lub dowolną inną konfigurację potrzebną do prawidłowego działania aplikacji Vision AI. Po pomyślnym zakończeniu wdrażania powinien pojawić się punkt końcowy aplikacji.

Korzystanie z aplikacji Vision AI

Na potrzeby demonstracji możesz użyć poniższego adresu URL obrazu, aby aplikacja mogła go odczytać i przetłumaczyć: https://storage.googleapis.com/img_public_test/tamilwriting1.jfif

654c1b0de0db482.gif

6. Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby użyte w tym poście, wykonaj te czynności:

  1. W konsoli Google Cloud otwórz stronę Zarządzanie zasobami.
  2. Z listy projektów wybierz projekt do usunięcia, a potem kliknij Usuń.
  3. W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.

7. Gratulacje

Gratulacje! Udało Ci się utworzyć aplikację Vision AI za pomocą Spring Boot i Javy. Dzięki Vision AI Twoja aplikacja może teraz przeprowadzać zaawansowaną analizę obrazów, w tym etykietowanie i wykrywanie twarzy. Integracja Spring Boot zapewnia solidną podstawę do tworzenia skalowalnych i niezawodnych aplikacji Google Cloud Native. Poznaj szerokie możliwości Vision AI, Cloud Run, Cloud Translation i innych usług, aby wzbogacić aplikację o dodatkowe funkcje. Więcej informacji znajdziesz w dokumentacji Vision API, Cloud Translation i GCP Spring. Wypróbuj ten sam eksperyment z opcją Spring Native. Aby poznać świat generatywnej AI, zobacz, jak ten interfejs API wygląda w Model Garden.