간편해진 컴퓨터 비전: Spring Boot 및 Java의 Vision AI

1. 소개

오늘날 데이터 기반 애플리케이션 시대에는 컴퓨터 비전과 같은 고급 머신러닝 및 인공지능 서비스를 활용하는 것이 점점 더 중요해지고 있습니다. 이러한 서비스 중 하나가 강력한 이미지 분석 기능을 제공하는 Vision API입니다. 이 Codelab에서는 Spring Boot와 Java를 사용하여 컴퓨터 비전 애플리케이션을 만드는 방법을 알아봅니다. 이를 통해 프로젝트에서 이미지 인식 및 분석의 잠재력을 활용할 수 있습니다. 애플리케이션 UI는 작성되거나 인쇄된 텍스트가 포함된 이미지의 공개 URL을 입력으로 받아들이고, 텍스트를 추출하고, 언어를 감지합니다. 감지된 언어가 지원되는 언어 중 하나인 경우 해당 텍스트의 영어 번역을 생성합니다.

빌드할 항목

다음과 같은

  • Vision API 및 Google Cloud Translation API를 사용하는 Java Spring Boot 애플리케이션
  • Cloud Run에 배포됨

2. 요구사항

  • 브라우저(Chrome 또는 Firefox 등)
  • 결제가 사용 설정된 Google Cloud 프로젝트

다음은 기본 요건입니다.

프로젝트 만들기

  1. 프로젝트가 생성되고 결제가 사용 설정된 Google Cloud 계정
  2. Vision API, Translation, Cloud Run, Artifact Registry API 사용 설정
  3. Cloud Shell활성화
  4. 버킷이 생성되고 지원되는 현지 언어로 된 텍스트 또는 손글씨가 포함된 이미지가 업로드된 Cloud Storage API (또는 이 블로그에 제공된 샘플 이미지 링크 사용 가능)

Google Cloud API를 사용 설정하는 단계는 문서를 참고하세요.

Cloud Shell 활성화

  1. bq가 미리 로드되어 제공되는 Google Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다.

Cloud 콘솔에서 오른쪽 상단에 있는 Cloud Shell 활성화를 클릭합니다.

51622c00acec2fa.png

  1. Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 이미 설정된 것을 볼 수 있습니다. Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list
  1. Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.
gcloud config list project
  1. 프로젝트가 설정되지 않은 경우 다음 명령어를 사용하여 설정합니다.
gcloud config set project <PROJECT_ID>

gcloud 명령어 및 사용법은 문서를 참조하세요.

3. Spring Boot 프로젝트 부트스트랩

시작하려면 선호하는 IDE 또는 Spring Initializr를 사용하여 새 Spring Boot 프로젝트를 만드세요. 프로젝트 구성에 Spring Web, Spring Cloud GCP, Vision AI와 같은 필수 종속 항목을 포함합니다. 또는 아래 단계에 따라 Cloud Shell에서 Spring Initializr를 사용하여 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 파일이 있습니다.

resources에는 프로젝트에서 사용하는 이미지, 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

org.springframework.cloud.gcp.vision.CloudVisionTemplate 서비스의 extractTextFromImage 메서드를 사용하면 이미지 입력에서 텍스트를 추출할 수 있습니다. 서비스 com.google.cloud.translate.v3의 메서드 getTranslatedText를 사용하면 이미지에서 추출한 텍스트를 전달하고 원하는 대상 언어로 번역된 텍스트를 응답으로 받을 수 있습니다 (소스가 지원되는 언어 목록에 있는 경우).

REST API 빌드

Vision API 기능을 노출하는 REST 엔드포인트를 설계하고 구현합니다. 수신 요청을 처리하고 Vision API 서비스를 활용하여 이미지를 처리하고 분석 결과를 반환하는 컨트롤러를 만듭니다. 이 데모에서 VisionController 클래스는 엔드포인트를 구현하고, 수신 요청을 처리하고, Vision API 및 Cloud Translation 서비스를 호출하고, 결과를 뷰 레이어로 반환합니다. REST 엔드포인트의 GET 메서드 구현은 다음과 같습니다.

@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 클래스를 사용하면 REST의 GET 메서드가 구현됩니다.

프런트엔드 개발을 위한 Thymeleaf 통합

Spring Boot로 애플리케이션을 빌드할 때 프런트엔드 개발을 위해 Thymeleaf의 기능을 활용하는 것이 인기 있는 선택입니다. Thymeleaf는 동적 콘텐츠를 HTML 페이지에 원활하게 통합할 수 있는 서버 측 Java 템플릿 엔진입니다. Thymeleaf를 사용하면 서버 측 표현식이 삽입된 HTML 템플릿을 만들어 원활한 개발 환경을 제공할 수 있습니다. 이러한 표현식을 사용하면 Spring Boot 백엔드에서 데이터를 동적으로 렌더링하여 Vision API 서비스에서 실행한 이미지 분석 결과를 더 쉽게 표시할 수 있습니다.

