1. 概要

Vision API を使用すると、開発するアプリケーションの中で簡単に画像検出機能を統合できます。この機能の例としては、画像ラベリング、顔やランドマークの検出、光学式文字認識(OCR)、露骨な表現を含むコンテンツへのタグ付けがあります。
このチュートリアルでは、Python で Vision API を使用する方法に焦点を当てます。
学習内容
- 環境の設定方法
- ラベル検出を実行する方法
- テキスト検出の実行方法
- ランドマーク検出を行う方法
- 顔検出を行う方法
- オブジェクト検出の実行方法
必要なもの
アンケート
このチュートリアルをどのように使用されますか?
Python のご利用経験はどの程度ありますか?
Google Cloud サービスの使用経験はどの程度ありますか?
2. 設定と要件
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。



- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は
PROJECT_IDと識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。 - なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell の起動
Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。
Cloud Shell をアクティブにする
- Cloud Console で、[Cloud Shell をアクティブにする]
をクリックします。

Cloud Shell を初めて起動する場合は、その内容を説明する中間画面が表示されます。中間画面が表示された場合は、[続行] をクリックします。

すぐにプロビジョニングが実行され、Cloud Shell に接続されます。

この仮想マシンには、必要な開発ツールがすべて用意されています。仮想マシンは Google Cloud で稼働し、永続的なホーム ディレクトリが 5 GB 用意されているため、ネットワークのパフォーマンスと認証が大幅に向上しています。このコードラボで行う作業のほとんどはブラウザから実行できます。
Cloud Shell に接続すると、認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。
- 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`
- 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 のコア機能の 1 つは、画像内のオブジェクトまたはエンティティを識別することです。これはラベル アノテーションと呼ばれます。ラベル検出により、一般的な物体、場所、活動、動物の種類、商品などを識別できます。Vision API は、入力画像を受け取り、その画像に適用される可能性が最も高いラベルを返します。一致する上位のラベルと、画像との一致の信頼スコアを返します。
この例では、東京の人気エリアである世田谷の画像(Alex Knight 提供)でラベル検出を行います。

次のコードを 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
オンライン デモでの結果の表示方法は次のとおりです。

概要
この手順では、画像のラベルを検出し、その画像に関連付けられている可能性が最も高いラベルを表示しました。詳しくは、ラベル検出をご覧ください。
5. テキスト検出を実行する
テキスト検出は、光学式文字認識(OCR)を実行します。幅広い言語をサポートし、画像内のテキストを検出して抽出します。また、言語の自動識別機能も備えています。
この例では、交通標識の画像に対してテキスト検出を行います。

次のコードを 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)
オンライン デモでの結果の表示方法は次のとおりです。

概要
この手順では、画像内のテキストを検出し、画像から認識されたテキストを表示しました。詳しくは、テキスト検出をご覧ください。
6. ランドマーク検出を実行する
ランドマーク検出は、画像に含まれる一般的な自然のランドマークや人工建造物を検出します。
この例では、エッフェル塔の画像(John Towner 氏提供)でランドマーク検出を行います。

次のコードを 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
オンライン デモでの結果の表示方法は次のとおりです。

概要
このステップでは、エッフェル塔の画像でランドマーク検出を行うことができました。詳しくは、ランドマーク検出をご覧ください。
7. 顔検出を実行する
顔の特徴検出は、画像に含まれる複数の人物の顔を検出します。さらに感情や帽子などの関連する主な顔属性についても識別します。
この例では、次の画像(Himanshu Singh Gurjar 提供)内の顔を検出します。

次のコードを 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 --------------------------------------------------------------------------------
オンライン デモでの結果の表示方法は次のとおりです。

概要
このステップでは、顔検出を実行できました。詳しくは、顔検出をご覧ください。
8. オブジェクト検出を実行する
この例では、世田谷の同じ事前画像(Alex Knight 提供)に対してオブジェクト検出を行います。

次のコードを 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)
オンライン デモでの結果の表示方法は次のとおりです。

概要
このステップでは、オブジェクト検出を実行できました。オブジェクト検出の詳細を確認する。
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. 完了

このラボでは、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
詳細
- ブラウザでオンライン デモをテストする: https://cloud.google.com/vision
- Vision API のドキュメント: https://cloud.google.com/vision/docs
- Google Cloud 上の Python: https://cloud.google.com/python
- Python 用 Cloud クライアント ライブラリ: https://github.com/googleapis/google-cloud-python
ライセンス
この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。