Vision API では、オブジェクト ローカライズを使用して、画像内の複数のオブジェクトを検出して抽出できます。
オブジェクト ローカライズにより、画像内のオブジェクトが識別され、オブジェクトごとに LocalizedObjectAnnotation が指定されます。LocalizedObjectAnnotation ごとに、オブジェクトに関する情報、オブジェクトの位置、画像内でオブジェクトがある領域の四角い境界線が識別されます。
オブジェクト ローカライズでは、画像内で目立っているオブジェクトとそれほど目立たないオブジェクトの両方が識別されます。
オブジェクト情報は英語でのみ返されます。Cloud Translation は、英語のラベルを他の言語に翻訳できます。
たとえば、API は前の画像のオブジェクトについて、次の情報と境界の位置情報を返します。
| 名前 | mid | スコア | 境界 |
|---|---|---|---|
| Bicycle wheel | /m/01bqk0 | 0.89648587 | (0.32076266, 0.78941387), (0.43812272, 0.78941387), (0.43812272, 0.97331065), (0.32076266, 0.97331065) |
| Bicycle | /m/0199g | 0.886761 | (0.312, 0.6616471), (0.638353, 0.6616471), (0.638353, 0.9705882), (0.312, 0.9705882) |
| Bicycle wheel | /m/01bqk0 | 0.6345275 | (0.5125398, 0.760708), (0.6256646, 0.760708), (0.6256646, 0.94601655), (0.5125398, 0.94601655) |
| Picture frame | /m/06z37_ | 0.6207608 | (0.79177403, 0.16160682), (0.97047985, 0.16160682), (0.97047985, 0.31348917), (0.79177403, 0.31348917) |
| Tire | /m/0h9mv | 0.55886006 | (0.32076266, 0.78941387), (0.43812272, 0.78941387), (0.43812272, 0.97331065), (0.32076266, 0.97331065) |
| Door | /m/02dgv | 0.5160098 | (0.77569866, 0.37104446), (0.9412425, 0.37104446), (0.9412425, 0.81507325), (0.77569866, 0.81507325) |
mid には、ラベルの Google Knowledge Graph エントリに対応する MID(Machine-generated Identifier)が格納されます。mid の値の調べ方については、Google Knowledge Graph Search API のドキュメントをご覧ください。
オブジェクト ローカライズのリクエスト
Google Cloud プロジェクトと認証を設定する
Google Cloud プロジェクトをまだ作成していない場合は、ここで作成します。このセクションを開いて手順を確認してください。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Vision API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
連携 ID を使用するように gcloud CLI を構成します。
詳細については、連携 ID を使用して gcloud CLI にログインするをご覧ください。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud initローカル画像でのオブジェクトの検出
Vision API を使用して、ローカル画像ファイルに特徴検出を実行できます。
REST リクエストの場合は、リクエストの本文で画像ファイルのコンテンツを base64 エンコード文字列として送信します。
gcloudとクライアント ライブラリ リクエストの場合は、リクエストにローカル イメージへのパスを指定します。REST
リクエストのデータを使用する前に、次のように置き換えます。
- BASE64_ENCODED_IMAGE: バイナリ画像データの base64 表現(ASCII 文字列)。これは次のような文字列になります。
/9j/4QAYRXhpZgAA...9tAVx/zDQDlGxn//2Q==
- RESULTS_INT: (省略可)返される結果の整数値。
"maxResults"フィールドとその値を省略した場合、API はデフォルト値の 10 を返します。このフィールドは、TEXT_DETECTION、DOCUMENT_TEXT_DETECTION、CROP_HINTSの各機能タイプには適用されません。 - PROJECT_ID: 実際の Google Cloud プロジェクト ID。
HTTP メソッドと URL:
POST https://vision.googleapis.com/v1/images:annotate
リクエストの本文(JSON):
{ "requests": [ { "image": { "content": "BASE64_ENCODED_IMAGE" }, "features": [ { "maxResults": RESULTS_INT, "type": "OBJECT_LOCALIZATION" }, ] } ] }リクエストを送信するには、次のいずれかのオプションを選択します。
curl
リクエスト本文を
request.jsonという名前のファイルに保存して、次のコマンドを実行します。curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://vision.googleapis.com/v1/images:annotate"PowerShell
リクエスト本文を
request.jsonという名前のファイルに保存して、次のコマンドを実行します。$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred"; "x-goog-user-project" = "PROJECT_ID" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://vision.googleapis.com/v1/images:annotate" | Select-Object -Expand Contentリクエストが成功すると、サーバーは
200 OKHTTP ステータス コードと JSON 形式のレスポンスを返します。レスポンス:
レスポンス
{ "responses": [ { "localizedObjectAnnotations": [ { "mid": "/m/01bqk0", "name": "Bicycle wheel", "score": 0.89648587, "boundingPoly": { "normalizedVertices": [ { "x": 0.32076266, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.97331065 }, { "x": 0.32076266, "y": 0.97331065 } ] } }, { "mid": "/m/0199g", "name": "Bicycle", "score": 0.886761, "boundingPoly": { "normalizedVertices": [ { "x": 0.312, "y": 0.6616471 }, { "x": 0.638353, "y": 0.6616471 }, { "x": 0.638353, "y": 0.9705882 }, { "x": 0.312, "y": 0.9705882 } ] } }, { "mid": "/m/01bqk0", "name": "Bicycle wheel", "score": 0.6345275, "boundingPoly": { "normalizedVertices": [ { "x": 0.5125398, "y": 0.760708 }, { "x": 0.6256646, "y": 0.760708 }, { "x": 0.6256646, "y": 0.94601655 }, { "x": 0.5125398, "y": 0.94601655 } ] } }, { "mid": "/m/06z37_", "name": "Picture frame", "score": 0.6207608, "boundingPoly": { "normalizedVertices": [ { "x": 0.79177403, "y": 0.16160682 }, { "x": 0.97047985, "y": 0.16160682 }, { "x": 0.97047985, "y": 0.31348917 }, { "x": 0.79177403, "y": 0.31348917 } ] } }, { "mid": "/m/0h9mv", "name": "Tire", "score": 0.55886006, "boundingPoly": { "normalizedVertices": [ { "x": 0.32076266, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.97331065 }, { "x": 0.32076266, "y": 0.97331065 } ] } }, { "mid": "/m/02dgv", "name": "Door", "score": 0.5160098, "boundingPoly": { "normalizedVertices": [ { "x": 0.77569866, "y": 0.37104446 }, { "x": 0.9412425, "y": 0.37104446 }, { "x": 0.9412425, "y": 0.81507325 }, { "x": 0.77569866, "y": 0.81507325 } ] } } ] } ] }Go
このサンプルを試す前に、Vision クイックスタート: クライアント ライブラリの使用にある Go の設定を完了してください。 詳細については、Vision Go API のリファレンス ドキュメントをご覧ください。
Vision に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
// localizeObjects gets objects and bounding boxes from the Vision API for an image at the given file path. func localizeObjects(w io.Writer, file string) error { ctx := context.Background() client, err := vision.NewImageAnnotatorClient(ctx) if err != nil { return err } f, err := os.Open(file) if err != nil { return err } defer f.Close() image, err := vision.NewImageFromReader(f) if err != nil { return err } annotations, err := client.LocalizeObjects(ctx, image, nil) if err != nil { return err } if len(annotations) == 0 { fmt.Fprintln(w, "No objects found.") return nil } fmt.Fprintln(w, "Objects:") for _, annotation := range annotations { fmt.Fprintln(w, annotation.Name) fmt.Fprintln(w, annotation.Score) for _, v := range annotation.BoundingPoly.NormalizedVertices { fmt.Fprintf(w, "(%f,%f)\n", v.X, v.Y) } } return nil }Java
このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用にある Java の設定を完了してください。詳細については、Vision API Java のリファレンス ドキュメントをご覧ください。
/** * Detects localized objects in the specified local image. * * @param filePath The path to the file to perform localized object detection on. * @throws Exception on errors while closing the client. * @throws IOException on Input/Output errors. */ public static void detectLocalizedObjects(String filePath) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath)); Image img = Image.newBuilder().setContent(imgBytes).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder() .addFeatures(Feature.newBuilder().setType(Type.OBJECT_LOCALIZATION)) .setImage(img) .build(); requests.add(request); // Initialize client that will be used to send requests. This client only needs to be created // once, and can be reused for multiple requests. After completing all of your requests, call // the "close" method on the client to safely clean up any remaining background resources. try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) { // Perform the request BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); // Display the results for (AnnotateImageResponse res : responses) { for (LocalizedObjectAnnotation entity : res.getLocalizedObjectAnnotationsList()) { System.out.format("Object name: %s%n", entity.getName()); System.out.format("Confidence: %s%n", entity.getScore()); System.out.format("Normalized Vertices:%n"); entity .getBoundingPoly() .getNormalizedVerticesList() .forEach(vertex -> System.out.format("- (%s, %s)%n", vertex.getX(), vertex.getY())); } } } }Node.js
このサンプルを試す前に、Vision クイックスタート: クライアント ライブラリの使用にある Node.js の設定を完了してください。詳細については、Vision Node.js API のリファレンス ドキュメントをご覧ください。
Vision に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
// Imports the Google Cloud client libraries const vision = require('@google-cloud/vision'); const fs = require('fs'); // Creates a client const client = new vision.ImageAnnotatorClient(); /** * TODO(developer): Uncomment the following line before running the sample. */ // const fileName = `/path/to/localImage.png`; const request = { image: {content: fs.readFileSync(fileName)}, }; const [result] = await client.objectLocalization(request); const objects = result.localizedObjectAnnotations; objects.forEach(object => { console.log(`Name: ${object.name}`); console.log(`Confidence: ${object.score}`); const vertices = object.boundingPoly.normalizedVertices; vertices.forEach(v => console.log(`x: ${v.x}, y:${v.y}`)); });Python
このサンプルを試す前に、Vision クイックスタート: クライアント ライブラリの使用にある Python の設定を完了してください。詳細については、Vision Python API のリファレンス ドキュメントをご覧ください。
Vision に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
def localize_objects(path): """Localize objects in the local image. Args: path: The path to the local file. """ from google.cloud import vision client = vision.ImageAnnotatorClient() with open(path, "rb") as image_file: content = image_file.read() image = vision.Image(content=content) objects = client.object_localization(image=image).localized_object_annotations print(f"Number of objects found: {len(objects)}") for object_ in objects: print(f"\n{object_.name} (confidence: {object_.score})") print("Normalized bounding polygon vertices: ") for vertex in object_.bounding_poly.normalized_vertices: print(f" - ({vertex.x}, {vertex.y})")その他の言語
C#: クライアント ライブラリ ページの C# の設定手順を行ってから、.NET 用の Vision リファレンス ドキュメントをご覧ください。
PHP: クライアント ライブラリ ページの PHP の設定手順を行ってから、PHP 用の Vision リファレンス ドキュメントをご覧ください。
Ruby: クライアント ライブラリ ページの Ruby の設定手順を行ってから、Ruby 用の Vision リファレンス ドキュメントをご覧ください。
リモート画像内のオブジェクトの検出
Vision API を使用すると、Cloud Storage またはウェブ上にあるリモート画像ファイルに特徴検出を実行できます。リモート ファイル リクエストを送信するには、リクエストの本文でファイルのウェブ URL または Cloud Storage URI を指定します。
REST
リクエストのデータを使用する前に、次のように置き換えます。
- CLOUD_STORAGE_IMAGE_URI: Cloud Storage バケット内の有効な画像ファイルへのパス。少なくとも、ファイルに対する読み取り権限が必要です。例:
https://cloud.google.com/vision/docs/images/bicycle_example.png
- RESULTS_INT: (省略可)返される結果の整数値。
"maxResults"フィールドとその値を省略した場合、API はデフォルト値の 10 を返します。このフィールドは、TEXT_DETECTION、DOCUMENT_TEXT_DETECTION、CROP_HINTSの各機能タイプには適用されません。 - PROJECT_ID: 実際の Google Cloud プロジェクト ID。
HTTP メソッドと URL:
POST https://vision.googleapis.com/v1/images:annotate
リクエストの本文(JSON):
{ "requests": [ { "image": { "source": { "imageUri": "CLOUD_STORAGE_IMAGE_URI" } }, "features": [ { "maxResults": RESULTS_INT, "type": "OBJECT_LOCALIZATION" }, ] } ] }リクエストを送信するには、次のいずれかのオプションを選択します。
curl
リクエスト本文を
request.jsonという名前のファイルに保存して、次のコマンドを実行します。curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://vision.googleapis.com/v1/images:annotate"PowerShell
リクエスト本文を
request.jsonという名前のファイルに保存して、次のコマンドを実行します。$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred"; "x-goog-user-project" = "PROJECT_ID" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://vision.googleapis.com/v1/images:annotate" | Select-Object -Expand Contentリクエストが成功すると、サーバーは
200 OKHTTP ステータス コードと JSON 形式のレスポンスを返します。レスポンス:
レスポンス
{ "responses": [ { "localizedObjectAnnotations": [ { "mid": "/m/01bqk0", "name": "Bicycle wheel", "score": 0.89648587, "boundingPoly": { "normalizedVertices": [ { "x": 0.32076266, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.97331065 }, { "x": 0.32076266, "y": 0.97331065 } ] } }, { "mid": "/m/0199g", "name": "Bicycle", "score": 0.886761, "boundingPoly": { "normalizedVertices": [ { "x": 0.312, "y": 0.6616471 }, { "x": 0.638353, "y": 0.6616471 }, { "x": 0.638353, "y": 0.9705882 }, { "x": 0.312, "y": 0.9705882 } ] } }, { "mid": "/m/01bqk0", "name": "Bicycle wheel", "score": 0.6345275, "boundingPoly": { "normalizedVertices": [ { "x": 0.5125398, "y": 0.760708 }, { "x": 0.6256646, "y": 0.760708 }, { "x": 0.6256646, "y": 0.94601655 }, { "x": 0.5125398, "y": 0.94601655 } ] } }, { "mid": "/m/06z37_", "name": "Picture frame", "score": 0.6207608, "boundingPoly": { "normalizedVertices": [ { "x": 0.79177403, "y": 0.16160682 }, { "x": 0.97047985, "y": 0.16160682 }, { "x": 0.97047985, "y": 0.31348917 }, { "x": 0.79177403, "y": 0.31348917 } ] } }, { "mid": "/m/0h9mv", "name": "Tire", "score": 0.55886006, "boundingPoly": { "normalizedVertices": [ { "x": 0.32076266, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.97331065 }, { "x": 0.32076266, "y": 0.97331065 } ] } }, { "mid": "/m/02dgv", "name": "Door", "score": 0.5160098, "boundingPoly": { "normalizedVertices": [ { "x": 0.77569866, "y": 0.37104446 }, { "x": 0.9412425, "y": 0.37104446 }, { "x": 0.9412425, "y": 0.81507325 }, { "x": 0.77569866, "y": 0.81507325 } ] } } ] } ] }Go
このサンプルを試す前に、Vision クイックスタート: クライアント ライブラリの使用にある Go の設定を完了してください。 詳細については、Vision Go API のリファレンス ドキュメントをご覧ください。
Vision に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
// localizeObjects gets objects and bounding boxes from the Vision API for an image at the given file path. func localizeObjectsURI(w io.Writer, file string) error { ctx := context.Background() client, err := vision.NewImageAnnotatorClient(ctx) if err != nil { return err } image := vision.NewImageFromURI(file) annotations, err := client.LocalizeObjects(ctx, image, nil) if err != nil { return err } if len(annotations) == 0 { fmt.Fprintln(w, "No objects found.") return nil } fmt.Fprintln(w, "Objects:") for _, annotation := range annotations { fmt.Fprintln(w, annotation.Name) fmt.Fprintln(w, annotation.Score) for _, v := range annotation.BoundingPoly.NormalizedVertices { fmt.Fprintf(w, "(%f,%f)\n", v.X, v.Y) } } return nil }Java
このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用にある Java の設定を完了してください。詳細については、Vision API Java のリファレンス ドキュメントをご覧ください。
/** * Detects localized objects in a remote image on Google Cloud Storage. * * @param gcsPath The path to the remote file on Google Cloud Storage to detect localized objects * on. * @throws Exception on errors while closing the client. * @throws IOException on Input/Output errors. */ public static void detectLocalizedObjectsGcs(String gcsPath) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build(); Image img = Image.newBuilder().setSource(imgSource).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder() .addFeatures(Feature.newBuilder().setType(Type.OBJECT_LOCALIZATION)) .setImage(img) .build(); requests.add(request); // Initialize client that will be used to send requests. This client only needs to be created // once, and can be reused for multiple requests. After completing all of your requests, call // the "close" method on the client to safely clean up any remaining background resources. try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) { // Perform the request BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); client.close(); // Display the results for (AnnotateImageResponse res : responses) { for (LocalizedObjectAnnotation entity : res.getLocalizedObjectAnnotationsList()) { System.out.format("Object name: %s%n", entity.getName()); System.out.format("Confidence: %s%n", entity.getScore()); System.out.format("Normalized Vertices:%n"); entity .getBoundingPoly() .getNormalizedVerticesList() .forEach(vertex -> System.out.format("- (%s, %s)%n", vertex.getX(), vertex.getY())); } } } }Node.js
このサンプルを試す前に、Vision クイックスタート: クライアント ライブラリの使用にある Node.js の設定を完了してください。詳細については、Vision Node.js API のリファレンス ドキュメントをご覧ください。
Vision に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
// Imports the Google Cloud client libraries const vision = require('@google-cloud/vision'); // Creates a client const client = new vision.ImageAnnotatorClient(); /** * TODO(developer): Uncomment the following line before running the sample. */ // const gcsUri = `gs://bucket/bucketImage.png`; const [result] = await client.objectLocalization(gcsUri); const objects = result.localizedObjectAnnotations; objects.forEach(object => { console.log(`Name: ${object.name}`); console.log(`Confidence: ${object.score}`); const veritices = object.boundingPoly.normalizedVertices; veritices.forEach(v => console.log(`x: ${v.x}, y:${v.y}`)); });Python
このサンプルを試す前に、Vision クイックスタート: クライアント ライブラリの使用にある Python の設定を完了してください。詳細については、Vision Python API のリファレンス ドキュメントをご覧ください。
Vision に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
def localize_objects_uri(uri): """Localize objects in the image on Google Cloud Storage Args: uri: The path to the file in Google Cloud Storage (gs://...) """ from google.cloud import vision client = vision.ImageAnnotatorClient() image = vision.Image() image.source.image_uri = uri objects = client.object_localization(image=image).localized_object_annotations print(f"Number of objects found: {len(objects)}") for object_ in objects: print(f"\n{object_.name} (confidence: {object_.score})") print("Normalized bounding polygon vertices: ") for vertex in object_.bounding_poly.normalized_vertices: print(f" - ({vertex.x}, {vertex.y})")gcloud
画像内のラベルを検出するには、次の例で示すように
gcloud ml vision detect-objectsコマンドを実行します。gcloud ml vision detect-objects https://cloud.google.com/vision/docs/images/bicycle_example.png
その他の言語
C#: クライアント ライブラリ ページの C# の設定手順を行ってから、.NET 用の Vision リファレンス ドキュメントをご覧ください。
PHP: クライアント ライブラリ ページの PHP の設定手順を行ってから、PHP 用の Vision リファレンス ドキュメントをご覧ください。
Ruby: クライアント ライブラリ ページの Ruby の設定手順を行ってから、Ruby 用の Vision リファレンス ドキュメントをご覧ください。
試してみる
次のツールを使用して、オブジェクト検出とローカライズをお試しください。前のセクションで指定した画像(
https://cloud.google.com/vision/docs/images/bicycle_example.png)を使用しても構いませんし、ご自分の画像を指定して試してみるのもよいでしょう。[実行] を選択してリクエストを送信します。
画像クレジット: Bogdan Dada、Unsplash より リクエストの本文:
{ "requests": [ { "features": [ { "maxResults": 10, "type": "OBJECT_LOCALIZATION" } ], "image": { "source": { "imageUri": "https://cloud.google.com/vision/docs/images/bicycle_example.png" } } } ] } - BASE64_ENCODED_IMAGE: バイナリ画像データの base64 表現(ASCII 文字列)。これは次のような文字列になります。