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

1. Wprowadzenie

W dzisiejszej erze aplikacji opartych na danych wykorzystywanie zaawansowanych usług uczenia maszynowego i usług sztucznej inteligencji, takich jak rozpoznawanie obrazów, staje się coraz ważniejsze. Jedną z takich usług jest Vision API, który zapewnia zaawansowane możliwości analizy obrazów. Z tego ćwiczenia w programie dowiesz się, jak utworzyć aplikację do rozpoznawania obrazów za pomocą Spring Boot i Javy, dzięki czemu w pełni wykorzystasz potencjał rozpoznawania i analizy obrazów w swoich projektach. Interfejs aplikacji akceptuje jako dane wejściowe publiczne adresy URL obrazów zawierających tekst pisany lub drukowany, wyodrębnia tekst oraz wykrywa język, a jeśli jest to jeden z obsługiwanych języków, generuje angielskie tłumaczenie tekstu.

Co utworzysz

Utworzysz

  • Aplikacja Java Spring Boot korzystająca z interfejsów Vision API i Google Cloud Translation API
  • Wdrożono w Cloud Run

2. Wymagania

  • przeglądarki, na przykład Chrome lub Firefox;
  • Projekt Google Cloud z włączonymi płatnościami

Oto wymagania wstępne:

Tworzenie projektu

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

Instrukcje włączania Google Cloud APIs znajdziesz w dokumentacji.

Aktywowanie Cloud Shell

  1. Użyjesz Cloud Shell – środowiska wiersza poleceń działającego w Google Cloud, które ma wstępnie zainstalowane narzędzie bq:

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

51622c00acec2fa.png

  1. Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest już uwierzytelniony i że projekt jest już ustawiony na identyfikator Twojego projektu. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list
  1. Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt
gcloud config list project
  1. Jeśli Twój projekt nie jest skonfigurowany, ustaw go za pomocą tego polecenia:
gcloud config set project <PROJECT_ID>

Więcej informacji o poleceniach i sposobie korzystania z gcloud znajdziesz w dokumentacji.

3. Wczytywanie projektu Spring Boot

Zacznij od utworzenia nowego projektu Spring Boot przy użyciu preferowanego IDE lub Spring Initializr. Uwzględnij w konfiguracji projektu niezbędne zależności, takie jak Spring Web, Spring Cloud GCP czy Vision AI. Możesz też użyć narzędzia Spring Zdarzenie inicjujące w Cloud Shell, wykonując poniższe czynności, aby łatwo uruchomić aplikację Spring Boot.

Uruchom to polecenie, aby utworzyć projekt 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 -

Nazwa Twojego projektu to spring-vision. Możesz ją zmienić odpowiednio do swoich potrzeb.

Atrybut bootVersion to wersja Spring Boot. Pamiętaj, aby w razie potrzeby zaktualizować ją na etapie wdrażania.

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

37813d3982ce2e42.png

Spowoduje to utworzenie struktury projektu w ramach „wizji wiosennej” jak poniżej:

3E70d45d88ac6935.png

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

src/main/java/com/example/demo zawiera pliki .java klas źródłowych.

Atrybut resources (zasobów) obejmuje obrazy, pliki XML, pliki tekstowe oraz zawartość statyczną, z której korzysta projekt i które są utrzymywane niezależnie.

Plik application.properties umożliwia zarządzanie funkcjami administracyjnymi definiującymi właściwości profilu aplikacji.

4. Konfigurowanie interfejsu Vision API

Po włączeniu interfejsu Vision API możesz skonfigurować dane logowania do interfejsu API w swojej aplikacji. Opcjonalnie do skonfigurowania uwierzytelniania możesz użyć domyślnych danych logowania aplikacji. W tej implementacji demonstracyjnej nie wdrożyłem(-am) jednak korzystania z danych logowania.

Wdrażanie wizji i usług tłumaczeniowych

utworzyć klasę usługi, która współpracuje z interfejsem Vision API; Wstrzyknij niezbędne zależności i użyj klienta Vision API do wysyłania żądań analizy obrazu. W zależności od wymagań aplikacji możesz wdrożyć metody wykonywania zadań, takich jak oznaczanie obrazów etykietami, wykrywanie twarzy czy rozpoznawanie twarzy. W tej wersji demonstracyjnej użyjemy metod wyodrębniania pisma odręcznego i tłumaczenia.

Pamiętaj, aby uwzględnić w pliku pom.xml 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 poniższe 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. wynik.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 z usługi com.google.cloud.translate.v3 umożliwia przekazanie tekstu wyodrębnionego z obrazu i otrzymanie odpowiedzi przetłumaczonego tekstu w wybranym języku docelowym (jeśli źródło znajduje się na jednym z obsługiwanych języków).

Tworzenie interfejsu API typu REST

Zaprojektuj i zaimplementuj punkty końcowe REST, które będą udostępniać funkcje Vision API. Możesz utworzyć kontrolery obsługujące żądania przychodzące i wykorzystywać usługę Vision API do przetwarzania obrazów i zwracania wyników analizy. W tej prezentacji nasza klasa VisionController implementuje punkt końcowy, obsługuje przychodzące żądanie, wywołuje usługi Vision API i Cloud Translation oraz zwraca wynik na warstwę widoku. Implementacja metody GET 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 zawiera 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);
     }

