간편해진 컴퓨터 비전: 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을 생성합니다.

VisionController에 있는 extractText 메서드의 경우 결과를 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를 사용 설정해야 합니다. Container 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

참고: 이 실험에서는 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 Native 애플리케이션을 빌드하기 위한 견고한 기반을 제공합니다. 계속해서 Vision AI, Cloud Run, Cloud Translation 등의 다양한 기능을 살펴보고 추가 기능을 통해 애플리케이션을 개선하세요. 자세한 내용은 Vision API, Cloud Translation, GCP Spring 문서를 참조하세요. 스프링 네이티브 옵션으로 동일한 실험을 시도해 보세요. 또한 생성형 AI를 접하기 위해 모델 가든에서 이 API가 어떻게 표시되는지 확인해 보세요.