Google Colaboratory에서 Cloud Vision API를 치기

Google Cloud Vision API를 사용해 물체 검출 등을 실시하고 싶을 때, Google Drive + Google Colaboratory를 사용하면 브라우저상에서 모든 작업을 완결할 수 있어 매우 편리합니다.

Google Colaboratory 노트북 만들기



에서 "PYTHON 3의 새로운 노트북"을 만듭니다.

Cloud Vision용 pip 설치



Cloud Vision API를 사용하는 경우 pip를 설치해야 합니다. 설치 후 Restart를 요구하기 때문에, 이 단계는 노트북의 제일 먼저 해 두는 것이 좋다.
!pip install --upgrade google-cloud-vision

런타임을 다시 시작하라는 메시지가 표시되면 다시 시작합니다.



Google 드라이브에 이미지 업로드



Google 드라이브에 새 폴더를 만들고 그 안에 구문 분석하려는 이미지를 밀어 넣습니다.



노트북에서 파일 지정으로 업로드하거나 Google Cloud Storage에서 이미지를 다운로드하거나 할 수 있지만, 여러 이미지를 간편하게 시도한다면 Google Drive가 가장 간편하다고 생각한다.

Google 드라이브 마운트


from google.colab import drive
drive.mount('/content/gdrive')
drive.mount 를 하면, Google Drive의 내용을 지정한 패스에 마운트 할 수 있어 프로그램내에서 파일로서 참조할 수 있게 된다.

인증하다



최초 실행시에는 인증이 요구된다. 브라우저에서 링크를 열고 인증을 하면, 마지막에 표시되는 인증 코드를 Notebook측의 텍스트 필드에 박아 엔터를 누른다.



디렉토리의 이미지 파일 목록을 가져옵니다.


import glob

src_files = glob.glob('/content/gdrive/My Drive/visiontest/*.jpg')
src_files.sort()

for f in src_files:
    print(f)

위에서 마운트 한 패스를 이용하여 방금 업로드한 jpg 파일의 목록을 가져옵니다. 로그에 파일의 리스트가 표시되지 않는 경우는 패스나 무언가가 잘못되어 있으므로 확인한다.

Cloud Vision API 치기



Cloud Vision API 사용



Google Cloud Console 을 열고 'API 및 서비스'에서 Cloud Vision API를 활성화합니다. 프로젝트가 없으면 새 프로젝트를 만듭니다. 덧붙여 Cloud Vision API는 유료의 API이므로 지불 설정을 완료시키지 않으면 올바르게 두드릴 수 없기 때문에 주의.

서비스 계정 키 만들기



"인증 정보"에서 API를 두드리는 서비스 계정 키를 만듭니다. 생성된 JSON 파일을 Google Drive의 이전 디렉토리에 업로드합니다. 여기에 credentials.json라는 이름으로 업로드했습니다.

업로드 대상 디렉토리가 공개적으로 공유되지 않았는지 확인합니다. 이 서비스 계정 키가 외부로 유출되면 API를 두드려 트러블로 이어질 위험이 있으므로 취급에 충분히 주의한다. 보다 안전한 방법으로 관리하고 싶지만, 현재는 Google Colab상에서 사용하는 경우는 특별 안전한 방법이 존재하지 않는 모양. Google 드라이브에 업로드하는 것이 불안한 경우 file.upload를 사용하여 런타임에 업로드하는 방법을 고려해 보세요.

서비스 계정 키 파일 로드


import os
import os.path
import errno

from googleapiclient import discovery
from oauth2client.client import GoogleCredentials

cred_path = '/content/gdrive/My Drive/visiontest/credentials.json'

if os.path.exists(cred_path) == False:
  raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), cred_path)

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = cred_path

서비스 계정 키 파일을 로드합니다. 파일이 존재하지 않는 경우는 에러를 발생시켜 처리가 앞으로 진행되지 않게 하고 있다.

물체 감지



폴더의 이미지 한 장에 대해 물체 감지 API를 두드려 결과를 objects 사전에 저장합니다. Cloud Vision API는 유료이므로 시행착오 과정에서 쓸데없이 두드리는 일이 없도록 결과를 캐시하고 나중에 참조하는 형태로 하는 것이 좋다.
import io
from google.cloud import vision
from google.cloud.vision import types

objects = {}

client = vision.ImageAnnotatorClient()

for file in src_files:
  with io.open(file, 'rb') as image_file:
      content = image_file.read()

  image = types.Image(content=content)
  res = client.object_localization(
        image=image).localized_object_annotations
  objects[file] = res

실행 결과 보기


from matplotlib import pyplot as plt

from PIL import Image
from PIL import ImageDraw

def draw_object_boxes(f, objects):
    im = Image.open(f)
    w, h = im.size
    draw = ImageDraw.Draw(im)
    for obj in objects:
      color = '#ffff00'
      box = [(v.x * w, v.y * h) for v in obj.bounding_poly.normalized_vertices]
      xs = [(v.x * w) for v in obj.bounding_poly.normalized_vertices]
      ys = [(v.y * h) for v in obj.bounding_poly.normalized_vertices]
      draw.line(box + [box[0]], width=20, fill=color)
    return im

for file in files:
  plt.figure(figsize=(5,3))
  plt.imshow(draw_object_boxes(file, objects[file]))
plt.show()

좋은 웹페이지 즐겨찾기