Python과 함께 Vision API 사용

1. 개요

5ab7829fc22b21c4.png

개발자는 Vision API를 사용하여 이미지 라벨링, 얼굴 및 랜드마크 감지, 광학 문자 인식 (OCR), 음란물 태깅 등의 시각적 감지 기능을 애플리케이션에 손쉽게 통합할 수 있습니다.

이 튜토리얼에서는 Python으로 Vision API를 사용하는 데 중점을 둡니다.

학습할 내용

  • 환경을 설정하는 방법
  • 라벨 인식을 실행하는 방법
  • 텍스트 감지를 실행하는 방법
  • 랜드마크 감지를 수행하는 방법
  • 얼굴 인식 수행 방법
  • 객체 감지 수행 방법

필요한 항목

  • Google Cloud 프로젝트
  • 브라우저(Chrome 또는 Firefox 등)
  • Python 사용에 관한 지식

설문조사

이 튜토리얼을 어떻게 사용하실 계획인가요?

읽기만 할 계획입니다 읽은 다음 연습 활동을 완료할 계획입니다

귀하의 Python 사용 경험이 어떤지 평가해 주세요.

초급 중급 고급

Google Cloud 서비스 사용 경험을 평가해 주세요.

초급 중급 고급

2. 설정 및 요건

자습형 환경 설정

  1. Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
  • 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로 PROJECT_ID로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 다른 임의 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다.
  • 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스 또는 프로젝트를 삭제하면 됩니다. Google Cloud 신규 사용자는 300달러(USD) 상당의 무료 체험판 프로그램에 참여할 수 있습니다.

Cloud Shell 시작

Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다.

Cloud Shell 활성화

  1. Cloud Console에서 Cloud Shell 활성화853e55310c205094.png를 클릭합니다.

55efc1aaa7a4d3ad.png

Cloud Shell을 처음 시작하는 경우 설명이 포함된 중간 화면이 제공됩니다. 중간 화면이 표시되면 계속을 클릭합니다.

9c92662c6a846a5c.png

Cloud Shell을 프로비저닝하고 연결하는 작업은 몇 분이면 끝납니다.

9f0e51b578fecce5.png

이 가상 머신에는 필요한 개발 도구가 모두 로드되어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저로 수행할 수 있습니다.

Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 설정된 것을 확인할 수 있습니다.

  1. Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list

명령어 결과

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.
gcloud config list project

명령어 결과

[core]
project = <PROJECT_ID>

또는 다음 명령어로 설정할 수 있습니다.

gcloud config set project <PROJECT_ID>

명령어 결과

Updated property [core/project].

3. 환경 설정

Vision API를 사용하려면 먼저 Cloud Shell에서 다음 명령어를 실행하여 API를 사용 설정해야 합니다.

gcloud services enable vision.googleapis.com

다음과 같은 결과를 확인할 수 있습니다.

Operation "operations/..." finished successfully.

이제 Vision API를 사용할 수 있습니다.

홈 디렉터리로 이동합니다.

cd ~

종속 항목을 격리하기 위해 Python 가상 환경을 만듭니다.

virtualenv venv-vision

가상 환경을 활성화합니다.

source venv-vision/bin/activate

IPython 및 Vision API 클라이언트 라이브러리를 설치합니다.

pip install ipython google-cloud-vision

다음과 같은 결과를 확인할 수 있습니다.

...
Installing collected packages: ..., ipython, google-cloud-vision
Successfully installed ... google-cloud-vision-3.4.0 ...

이제 Vision API 클라이언트 라이브러리를 사용할 준비가 되었습니다.

다음 단계에서는 이전 단계에서 설치한 대화형 Python 인터프리터인 IPython을 사용합니다. Cloud Shell에서 ipython을 실행하여 세션을 시작합니다.

ipython

다음과 같은 결과를 확인할 수 있습니다.

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.12.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

첫 번째 요청을 할 준비가 되었습니다.

4. 라벨 인식 수행

Vision API의 핵심 기능 중 하나는 이미지에서 객체 또는 항목을 식별하는 것입니다. 이를 라벨 주석이라고 합니다. 라벨 감지는 일반 객체, 위치, 활동, 동물 종, 제품 등을 식별합니다. Vision API는 입력 이미지를 가져와 해당 이미지에 적용되는 가장 가능성이 높은 라벨을 반환합니다. 이미지와 가장 일치하는 라벨과 이미지와의 일치 신뢰도 점수를 반환합니다.

