Python で Vision API を使用する

1. 概要

5ab7829fc22b21c4.png

Vision API を使用すると、デベロッパーはアプリケーション内に画像検出機能を簡単に統合できます。この機能の例としては、画像のラベル付け、顔やランドマークの検出、光学式文字認識(OCR)、露骨な表現を含むコンテンツのタグ付けがあります。

このチュートリアルでは、Python での Vision API の使用に焦点を当てます。

学習内容

  • 環境の設定方法
  • ラベル検出を行う方法
  • テキスト検出を行う方法
  • ランドマーク検出を行う方法
  • 顔検出を行う方法
  • オブジェクト検出の実行方法

必要なもの

  • Google Cloud プロジェクト
  • ブラウザ(ChromeFirefox など)
  • Python の使用経験

アンケート

このチュートリアルをどのように使用されますか?

通読のみ 通読して演習を行う

Python のご利用経験はどの程度ありますか?

初心者 中級者 上級者

Google Cloud サービスの利用経験をどのように評価されますか。

<ph type="x-smartling-placeholder"></ph> 初心者 中級 上達 をご覧ください。

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 を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

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

この仮想マシンには、必要なすべての開発ツールが読み込まれます。5 GB の永続的なホーム ディレクトリが用意されており、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 クライアント ライブラリを使用する準備が整いました。

次の手順では、前のステップでインストールした IPython というインタラクティブな Python インタープリタを使用します。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. 顔検出を行う

顔の特徴の検出は、感情や帽子をかぶっているなどの関連する主な顔属性とともに、画像内の複数の顔を検出します。

この例では、次の写真の顔を検出します(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 のいくつかの機能を使用する方法を見てきましたが、他にも多くの機能があり、1 回のリクエストで複数の機能をリクエストできます。

すべての分析情報を一度に取得するには、次のようなリクエストを行うことができます。

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 を削除します

Cloud Shell から Google Cloud プロジェクトを削除するには:

  • 現在のプロジェクト ID PROJECT_ID=$(gcloud config get-value core/project) を取得します。
  • 削除するプロジェクトが echo $PROJECT_ID であることを確認します。
  • プロジェクトを削除します。gcloud projects delete $PROJECT_ID

詳細

ライセンス

この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。