ラベルを検出する

Vision API では、画像内のエンティティについての情報を、幅広いカテゴリにわたって検出、抽出できます。

ラベルにより、一般的な物体、場所、活動、動物の種類、商品などを識別できます。ターゲットを設定したカスタムラベルが必要な場合、Cloud AutoML Vision では、カスタム機械学習モデルをトレーニングして画像を分類できます。

ラベルは英語でのみ返されます。Cloud Translate API は、英語のラベルを多数の他言語のいずれかに翻訳できます。

世田谷区の路地の画像
画像クレジット: Alex KnightUnsplash より

たとえば、上の画像の場合は、次のラベルのリストが返されます。

説明 スコア
街路 0.872
スナップショット 0.852
0.848
0.804
路地 0.713

ラベル検出のリクエスト

GCP プロジェクトと認証の設定

quickstart,gcloud_init vision.googleapis.com Cloud Vision API SERVICE_ACCOUNT True env_var

ローカル画像でラベルを検出する

Vision API は、リクエストの本文で画像ファイルのコンテンツを Base64 エンコードの文字列として送信し、ローカル画像ファイルの特徴検出を行います。

REST とコマンドライン

後述のリクエストのデータを使用する前に、次のように置き換えます。

  • base64-encoded-image: バイナリ画像データの base64 表現(ASCII 文字列)。これは次のような文字列になります。
    • /9j/4QAYRXhpZgAA...9tAVx/zDQDlGxn//2Q==
    詳細については、base64 エンコードをご覧ください。

HTTP メソッドと URL:

POST https://vision.googleapis.com/v1/images:annotate

リクエストの JSON 本文:

    {
      "requests": [
        {
          "image": {
            "content": "base64-encoded-image"
          },
          "features": [
            {
              "maxResults": 5,
              "type": "LABEL_DETECTION"
            }
          ]
        }
      ]
    }
    

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
https://vision.googleapis.com/v1/images:annotate

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

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 OK HTTP ステータス コードと JSON 形式のレスポンスを返します。

LABEL_DETECTION レスポンスには、検出されたラベル、スコア、トピカリティ、不透明ラベル ID が含まれます。

  • mid: 存在する場合は、このエンティティの Google Knowledge Graph エントリに対応する MID(Machine-generated Identifier)が格納されます。mid の値は異なる言語間でも一意であるため、異なる言語のエンティティをまとめるために使用することもできます。MID 値を調べるには、Google Knowledge Graph API のドキュメントをご覧ください。
  • description - ラベルの説明。
  • score - 信頼スコア。0(信頼できない)から 1(信頼度が非常に高い)の範囲で示されます。
  • topicality - 画像に対する ICA(Image Content Annotation)ラベルの関連度。ページの全体的なコンテキストに対するラベルの重要度 / 関連度を測定します。
    

    {
      "responses": [
        {
          "labelAnnotations": [
            {
              "mid": "/m/01c8br",
              "description": "Street",
              "score": 0.87294734,
              "topicality": 0.87294734
            },
            {
              "mid": "/m/06pg22",
              "description": "Snapshot",
              "score": 0.8523099,
              "topicality": 0.8523099
            },
            {
              "mid": "/m/0dx1j",
              "description": "Town",
              "score": 0.8481104,
              "topicality": 0.8481104
            },
            {
              "mid": "/m/01d74z",
              "description": "Night",
              "score": 0.80408716,
              "topicality": 0.80408716
            },
            {
              "mid": "/m/01lwf0",
              "description": "Alley",
              "score": 0.7133322,
              "topicality": 0.7133322
            }
          ]
        }
      ]
    }
    

C#

このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用の C# の設定手順に従ってください。詳細については、Vision API C# API のリファレンス ドキュメントをご覧ください。

// Load an image from a local file.
    var image = Image.FromFile(filePath);
    var client = ImageAnnotatorClient.Create();
    var response = client.DetectLabels(image);
    foreach (var annotation in response)
    {
        if (annotation.Description != null)
            Console.WriteLine(annotation.Description);
    }

Go

このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用の Go の設定手順に従ってください。詳細については、Vision API Go API のリファレンス ドキュメントをご覧ください。


    // detectLabels gets labels from the Vision API for an image at the given file path.
    func detectLabels(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.DetectLabels(ctx, image, nil, 10)
    	if err != nil {
    		return err
    	}

    	if len(annotations) == 0 {
    		fmt.Fprintln(w, "No labels found.")
    	} else {
    		fmt.Fprintln(w, "Labels:")
    		for _, annotation := range annotations {
    			fmt.Fprintln(w, annotation.Description)
    		}
    	}

    	return nil
    }
    

Java

このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用の Java の設定手順に従ってください。詳細については、Vision API Java API のリファレンス ドキュメントをご覧ください。

public static void detectLabels(String filePath, PrintStream out) throws Exception, IOException {
      List<AnnotateImageRequest> requests = new ArrayList<>();

      ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath));

      Image img = Image.newBuilder().setContent(imgBytes).build();
      Feature feat = Feature.newBuilder().setType(Type.LABEL_DETECTION).build();
      AnnotateImageRequest request =
          AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
      requests.add(request);

      try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
        BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
        List<AnnotateImageResponse> responses = response.getResponsesList();

        for (AnnotateImageResponse res : responses) {
          if (res.hasError()) {
            out.printf("Error: %s\n", res.getError().getMessage());
            return;
          }

          // For full list of available annotations, see http://g.co/cloud/vision/docs
          for (EntityAnnotation annotation : res.getLabelAnnotationsList()) {
            annotation.getAllFields().forEach((k, v) -> out.printf("%s : %s\n", k, v.toString()));
          }
        }
      }
    }

Node.js

このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用の Node.js の設定手順に従ってください。詳細については、Vision API Node.js API のリファレンス ドキュメントをご覧ください。

// Imports the Google Cloud client library
    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 fileName = 'Local image file, e.g. /path/to/image.png';

    // Performs label detection on the local file
    const [result] = await client.labelDetection(fileName);
    const labels = result.labelAnnotations;
    console.log('Labels:');
    labels.forEach(label => console.log(label.description));

PHP

このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用の PHP の設定手順に従ってください。詳細については、Vision API PHP API のリファレンス ドキュメントをご覧ください。

namespace Google\Cloud\Samples\Vision;

    use Google\Cloud\Vision\V1\ImageAnnotatorClient;

    // $path = 'path/to/your/image.jpg'

    function detect_label($path)
    {
        $imageAnnotator = new ImageAnnotatorClient();

        # annotate the image
        $image = file_get_contents($path);
        $response = $imageAnnotator->labelDetection($image);
        $labels = $response->getLabelAnnotations();

        if ($labels) {
            print("Labels:" . PHP_EOL);
            foreach ($labels as $label) {
                print($label->getDescription() . PHP_EOL);
            }
        } else {
            print('No label found' . PHP_EOL);
        }

        $imageAnnotator->close();
    }

Python

このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。詳細については、Vision API Python API のリファレンス ドキュメントをご覧ください。

def detect_labels(path):
        """Detects labels in the file."""
        from google.cloud import vision
        import io
        client = vision.ImageAnnotatorClient()

        with io.open(path, 'rb') as image_file:
            content = image_file.read()

        image = vision.types.Image(content=content)

        response = client.label_detection(image=image)
        labels = response.label_annotations
        print('Labels:')

        for label in labels:
            print(label.description)

        if response.error.message:
            raise Exception(
                '{}\nFor more info on error messages, check: '
                'https://cloud.google.com/apis/design/errors'.format(
                    response.error.message))

Ruby

このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用の Ruby の設定手順に従ってください。詳細については、Vision API Ruby API のリファレンス ドキュメントをご覧ください。

# image_path = "Path to local image file, eg. './image.png'"

    require "google/cloud/vision"

    image_annotator = Google::Cloud::Vision::ImageAnnotator.new

    response = image_annotator.label_detection(
      image:       image_path,
      max_results: 15 # optional, defaults to 10
    )

    response.responses.each do |res|
      res.label_annotations.each do |label|
        puts label.description
      end
    end

