| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 코테
- 방통대
- 리트코드
- 탐욕알고리즘
- Binary Search
- boj
- 방송통신대학교
- 완전탐색
- algorithm
- it
- dynamic programming
- 그리디
- Git
- 컴퓨터과학과
- 투포인터
- javascript
- 깃
- 이진탐색
- greedy
- DP
- two pointers
- LeetCode
- 코딩
- 방송대
- 자바스크립트
- java
- 자바
- 알고리즘
- sliding window
- 백준
- Today
- Total
개발이 취미인 주니어 기획자
[Google Cloud] Cloud Vision API 사용해서 이미지에서 텍스트 추출하기(OCR) 본문
배경
경쟁사 리서치가 시작이었다. 우리 회사 서비스는 Google Ads의 Google Display 광고를 메인 마케팅 방법으로 진행하고 있는데, 경쟁사들 역시 Display 광고에 주력한다. 따라서 경쟁사들의 Display 광고 카피를 분석하라는 미션이 떨어졌다.
그런데 문제는 경쟁사 디스플레이 광고 수가 몇 천 개가 넘어간다는 것. 이걸 사람이 눈으로 보고 일일이 문구를 트래킹 하라는 건 말도 안된다는 점에서는 모두 공감을 하고 이미 만들어진 솔루션을 찾아보려고 했는데 몇 천 개가 넘어가는 이미지 안에 있는 문구를 한 꺼번에 추출해주는 무료 솔루션은 없었다. (한 번에 한 장 씩 만 되는 건 많았음)
한 번에 한 장 씩 되는 솔루션 찾는 중에 구글 렌즈가 OCR 기능을 제공한다는 것을 디자이너 분이 알아냈고, 그 얘기를 듣자마자 분명히 해당 기능을 사용할 수 있게 해주는 구글 API 가 있을 것 같다는 생각이 들어서 바아로 찾아봤다. Google Vision AI API라는 것이 있었고 사용법도 쉬웠음.
Google Vision AI API란?
Google Vision AI API는 구글에서 제공하는 머신 러닝 기반의 이미지 분석 서비스이다. 해당 API를 사용하면, OCR(Optical Character Recognition: 광학 문자 인식) 기능 뿐만 아니라 다양한 기능을 사용할 수 있다. 내가 올린 사진이 음식인지 아닌지 판단하거나, 유해성 콘텐츠를 감지하거나, 사람 감정상태를 캐치하거나 하는.. 신기한 이미지 분석 기능들이 많다.
프로젝트 목표
1. 텍스트를 추출해야 할 이미지 url 목록을 넣는다.
2. 목록 안에 있는 url을 순차적으로 체크해 각각 텍스트를 추출한다. (API 호출)
3. 추출한 텍스트를 .txt 파일로 만든다.
API KEY 발급받기
Google Vision API 를 사용하기 위해서는 Key를 발급받아야 한다. 이 Key는 내가 API를 사용할 권한을 가진 사람이라는 것을 인증해주는 문자인데, 아주아주 중요하다. 이 Key를 다룰 때 가장 조심해야 하는 점은 원격 저장소에 올리지 말아야 한다는 것!
KEY를 발급받기 위해서는 아래 가이드를 따르면 된다!
(1) 구글 클라우드 콘솔에서 프로젝트 생성하기
구글 클라우드 콘솔 https://console.cloud.google.com/?hl=ko 에 처음 들어가는 경우라면, 바로 프로젝트 생성 화면으로 넘어갈 것이다.
Google 클라우드 플랫폼
로그인 Google 클라우드 플랫폼으로 이동
accounts.google.com
만약 나처럼 프로젝트가 이미 생성되어 있는 경우에는 상태 바에서의 드롭다운(그림에서의 1)을 선택하면 프로젝트를 새로 생성할 수 있는 모달이 뜬다. 이 때 새 프로젝트(NEW PROJECT)를 클릭하면 새로운 프로젝트를 생성할 수 있다.


(2) 프로젝트 결제 등록하기
Google Cloud의 Vision API는 매월 1,000개의 호출까지는 무료로 제공되지만, 이를 초과하는 사용량에 대해서는 과금하는 구조로 되어 있다. 따라서 방금 말했듯이 Key를 어디 깃헙에 올리거나 했다가 누군가 그 Key를 가지고 엄청난 양의 API를 호출해버리면 그 호출량에 대한 금액은 고스란히 나의 몫이 된다. 그러니까 제발 그러지말자. (근데 생각보다 자주 일어나는 실수인지, 가끔 밈 같은 데에 "공공 API"라면서 올라옴ㅋㅋㅋ)
또 Google Cloud에 처음 가입하는 신규 사용자는 90일 동안 사용할 수 있는 $300 상당의 무료 크레딧을 받을 수 있음!