시작하려면 Spring Boot 프로젝트에 Thymeleaf에 필요한 종속 항목이 있는지 확인하세요. pom.xml에 Thymeleaf Starter 종속 항목을 포함할 수 있습니다.

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

컨트롤러 메서드에서 Vision API 서비스의 분석 결과를 검색하여 모델에 추가합니다. 모델은 Thymeleaf가 HTML 템플릿을 렌더링하는 데 사용할 데이터를 나타냅니다. 모델이 채워지면 렌더링하려는 Thymeleaf 템플릿의 이름을 반환합니다. Thymeleaf는 템플릿을 처리하고, 서버 측 표현식을 실제 데이터로 대체하고, 클라이언트의 브라우저로 전송될 최종 HTML을 생성합니다.

VisionControllerextractText 메서드의 경우 결과를 String로 반환하고 모델에 추가하지 않았습니다. 하지만 페이지 제출 시 index.html에서 GET 메서드 extractText 메서드를 호출했습니다. Thymeleaf를 사용하면 사용자가 이미지를 업로드하고, Vision API 분석을 트리거하고, 결과를 실시간으로 볼 수 있는 원활한 사용자 환경을 만들 수 있습니다. 프런트엔드 개발에 Thymeleaf의 기능을 활용하여 Vision AI 애플리케이션의 잠재력을 최대한 활용하세요.

<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 파일과 같은 배포 가능한 아티팩트로 패키징하고 Google Cloud의 서버리스 컴퓨팅 플랫폼인 Cloud Run에 배포합니다. 이 단계에서는 Cloud Run을 사용하여 컨테이너화된 Spring Boot 애플리케이션을 배포하는 데 중점을 둡니다.

  1. Cloud Shell에서 다음 단계를 실행하여 애플리케이션을 패키징합니다(터미널이 프로젝트 루트 폴더에 프롬프트를 표시하는지 확인).

빌드:

./mvnw package

빌드가 완료되면 로컬에서 실행하여 테스트합니다.

./mvnw spring-boot:run
  1. Jib를 사용하여 Spring Boot 애플리케이션을 컨테이너화합니다.

Dockerfile를 수동으로 만들고 컨테이너 이미지를 빌드하는 대신 Jib 유틸리티를 사용하여 컨테이너화 프로세스를 간소화할 수 있습니다. Jib는 빌드 도구 (예: Maven 또는 Gradle)와 직접 통합되는 플러그인으로, Dockerfile를 작성하지 않고도 최적화된 컨테이너 이미지를 빌드할 수 있습니다. 계속하기 전에 Artifact Registry API를 사용 설정해야 합니다 (컨테이너 레지스트리보다 Artifact Registry 사용 권장). 그런 다음 Jib을 실행하여 Docker 이미지를 빌드하고 레지스트리에 게시합니다.

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

참고: 이 실험에서는 pom.xml에서 Jib Maven 플러그인을 구성하지 않았지만 고급 사용의 경우 더 많은 구성 옵션과 함께 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

UI에서 이 작업을 수행할 수도 있습니다. Google Cloud 콘솔로 이동하여 Cloud Run 서비스를 찾습니다. '서비스 만들기'를 클릭하고 화면에 표시된 안내를 따릅니다. 이전에 레지스트리에 푸시한 컨테이너 이미지를 지정하고, 원하는 배포 설정 (예: CPU 할당 및 자동 확장)을 구성하고, 배포에 적합한 리전을 선택합니다. 애플리케이션에 특정한 환경 변수를 설정할 수 있습니다. 이러한 변수에는 인증 사용자 인증 정보 (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. 대화상자에서 프로젝트 ID를 입력한 후 '종료'를 클릭하여 프로젝트를 삭제합니다.

7. 축하합니다

축하합니다. Spring Boot 및 Java를 사용하여 Vision AI 애플리케이션을 만들었습니다. 이제 Vision AI를 사용하여 애플리케이션에서 라벨링, 얼굴 감지 등 정교한 이미지 분석을 실행할 수 있습니다. Spring Boot 통합은 확장 가능하고 강력한 Google Cloud 네이티브 애플리케이션을 빌드하기 위한 견고한 기반을 제공합니다. Vision AI, Cloud Run, Cloud Translation 등의 다양한 기능을 계속 살펴보고 추가 기능과 기능으로 애플리케이션을 개선하세요. 자세한 내용은 Vision API, Cloud Translation, GCP Spring 문서를 참고하세요. Spring Native 옵션으로 동일한 실험을 시도해 보세요. 생성형 AI 세계를 미리 엿볼 수 있도록 이 API가 Model Garden에 표시되는 방식도 확인해 보세요.