リモート画像でラベルを検出する

Vision API を使用すると、画像ファイルのコンテンツをリクエストの本文で送信することなく、Google Cloud Storage またはウェブ上にある画像ファイルに対して特徴検出を直接実行できます。

REST とコマンドライン

後述のリクエストのデータを使用する前に、次のように置き換えます。

  • cloud-storage-image-uri: Cloud Storage バケットにある有効な画像ファイルのパス。少なくとも、ファイルに対する読み取り権限が必要です。例:
    • gs://cloud-samples-data/vision/label/setagaya.jpeg

HTTP メソッドと URL:

POST https://vision.googleapis.com/v1/images:annotate

リクエストの JSON 本文:

    {
      "requests": [
        {
          "image": {
            "source": {
              "gcsImageUri": "cloud-storage-image-uri"
            }
          },
          "features": [
            {
              "maxResults": 5,
              "type": "LABEL_DETECTION"
            },
          ]
        }
      ]
    }
    

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
https://vision.googleapis.com/v1/images:annotate

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

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 OK HTTP ステータス コードと JSON 形式のレスポンスを返します。

LABEL_DETECTION レスポンスには、検出されたラベル、スコア、トピカリティ、不透明ラベル ID が含まれます。

  • mid: 存在する場合は、このエンティティの Google Knowledge Graph エントリに対応する MID(Machine-generated Identifier)が格納されます。mid の値は異なる言語間でも一意であるため、異なる言語のエンティティをまとめるために使用することもできます。MID 値を調べるには、Google Knowledge Graph API のドキュメントをご覧ください。
  • description - ラベルの説明。
  • score - 信頼スコア。0(信頼できない)から 1(信頼度が非常に高い)の範囲で示されます。
  • topicality - 画像に対する ICA(Image Content Annotation)ラベルの関連度。ページの全体的なコンテキストに対するラベルの重要度 / 関連度を測定します。
    

    {
      "responses": [
        {
          "labelAnnotations": [
            {
              "mid": "/m/01c8br",
              "description": "Street",
              "score": 0.87294734,
              "topicality": 0.87294734
            },
            {
              "mid": "/m/06pg22",
              "description": "Snapshot",
              "score": 0.8523099,
              "topicality": 0.8523099
            },
            {
              "mid": "/m/0dx1j",
              "description": "Town",
              "score": 0.8481104,
              "topicality": 0.8481104
            },
            {
              "mid": "/m/01d74z",
              "description": "Night",
              "score": 0.80408716,
              "topicality": 0.80408716
            },
            {
              "mid": "/m/01lwf0",
              "description": "Alley",
              "score": 0.7133322,
              "topicality": 0.7133322
            }
          ]
        }
      ]
    }
    

C#

このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用の C# の設定手順に従ってください。詳細については、Vision API C# API のリファレンス ドキュメントをご覧ください。

// Specify a Google Cloud Storage uri for the image
    // or a publicly accessible HTTP or HTTPS uri.
    var image = Image.FromUri(uri);
    var client = ImageAnnotatorClient.Create();
    var response = client.DetectLabels(image);
    foreach (var annotation in response)
    {
        if (annotation.Description != null)
            Console.WriteLine(annotation.Description);
    }

Go

このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用の Go の設定手順に従ってください。詳細については、Vision API Go API のリファレンス ドキュメントをご覧ください。


    // detectLabels gets labels from the Vision API for an image at the given file path.
    func detectLabelsURI(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.DetectLabels(ctx, image, nil, 10)
    	if err != nil {
    		return err
    	}

    	if len(annotations) == 0 {
    		fmt.Fprintln(w, "No labels found.")
    	} else {
    		fmt.Fprintln(w, "Labels:")
    		for _, annotation := range annotations {
    			fmt.Fprintln(w, annotation.Description)
    		}
    	}

    	return nil
    }
    

Java

このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用の Java の設定手順に従ってください。詳細については、Vision API Java API のリファレンス ドキュメントをご覧ください。