Klasa VisionController ma zaimplementowaną metodę GET dla REST.

Integracja Thymeleaf na potrzeby programowania frontendu

Jednym z popularnych rozwiązań do programowania frontendu w przypadku aplikacji za pomocą Spring Boot jest wykorzystanie możliwości Thymeleaf. Thymeleaf to mechanizm szablonów Java działający po stronie serwera, który umożliwia płynną integrację zawartości dynamicznej ze stronami HTML. Thymeleaf umożliwia bezproblemowe tworzenie szablonów HTML z umieszczonymi wyrażeniami po stronie serwera. Tych wyrażeń można używać do dynamicznego renderowania danych z backendu Spring Boot, co ułatwia wyświetlanie wyników analizy obrazów wykonywanej przez usługę Vision API.

Na początek sprawdź, czy w projekcie Spring Boot masz odpowiednie zależności dla Thymeleaf. Możesz uwzględnić zależność Thymeleaf Starter w 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 zostaną użyte przez Thymeleaf do renderowania szablonu HTML. Po wypełnieniu modelu zwracaj nazwę szablonu Thymeleaf, który chcesz wyrenderować. Thymeleaf zajmie się przetwarzaniem szablonu, zastąpieniem wyrażeń po stronie serwera rzeczywistymi danymi i wygenerowaniem ostatecznego kodu HTML, który zostanie wysłany do przeglądarki klienta.

W przypadku metody extractText w VisionController zwrócoliśmy wynik w postaci String, ale nie dodano go do modelu. Wywołaliśmy jednak metodę GET extractText w index.html podczas przesyłania strony. Thymeleaf zapewnia wygodę użytkownikom, którzy mogą przesyłać obrazy, uruchamiać analizy Vision API i wyświetlać wyniki w czasie rzeczywistym. Wykorzystaj pełny potencjał swojej aplikacji Vision AI, wykorzystując możliwości Thymeleaf do programowania frontendu.

<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

Twórz testy jednostkowe usługi i klas kontrolera, aby zapewnić prawidłowe działanie w folderze /src/test/java/com/example. Gdy będziesz mieć pewność co do stabilności, spakuj ją do możliwego do wdrożenia artefaktu, np. pliku JAR, i wdróż go 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. Zapakuj aplikację, wykonując te czynności w Cloud Shell(sprawdź, czy terminal wyświetla monit w folderze głównym projektu)

Kompilacja:

./mvnw package

Gdy kompilacja się powiedzie, uruchom lokalnie, aby przetestować:

./mvnw spring-boot:run
  1. skonteneryzować aplikację Spring Boot za pomocą Jib.

Zamiast ręcznie tworzyć obiekt Dockerfile i tworzyć 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 (takim jak Maven czy Gradle) i umożliwia tworzenie zoptymalizowanych obrazów kontenerów bez zapisywania kodu Dockerfile. Zanim przejdziesz dalej, musisz włączyć interfejs Artifact Registry API (zalecane jest korzystanie z Artifact Registry zamiast rejestru kontenerów). 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 jeśli korzystasz z zaawansowanych funkcji, możesz dodać ją w pliku pom.xml z większą liczbą opcji konfiguracji.

  1. Wdróż kontener (przekazany do Artifact Registry w poprzednim kroku) do Cloud Run. To znowu jedno polecenie:
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. Wskaż obraz kontenera przekazany wcześniej do rejestru, skonfiguruj odpowiednie ustawienia wdrożenia (takie jak przydział procesora i autoskalowanie) i wybierz odpowiedni region wdrożenia. Możesz ustawić zmienne środowiskowe specyficzne dla aplikacji. Te zmienne mogą obejmować dane uwierzytelniające (klucze interfejsu API itp.), ciągi połączeń z bazą danych lub dowolną inną konfigurację niezbędną do prawidłowego działania aplikacji Vision AI. Po zakończeniu wdrożenia otrzymasz punkt końcowy swojej aplikacji.

Korzystanie z aplikacji Vision AI

W celach demonstracyjnych możesz użyć poniższego adresu URL obrazu, aby Twoja aplikacja mogła odczytywać i tł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 zużyte w tym poście, wykonaj te czynności:

  1. W konsoli Google Cloud otwórz stronę Zarządzanie zasobami
  2. Na liście 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 możliwościom Vision AI Twoja aplikacja może teraz przeprowadzać zaawansowaną analizę obrazów, w tym dodawać etykiety czy wykrywać twarze. Integracja Spring Boot zapewnia solidne podstawy do tworzenia skalowalnych i wydajnych aplikacji natywnych Google Cloud. Kontynuuj poznawanie ogromnych możliwości Vision AI, Cloud Run, Cloud Translation i innych usług, aby wzbogacić swoją aplikację o dodatkowe funkcje. Więcej informacji znajdziesz w dokumentacji interfejsów Vision API, Cloud Translation oraz GCP Spring. Wypróbuj ten sam eksperyment z opcją Wiosenna reklama natywna. Aby dowiedzieć się więcej o generatywnej AI, sprawdź w Bazie modeli, jak ten interfejs API wygląda.