
글 혹은 사진 속에 있는 텍스트에서 '업체' 혹은 '제공'과 같은 단어를 찾아낼 수 있어야 했다. 그래서 우선적으로 생각한게 광고 업체의 이미지를 등록해두고 그 사진들과 비교하면?? 이란 생각을 하다가
아니지!! OCR로 이미지에서 텍스트를 추출해서 검색하면 끝이자나?! 라는 생각을 하게되었다! 그래서 본격적으로 프로젝트를 시작하기 전, OCR API를 찾아보고 사용해보려고 했다.
우선 원래 종종 사용했던 Google Cloud에서 Vision API를 통해 OCR을 지원한다는 것을 알게 되었다. 그래서 우선 구글 API를 먼저 사용해보기로 했다! 그 외에도 네이버에서 지원하는 Clova API도 OCR을 지원하더라. 구글 다음에 네이버 API를 사용해볼 예정이다 ㅎㅎ
우선 구글에서 API 사용하기 후 서비스 인증키를 다운받았다. API 사용하기는 찾아보면 바로 나오니 패스 .... 서비스 인증키도 패스 .... 완전 간단함!! 인증키는 IAM 및 관리자 > 서비스 계정 에서 서비스 계정 만들고 키 추가하면 됨!
여기서 중요한게 환경변수를 등록해줘서 내 계정의 API를 사용할 수 있다! 나는 IntelliJ를 사용하기 때문에 터미널에서 환경변수를 설정할게 아니라 ... 인텔리제이 안에서 환경변수를 등록해야한다.....
한상곤 교수님께서 항상 말씀하셨지 .... 인텔리제이를 사용할거라면 모든걸 이 안에서 관리해야 한다고 ......... 자바 버전부터 시작해서 터미널에서 작업할 일이 없을거라고 ..... 그리 말씀하셨는데 그걸 그새 까먹고 삽질했다. ㅎㅎㅎㅎ

여기로 들어가서
옵션 수정 > 환경변수 클릭 후에 GOOGLE_APPLICATION_CREDENTIALS=인증키위치 를 추가하면 준비 완료!! 인증키 (.json파일) 위치는 절대위치로 적어주자
요청 전송은 구글 API 명세서에 예제 코드가 잘 나와있다!
package com.seokwns.refilt.core.util;
import com.google.cloud.vision.v1.AnnotateImageRequest;
import com.google.cloud.vision.v1.AnnotateImageResponse;
import com.google.cloud.vision.v1.BatchAnnotateImagesResponse;
import com.google.cloud.vision.v1.EntityAnnotation;
import com.google.cloud.vision.v1.Feature;
import com.google.cloud.vision.v1.Image;
import com.google.cloud.vision.v1.ImageAnnotatorClient;
import com.google.cloud.vision.v1.ImageSource;
import org.springframework.stereotype.Service;
import org.springframework.util.StopWatch;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Service
public class GoogleVisionOCR {
public static String execute(String url) throws IOException {
StopWatch totalTime = new StopWatch();
totalTime.start();
List<AnnotateImageRequest> requests = new ArrayList<>();
ImageSource imgSource = ImageSource.newBuilder().setImageUri(url).build();
Image img = Image.newBuilder().setSource(imgSource).build();
Feature feat = Feature.newBuilder().setType(Feature.Type.TEXT_DETECTION).build();
AnnotateImageRequest request =
AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
requests.add(request);
try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
List<AnnotateImageResponse> responses = response.getResponsesList();
StringBuilder result = new StringBuilder();
for (AnnotateImageResponse res : responses) {
if (res.hasError()) {
System.out.format("Error: %s%n", res.getError().getMessage());
return null;
}
for (EntityAnnotation annotation : res.getTextAnnotationsList()) {
result.append(annotation.getDescription()).append(" ");
}
}
totalTime.stop();
System.out.println("Total Time : " + totalTime.getTotalTimeMillis() + "ms");
return result.toString();
}
catch (Exception exception) {
return exception.getMessage();
}
}
}
여기서 함정이 있는게 구글 Gcp?? 라는게 있는데 그걸 사용하지 않고 웹 상에 있는 사진을 사용하고 싶다면, ImageSource imgSource = ImageSource.newBuilder().setImageUri(url).build(); 반드시 이렇게 사용해줘야 한다..... 이거로도 삽질 꽤나 했음 ㅎㅎㅎㅎ
그리고 간단하게 컨트롤러 작성해주면
@PostMapping("/parse/text/google")
public ResponseEntity<?> parseImageByGoogleVision(@RequestBody ImageParsingRequest request) throws IOException {
String parsed = GoogleVisionOCR.execute(request.url());
return ResponseEntity.ok().body(new ResponseData<>(true, HttpStatus.OK, parsed));
}
ResponseData 는 결과 전달을 위한 그냥 내가 만든 객체일 뿐이고 .. 워 아무튼 ImageParsingRequest 로 url을 넘겨주면 해당 url을 파싱해준다! 생각보다 속도가 빠르다! 얼핏 본 글이긴 한데 네이버 API는 장당 3초?? 걸린다고 했던거 같은데 이건 평균 1초 전후이다!

카톡에 있어서 사진 대체 ... ㅎㅎㅎㅎㅎ 아무튼 !! 꽤나 빠른 느낌이긴 하지만.....그래도 프로젝트에서 사용하기엔 좀 길긴 하다만 .... 다른 API도 찾아보고 여차하면 OCR 머신을 만들어야 할지도 ....
그렇게 오늘은 Google Cloud의 Vision API를 활용한 OCR을 해보았다! 다들 중구난방 .... 구글에서도 정말 불친절하게 알려주고 .... 꽤나 힘들었지만 이게 다 ~~ 경험 아니겠습니까 ?!!? 무려 두시간을 삽질한거 같지만 ... 까먹었던 인텔리제이 사용법을 떠올려보고...ㅎㅎ 오픈소스도 사용해보고~~ 좋은 경험이었다 !!
이제 다른 API들도 사용해보고 성능 비교하면서 프로젝트에서 사용할 API를 결정하고 기획을 조금 수정해야겠다.