public static void detectLabelsGcs(String gcsPath, PrintStream out) throws Exception,
        IOException {
      List<AnnotateImageRequest> requests = new ArrayList<>();

      ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build();
      Image img = Image.newBuilder().setSource(imgSource).build();
      Feature feat = Feature.newBuilder().setType(Type.LABEL_DETECTION).build();
      AnnotateImageRequest request =
          AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
      requests.add(request);

      try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
        BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
        List<AnnotateImageResponse> responses = response.getResponsesList();

        for (AnnotateImageResponse res : responses) {
          if (res.hasError()) {
            out.printf("Error: %s\n", res.getError().getMessage());
            return;
          }

          // For full list of available annotations, see http://g.co/cloud/vision/docs
          for (EntityAnnotation annotation : res.getLabelAnnotationsList()) {
            annotation.getAllFields().forEach((k, v) ->
                out.printf("%s : %s\n", k, v.toString()));
          }
        }
      }
    }

Node.js

このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用の Node.js の設定手順に従ってください。詳細については、Vision API Node.js API のリファレンス ドキュメントをご覧ください。

// 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 lines before running the sample.
     */
    // const bucketName = 'Bucket where the file resides, e.g. my-bucket';
    // const fileName = 'Path to file within bucket, e.g. path/to/image.png';

    // Performs label detection on the gcs file
    const [result] = await client.labelDetection(
      `gs://${bucketName}/${fileName}`
    );
    const labels = result.labelAnnotations;
    console.log('Labels:');
    labels.forEach(label => console.log(label.description));

PHP

このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用の PHP の設定手順に従ってください。詳細については、Vision API PHP API のリファレンス ドキュメントをご覧ください。

namespace Google\Cloud\Samples\Vision;

    use Google\Cloud\Vision\V1\ImageAnnotatorClient;

    // $path = 'gs://path/to/your/image.jpg'

    function detect_label_gcs($path)
    {
        $imageAnnotator = new ImageAnnotatorClient();

        # annotate the image
        $response = $imageAnnotator->labelDetection($path);
        $labels = $response->getLabelAnnotations();

        if ($labels) {
            print("Labels:" . PHP_EOL);
            foreach ($labels as $label) {
                print($label->getDescription() . PHP_EOL);
            }
        } else {
            print('No label found' . PHP_EOL);
        }

        $imageAnnotator->close();
    }

Python

このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。詳細については、Vision API Python API のリファレンス ドキュメントをご覧ください。

def detect_labels_uri(uri):
        """Detects labels in the file located in Google Cloud Storage or on the
        Web."""
        from google.cloud import vision
        client = vision.ImageAnnotatorClient()
        image = vision.types.Image()
        image.source.image_uri = uri

        response = client.label_detection(image=image)
        labels = response.label_annotations
        print('Labels:')

        for label in labels:
            print(label.description)

        if response.error.message:
            raise Exception(
                '{}\nFor more info on error messages, check: '
                'https://cloud.google.com/apis/design/errors'.format(
                    response.error.message))

Ruby

このサンプルを試す前に、Vision API クイックスタート: クライアント ライブラリの使用の Ruby の設定手順に従ってください。詳細については、Vision API Ruby API のリファレンス ドキュメントをご覧ください。

# image_path = "Google Cloud Storage URI, eg. 'gs://my-bucket/image.png'"

    require "google/cloud/vision"

    image_annotator = Google::Cloud::Vision::ImageAnnotator.new

    response = image_annotator.label_detection(
      image:       image_path,
      max_results: 15 # optional, defaults to 10
    )

    response.responses.each do |res|
      res.label_annotations.each do |label|
        puts label.description
      end
    end

gcloud コマンド

画像内のラベルを検出するには、次の例で示すように gcloud ml vision detect-labels コマンドを実行します。

    gcloud ml vision detect-labels gs://cloud-samples-data/vision/label/setagaya.jpeg
    

試してみる

ラベルの検出を試してみましょう。すでに指定済みの画像(gs://cloud-samples-data/vision/label/setagaya.jpeg)を使用することも、独自の画像を指定することもできます。[実行] を選択してリクエストを送信します。

世田谷区の路地の画像
画像クレジット: Alex KnightUnsplash より