Billing 메뉴에 들어가서 결제 수단이 될 카드 정보를 입력해준다.
(3) 서비스 계정 만들기
Google Cloud도 다른 클라우드 서비스와 마찬가지로 IAM 계정으로 권한 관리를 한다. 아래 단계를 거쳐서 서비스 계정을 만들어 준다.



서비스 계정 이름을 작성하면, 서비스 계정 ID는 자동으로 생성된다. 따로 정해도 됨. 프로젝트 접근 권한이나 계정 접근 권한 같은 경우는 필요시 설정해주되, 테스트용이라 다 패스했다. 완료 버튼을 누르면 아래와 같은 페이지가 나타난다.

(4) 서비스 계정 비공개 키 받기
이제 API를 호출할 수 있는 비공개 키를 받을 수 있다. 요 키를 잘 아는 경로에 잘 저장해놓는다.



실제 프로젝트에의 적용(python 사용)
Detect text in images 공식문서인데, 여기서 하라는대로 복붙하면 된다. REST, Go, JAVA, Node.js, Python etc 다 있음. 나는 로컬 이미지 파일이 아니라, img url이 있었으므로 Detect text in a remote image 에 있는 코드를 갖다썼다.
https://cloud.google.com/vision/docs/ocr
이미지의 텍스트 감지 | Cloud Vision API | Google Cloud
의견 보내기 이미지의 텍스트 감지 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 스캔된 문서에서 텍스트를 감지하는 경우 광학 문자 인식, 구조화된 양식
cloud.google.com
API 호출 함수
import os
# 환경 변수 설정 # PATH: 비밀 KEY json 파일 경로
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "PATH.json"
def detect_text_uri(uri):
"""Detects text in the file located in Google Cloud Storage or on the Web."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
image = vision.Image()
image.source.image_uri = uri
try:
response = client.text_detection(image=image)
texts = response.text_annotations
# 추출한 텍스트를 모아서 .txt 파일 생성
if texts:
with open("yymmdd.txt", "a") as f:
f.write("\n——----------")
f.write(f'\n"{texts[0].description}"')
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# 중간에 오류가 나더라도 루프가 중단되지 않도록 코드 추가
# 가끔 url에 접근하지 못한다는 에러가 뜸
except Exception as e:
with open("error_log.txt", "a") as error_log:
error_log.write(f"Error with URL {uri}: {e}\n")
print(f"Error with URL {uri}: {e}")
결과
너무 특정될 것 같아서 실제 경쟁사 말고 자주 보이는 광고 몇 개 가져와봤다. 이런 구글 디스플레이 광고는 광고 투명성 센터에서 다 볼 수 있다.


yyyymmdd.txt
——----------
"세금 환급 안내문
환급금 조회 요망
나도 몰랐던
평균 환급금이 197,500원입니다."
——----------
"5월에 새로 생긴
환급액 19만원
꼭 확인하세요!"
나가며
1,000개 정도의 url을 돌려봤을 때 5분 정도 걸리는 것 같다. 양이 너무 많고 여전히 인간이 직접 분류해야 하는 후처리 작업이 많아서 분석에 크게 의미있는 작업 같진 않았지만.. 까라면 깔 수 밖에 없어 고통받는 동료의 시간 절약에 조금이나마 보탬이 될 수 있어 기뻤다. 한 두 세번 쓰인 것 같음.
이미지 url은 이미 시중에 있는 무료 크롤링 크롬 익스텐션을 사용해 추출했다. 크롤러까지 접목해서 한번에 자동화 할 수 있는 프로그램을 만들어서 크롬 익스텐션으로 배포하면 나중에 쓰기 좋겠다 생각했는데 이후로 경쟁사 트래킹 업무의 중요성이 낮아지면서 걍 그만뒀다. 그냥 재미로 API 호출 리밋 걸어서 한 번 해 볼까 싶긴 한데, 일단 연말은 돼야 시간이 날 것 같다.
'SW 지식' 카테고리의 다른 글
| [방송통신대학교] 3학년 2학기 컴퓨터과학과 전공과목 수강 후기 (3) | 2025.06.24 |
|---|---|
| [간단 크롤러 만들기] 튼튼머니 적립시설 크롤러(w/ Selenium & BeautifulSoup) (0) | 2025.05.18 |
| [MacOS] VMware Fusion에 Rocky Linux 설치하기 (0) | 2024.11.15 |
| [방송통신대학교] 컴퓨터과학과 3학년 1학기 수강과목 후기 (3) | 2024.08.01 |
| [방송통신대학교] 2024년 1학기 컴퓨터과학과 3학년 편입 후기(외국학교 출신자) (2) | 2024.06.23 |