이 예에서는 도쿄의 인기 지역인 세타가야의 이미지 (Alex Knight 제공)에 라벨 인식을 수행합니다.

756f97f0b1e46c38.jpeg

다음 코드를 IPython 세션에 복사합니다.

from typing import Sequence

from google.cloud import vision


def analyze_image_from_uri(
    image_uri: str,
    feature_types: Sequence,
) -> vision.AnnotateImageResponse:
    client = vision.ImageAnnotatorClient()

    image = vision.Image()
    image.source.image_uri = image_uri
    features = [vision.Feature(type_=feature_type) for feature_type in feature_types]
    request = vision.AnnotateImageRequest(image=image, features=features)

    response = client.annotate_image(request=request)

    return response


def print_labels(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for label in response.label_annotations:
        print(
            f"{label.score:4.0%}",
            f"{label.description:5}",
            sep=" | ",
        )
        

잠시 시간을 내어 코드를 살펴보고 annotate_image 클라이언트 라이브러리 메서드를 사용하여 지정된 기능에 대해 이미지를 분석하는 방법을 확인하세요.

LABEL_DETECTION 기능으로 요청을 보냅니다.

image_uri = "gs://cloud-samples-data/vision/label/setagaya.jpeg"
features = [vision.Feature.Type.LABEL_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_labels(response)

다음과 같은 결과가 출력됩니다.

================================================================================
 97% | Bicycle
 96% | Tire
 94% | Wheel
 91% | Automotive lighting
 89% | Infrastructure
 87% | Bicycle wheel
 86% | Mode of transport
 85% | Building
 83% | Electricity
 82% | Neighbourhood

온라인 데모에서 결과가 표시되는 방식은 다음과 같습니다.

2191b0425c9c148f.png

요약

이 단계에서는 이미지에서 라벨 인식을 수행하고 해당 이미지와 연결된 가능성이 가장 높은 라벨을 표시할 수 있었습니다. 라벨 감지에 대해 자세히 알아보세요.

5. 텍스트 감지 실행

텍스트 감지는 광학 문자 인식 (OCR)을 수행합니다. 다양한 언어를 지원하여 이미지 내에서 텍스트를 감지하고 추출합니다. 또한 자동 언어 식별이 제공됩니다.

이 예에서는 교통 표지판 이미지에서 텍스트 감지를 수행합니다.

4dedd3fcfd9ad99b.jpeg

다음 코드를 IPython 세션에 복사합니다.

def print_text(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for annotation in response.text_annotations:
        vertices = [f"({v.x},{v.y})" for v in annotation.bounding_poly.vertices]
        print(
            f"{repr(annotation.description):42}",
            ",".join(vertices),
            sep=" | ",
        )
        

TEXT_DETECTION 기능으로 요청을 보냅니다.

image_uri = "gs://cloud-samples-data/vision/ocr/sign.jpg"
features = [vision.Feature.Type.TEXT_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_text(response)

다음과 같은 결과가 출력됩니다.

================================================================================
'WAITING?\nPLEASE\nTURN OFF\nYOUR\nENGINE' | (310,821),(2225,821),(2225,1965),(310,1965)
'WAITING'                                  | (344,821),(2025,879),(2016,1127),(335,1069)
'?'                                        | (2057,881),(2225,887),(2216,1134),(2048,1128)
'PLEASE'                                   | (1208,1230),(1895,1253),(1891,1374),(1204,1351)
'TURN'                                     | (1217,1414),(1718,1434),(1713,1558),(1212,1538)
'OFF'                                      | (1787,1437),(2133,1451),(2128,1575),(1782,1561)
'YOUR'                                     | (1211,1609),(1741,1626),(1737,1747),(1207,1731)
'ENGINE'                                   | (1213,1805),(1923,1819),(1920,1949),(1210,1935)

온라인 데모에서 결과가 표시되는 방식은 다음과 같습니다.

9c70fbce871c5fe5.png

요약

이 단계에서는 이미지에서 텍스트 감지를 실행하고 이미지에서 인식된 텍스트를 표시할 수 있었습니다. 텍스트 감지에 대해 자세히 알아보세요.

6. 랜드마크 감지 실행

명소 감지는 이미지에서 유명한 자연 경관과 인공 구조물을 감지하는 기능입니다.

이 예에서는 에펠탑 이미지 (John Towner 제공)에서 특징 감지를 수행합니다.

fb7801e36884b875.jpeg

다음 코드를 IPython 세션에 복사합니다.

def print_landmarks(response: vision.AnnotateImageResponse, min_score: float = 0.5):
    print("=" * 80)
    for landmark in response.landmark_annotations:
        if landmark.score < min_score:
            continue
        vertices = [f"({v.x},{v.y})" for v in landmark.bounding_poly.vertices]
        lat_lng = landmark.locations[0].lat_lng
        print(
            f"{landmark.description:18}",
            ",".join(vertices),
            f"{lat_lng.latitude:.5f}",
            f"{lat_lng.longitude:.5f}",
            sep=" | ",
        )
        

LANDMARK_DETECTION 기능으로 요청을 보냅니다.

image_uri = "gs://cloud-samples-data/vision/landmark/eiffel_tower.jpg"
features = [vision.Feature.Type.LANDMARK_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_landmarks(response)

다음과 같은 결과가 출력됩니다.

================================================================================
Trocadéro Gardens  | (303,36),(520,36),(520,371),(303,371) | 48.86160 | 2.28928
Eiffel Tower       | (458,76),(512,76),(512,263),(458,263) | 48.85846 | 2.29435

온라인 데모에서 결과가 표시되는 방식은 다음과 같습니다.

2788697365670985.png

요약

이 단계에서는 에펠탑 이미지에서 랜드마크 인식을 수행할 수 있었습니다. 랜드마크 감지에 대해 자세히 알아보세요.

7. 얼굴 인식 수행

얼굴 특징 감지는 이미지에서 여러 개의 얼굴을 감정 상태나 wearing headwear와 같은 주요 얼굴 관련 속성과 함께 감지하는 기능입니다.

이 예에서는 다음 사진 (Himanshu Singh Gurjar 제공)에서 얼굴을 감지합니다.

58c578ece524cf32.jpeg

다음 코드를 IPython 세션에 복사합니다.

def print_faces(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for face_number, face in enumerate(response.face_annotations, 1):
        vertices = ",".join(f"({v.x},{v.y})" for v in face.bounding_poly.vertices)
        print(f"# Face {face_number} @ {vertices}")
        print(f"Joy:     {face.joy_likelihood.name}")
        print(f"Exposed: {face.under_exposed_likelihood.name}")
        print(f"Blurred: {face.blurred_likelihood.name}")
        print("-" * 80)
        

FACE_DETECTION 기능으로 요청을 보냅니다.

image_uri = "gs://cloud-samples-data/vision/face/faces.jpeg"
features = [vision.Feature.Type.FACE_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_faces(response)

다음과 같은 결과가 출력됩니다.

================================================================================
# Face 1 @ (1077,157),(2146,157),(2146,1399),(1077,1399)
Joy:     VERY_LIKELY
Exposed: VERY_UNLIKELY
Blurred: VERY_UNLIKELY
--------------------------------------------------------------------------------
# Face 2 @ (144,1273),(793,1273),(793,1844),(144,1844)
Joy:     VERY_UNLIKELY
Exposed: VERY_UNLIKELY
Blurred: UNLIKELY
--------------------------------------------------------------------------------
# Face 3 @ (785,167),(1100,167),(1100,534),(785,534)
Joy:     VERY_UNLIKELY
Exposed: LIKELY
Blurred: VERY_LIKELY
--------------------------------------------------------------------------------

온라인 데모에서 결과가 표시되는 방식은 다음과 같습니다.

cbb7f59299651b83.png

요약

이 단계에서는 얼굴 인식을 실행할 수 있었습니다. 얼굴 감지에 대해 자세히 알아보세요.

8. 객체 감지 실행

이 예에서는 Alex Knight가 제공한 세타가야의 이전 이미지에 객체 감지를 실행합니다.

756f97f0b1e46c38.jpeg

다음 코드를 IPython 세션에 복사합니다.

def print_objects(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for obj in response.localized_object_annotations:
        nvertices = obj.bounding_poly.normalized_vertices
        print(
            f"{obj.score:4.0%}",
            f"{obj.name:15}",
            f"{obj.mid:10}",
            ",".join(f"({v.x:.1f},{v.y:.1f})" for v in nvertices),
            sep=" | ",
        )
        

OBJECT_LOCALIZATION 기능으로 요청을 보냅니다.

image_uri = "gs://cloud-samples-data/vision/label/setagaya.jpeg"
features = [vision.Feature.Type.OBJECT_LOCALIZATION]

response = analyze_image_from_uri(image_uri, features)
print_objects(response)

다음과 같은 결과가 출력됩니다.

================================================================================
 93% | Bicycle         | /m/0199g   | (0.6,0.6),(0.8,0.6),(0.8,0.9),(0.6,0.9)
 92% | Bicycle wheel   | /m/01bqk0  | (0.6,0.7),(0.7,0.7),(0.7,0.9),(0.6,0.9)
 91% | Tire            | /m/0h9mv   | (0.7,0.7),(0.8,0.7),(0.8,1.0),(0.7,1.0)
 75% | Bicycle         | /m/0199g   | (0.3,0.6),(0.4,0.6),(0.4,0.7),(0.3,0.7)
 51% | Tire            | /m/0h9mv   | (0.3,0.6),(0.4,0.6),(0.4,0.7),(0.3,0.7)

온라인 데모에서 결과가 표시되는 방식은 다음과 같습니다.

e1c2ca803d874a6b.png

요약

이 단계에서는 객체 감지를 수행할 수 있었습니다. 객체 감지에 대해 자세히 알아보세요.

9. 여러 기능

Vision API의 일부 기능을 사용하는 방법을 알아봤지만, 더 많은 기능이 있으며 단일 요청에서 여러 기능을 요청할 수 있습니다.

다음은 모든 통계를 한 번에 가져오기 위해 요청할 수 있는 종류입니다.

image_uri = "gs://..."
features = [
    vision.Feature.Type.OBJECT_LOCALIZATION,
    vision.Feature.Type.FACE_DETECTION,
    vision.Feature.Type.LANDMARK_DETECTION,
    vision.Feature.Type.LOGO_DETECTION,
    vision.Feature.Type.LABEL_DETECTION,
    vision.Feature.Type.TEXT_DETECTION,
    vision.Feature.Type.DOCUMENT_TEXT_DETECTION,
    vision.Feature.Type.SAFE_SEARCH_DETECTION,
    vision.Feature.Type.IMAGE_PROPERTIES,
    vision.Feature.Type.CROP_HINTS,
    vision.Feature.Type.WEB_DETECTION,
    vision.Feature.Type.PRODUCT_SEARCH,
    vision.Feature.Type.OBJECT_LOCALIZATION,
]

# response = analyze_image_from_uri(image_uri, features)

일괄 이미지에서 동기식 또는 비동기식으로 감지를 실행하는 등 더 많은 가능성이 있습니다. 모든 안내 가이드를 확인하세요.

10. 축하합니다.

5ab7829fc22b21c4.png

Python으로 Vision API를 사용하는 방법을 알아보고 몇 가지 이미지 감지 기능을 테스트했습니다.

삭제

개발 환경을 정리하려면 Cloud Shell에서 다음을 실행하세요.

  • IPython 세션에 아직 있는 경우 셸로 돌아갑니다. exit
  • Python 가상 환경 사용 중지: deactivate
  • 가상 환경 폴더 cd ~ ; rm -rf ./venv-vision 삭제

Google Cloud 프로젝트를 삭제하려면 Cloud Shell에서 다음을 실행하세요.

  • 현재 프로젝트 ID를 가져옵니다. PROJECT_ID=$(gcloud config get-value core/project)
  • 삭제하려는 프로젝트가 echo $PROJECT_ID인지 확인합니다.
  • 프로젝트를 삭제합니다. gcloud projects delete $PROJECT_ID

자세히 알아보기

라이선스

이 작업물은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되었습니다.