1. 概要
Vision API を使用すると、デベロッパーはアプリケーション内に画像検出機能を簡単に統合できます。この機能の例としては、画像のラベル付け、顔やランドマークの検出、光学式文字認識(OCR)、露骨な表現を含むコンテンツのタグ付けがあります。
このチュートリアルでは、Python での Vision API の使用に焦点を当てます。
学習内容
- 環境の設定方法
- ラベル検出を行う方法
- テキスト検出を行う方法
- ランドマーク検出を行う方法
- 顔検出を行う方法
- オブジェクト検出の実行方法
必要なもの
アンケート
このチュートリアルをどのように使用されますか?
Python のご利用経験はどの程度ありますか?
Google Cloud サービスの利用経験をどのように評価されますか。
<ph type="x-smartling-placeholder">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 上で動作するコマンドライン環境である Cloud Shell を使用します。
Cloud Shell をアクティブにする
- Cloud Console で、[Cloud Shell をアクティブにする] をクリックします。
Cloud Shell を初めて起動する場合は、内容を説明する中間画面が表示されます。中間画面が表示されたら、[続行] をクリックします。
Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。
この仮想マシンには、必要なすべての開発ツールが読み込まれます。5 GB の永続的なホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワークのパフォーマンスと認証が大幅に向上しています。この Codelab での作業のほとんどはブラウザを使って行うことができます。
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 のコア機能の一つは、ラベル アノテーションと呼ばれる、画像内のオブジェクトやエンティティを識別することです。ラベル検出では、一般的な物体、場所、活動、動物の種類、商品などを識別します。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
を削除します
Cloud Shell から Google Cloud プロジェクトを削除するには:
- 現在のプロジェクト 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 汎用ライセンスにより使用許諾されています。