ウェブ エンティティとページを検出する

ウェブ検出は、画像に対するウェブ参照を検出します。

カーニバルの画像
画像クレジット: Quinten de GraafUnsplashより抜粋。

カテゴリ レスポンス
ウェブ エンティティ
  • entityId: / m/02p7_j8 score: 1.3225499、description: Carnival in Rio de Janeiro
  • entityId: /m/06gmr、score: 1.1684971、description: Rio de Janeiro
  • entityId: /m/04cx88、score: 1.05945、description: Brazilian Carnival
...
完全一致画像
  • url: https://1000lugaresparair.files.wordpress.com/2017/11/quinten-de-graaf-278848.jpg
  • url: https://freewalkingtourrotterdam.com/wp-content/uploads/2017/07/quinten-de-graaf-278848.jpg
...
部分一致画像
  • url: https://www.linnanneito.fi/wp-content/uploads/sambakarnevaali-riossa.jpg
  • url: https://static.airhelp.com/wp-content/uploads/2019/02/26105557/two-women-in-carnival-costumes.jpg
...
画像が一致するページ
  • url: https://travelnoire.com/best-carnival-celebrations-around-the-world/、
    pageTitle: Best \u003cb\u003eCarnival\u003c/b\u003e Celebrations Around The World - Travel Noire、
    fullMatchingImages: [{url: https://travelnoire.com/wp-content/uploads/2019/02/quinten-de-graaf-278848-unsplash.jpg}]
  • url: https://bespokebrazil.com/rio-carnival-2019/,
    pageTitle: Visit \u003cb\u003eRio Carnival 2019\u003c/b\u003e with the Brazil Specialists - Bespoke Brazil,
    partialMatchingImages: [{ url: https://bespoke-brazil-2018-bespokebrazil.netdna-ssl.com/wp-content/uploads/2019/01/Carnival-1.jpg}]
...
類似の画像
  • url: https://www.brazilbookers.com/_images/photos/rio-carnival-images/rio-carnival-2016-carnival-date.jpg
  • url: https://image.redbull.com/rbcom/010/2017-02-08/1331843859949_3/0100/0/1/watch-rio-carnival-2017-live-on-red-bull-tv.jpg
...
最良の推測ラベル rio carnival 2019 dancers

ウェブ検出リクエスト

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": 10,
              "type": "WEB_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 形式のレスポンスを返します。

レスポンス:

C#

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

// Load an image from a local file.
    var image = Image.FromFile(filePath);
    var client = ImageAnnotatorClient.Create();
    WebDetection annotation = client.DetectWebInformation(image);
    foreach (var matchingImage in annotation.FullMatchingImages)
    {
        Console.WriteLine("MatchingImage Score:\t{0}\tUrl:\t{1}",
            matchingImage.Score, matchingImage.Url);
    }
    foreach (var page in annotation.PagesWithMatchingImages)
    {
        Console.WriteLine("PageWithMatchingImage Score:\t{0}\tUrl:\t{1}",
            page.Score, page.Url);
    }
    foreach (var matchingImage in annotation.PartialMatchingImages)
    {
        Console.WriteLine("PartialMatchingImage Score:\t{0}\tUrl:\t{1}",
            matchingImage.Score, matchingImage.Url);
    }
    foreach (var entity in annotation.WebEntities)
    {
        Console.WriteLine("WebEntity Score:\t{0}\tId:\t{1}\tDescription:\t{2}",
            entity.Score, entity.EntityId, entity.Description);
    }

Go

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


    // detectWeb gets image properties from the Vision API for an image at the given file path.
    func detectWeb(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
    	}
    	web, err := client.DetectWeb(ctx, image, nil)
    	if err != nil {
    		return err
    	}

    	fmt.Fprintln(w, "Web properties:")
    	if len(web.FullMatchingImages) != 0 {
    		fmt.Fprintln(w, "\tFull image matches:")
    		for _, full := range web.FullMatchingImages {
    			fmt.Fprintf(w, "\t\t%s\n", full.Url)
    		}
    	}
    	if len(web.PagesWithMatchingImages) != 0 {
    		fmt.Fprintln(w, "\tPages with this image:")
    		for _, page := range web.PagesWithMatchingImages {
    			fmt.Fprintf(w, "\t\t%s\n", page.Url)
    		}
    	}
    	if len(web.WebEntities) != 0 {
    		fmt.Fprintln(w, "\tEntities:")
    		fmt.Fprintln(w, "\t\tEntity\t\tScore\tDescription")
    		for _, entity := range web.WebEntities {
    			fmt.Fprintf(w, "\t\t%-14s\t%-2.4f\t%s\n", entity.EntityId, entity.Score, entity.Description)
    		}
    	}
    	if len(web.BestGuessLabels) != 0 {
    		fmt.Fprintln(w, "\tBest guess labels:")
    		for _, label := range web.BestGuessLabels {
    			fmt.Fprintf(w, "\t\t%s\n", label.Label)
    		}
    	}

    	return nil
    }
    

Java

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

/**
     * Finds references to the specified image on the web.
     *
     * @param filePath The path to the local file used for web annotation detection.
     * @param out A {@link PrintStream} to write the results to.
     * @throws Exception on errors while closing the client.
     * @throws IOException on Input/Output errors.
     */
    public static void detectWebDetections(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.WEB_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;
          }

          // Search the web for usages of the image. You could use these signals later
          // for user input moderation or linking external references.
          // For a full list of available annotations, see http://g.co/cloud/vision/docs
          WebDetection annotation = res.getWebDetection();
          out.println("Entity:Id:Score");
          out.println("===============");
          for (WebEntity entity : annotation.getWebEntitiesList()) {
            out.println(entity.getDescription() + " : " + entity.getEntityId() + " : "
                + entity.getScore());
          }
          for (WebLabel label : annotation.getBestGuessLabelsList()) {
            out.format("\nBest guess label: %s", label.getLabel());
          }
          out.println("\nPages with matching images: Score\n==");
          for (WebPage page : annotation.getPagesWithMatchingImagesList()) {
            out.println(page.getUrl() + " : " + page.getScore());
          }
          out.println("\nPages with partially matching images: Score\n==");
          for (WebImage image : annotation.getPartialMatchingImagesList()) {
            out.println(image.getUrl() + " : " + image.getScore());
          }
          out.println("\nPages with fully matching images: Score\n==");
          for (WebImage image : annotation.getFullMatchingImagesList()) {
            out.println(image.getUrl() + " : " + image.getScore());
          }
          out.println("\nPages with visually similar images: Score\n==");
          for (WebImage image : annotation.getVisuallySimilarImagesList()) {
            out.println(image.getUrl() + " : " + image.getScore());
          }
        }
      }
    }

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';

    // Detect similar images on the web to a local file
    const [result] = await client.webDetection(fileName);
    const webDetection = result.webDetection;
    if (webDetection.fullMatchingImages.length) {
      console.log(
        `Full matches found: ${webDetection.fullMatchingImages.length}`
      );
      webDetection.fullMatchingImages.forEach(image => {
        console.log(`  URL: ${image.url}`);
        console.log(`  Score: ${image.score}`);
      });
    }

    if (webDetection.partialMatchingImages.length) {
      console.log(
        `Partial matches found: ${webDetection.partialMatchingImages.length}`
      );
      webDetection.partialMatchingImages.forEach(image => {
        console.log(`  URL: ${image.url}`);
        console.log(`  Score: ${image.score}`);
      });
    }

    if (webDetection.webEntities.length) {
      console.log(`Web entities found: ${webDetection.webEntities.length}`);
      webDetection.webEntities.forEach(webEntity => {
        console.log(`  Description: ${webEntity.description}`);
        console.log(`  Score: ${webEntity.score}`);
      });
    }

    if (webDetection.bestGuessLabels.length) {
      console.log(
        `Best guess labels found: ${webDetection.bestGuessLabels.length}`
      );
      webDetection.bestGuessLabels.forEach(label => {
        console.log(`  Label: ${label.label}`);
      });
    }

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_web($path)
    {
        $imageAnnotator = new ImageAnnotatorClient();

        # annotate the image
        $image = file_get_contents($path);
        $response = $imageAnnotator->webDetection($image);
        $web = $response->getWebDetection();

        // Print best guess labels
        printf('%d best guess labels found' . PHP_EOL,
            count($web->getBestGuessLabels()));
        foreach ($web->getBestGuessLabels() as $label) {
            printf('Best guess label: %s' . PHP_EOL, $label->getLabel());
        }
        print(PHP_EOL);

        // Print pages with matching images
        printf('%d pages with matching images found' . PHP_EOL,
            count($web->getPagesWithMatchingImages()));
        foreach ($web->getPagesWithMatchingImages() as $page) {
            printf('URL: %s' . PHP_EOL, $page->getUrl());
        }
        print(PHP_EOL);

        // Print full matching images
        printf('%d full matching images found' . PHP_EOL,
            count($web->getFullMatchingImages()));
        foreach ($web->getFullMatchingImages() as $fullMatchingImage) {
            printf('URL: %s' . PHP_EOL, $fullMatchingImage->getUrl());
        }
        print(PHP_EOL);

        // Print partial matching images
        printf('%d partial matching images found' . PHP_EOL,
            count($web->getPartialMatchingImages()));
        foreach ($web->getPartialMatchingImages() as $partialMatchingImage) {
            printf('URL: %s' . PHP_EOL, $partialMatchingImage->getUrl());
        }
        print(PHP_EOL);

        // Print visually similar images
        printf('%d visually similar images found' . PHP_EOL,
            count($web->getVisuallySimilarImages()));
        foreach ($web->getVisuallySimilarImages() as $visuallySimilarImage) {
            printf('URL: %s' . PHP_EOL, $visuallySimilarImage->getUrl());
        }
        print(PHP_EOL);

        // Print web entities
        printf('%d web entities found' . PHP_EOL,
            count($web->getWebEntities()));
        foreach ($web->getWebEntities() as $entity) {
            printf('Description: %s, Score %s' . PHP_EOL,
                $entity->getDescription(),
                $entity->getScore());
        }

        $imageAnnotator->close();
    }

Python

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

def detect_web(path):
        """Detects web annotations given an image."""
        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.web_detection(image=image)
        annotations = response.web_detection

        if annotations.best_guess_labels:
            for label in annotations.best_guess_labels:
                print('\nBest guess label: {}'.format(label.label))

        if annotations.pages_with_matching_images:
            print('\n{} Pages with matching images found:'.format(
                len(annotations.pages_with_matching_images)))

            for page in annotations.pages_with_matching_images:
                print('\n\tPage url   : {}'.format(page.url))

                if page.full_matching_images:
                    print('\t{} Full Matches found: '.format(
                           len(page.full_matching_images)))

                    for image in page.full_matching_images:
                        print('\t\tImage url  : {}'.format(image.url))

                if page.partial_matching_images:
                    print('\t{} Partial Matches found: '.format(
                           len(page.partial_matching_images)))

                    for image in page.partial_matching_images:
                        print('\t\tImage url  : {}'.format(image.url))

        if annotations.web_entities:
            print('\n{} Web entities found: '.format(
                len(annotations.web_entities)))

            for entity in annotations.web_entities:
                print('\n\tScore      : {}'.format(entity.score))
                print(u'\tDescription: {}'.format(entity.description))

        if annotations.visually_similar_images:
            print('\n{} visually similar images found:\n'.format(
                len(annotations.visually_similar_images)))

            for image in annotations.visually_similar_images:
                print('\tImage url    : {}'.format(image.url))

        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.web_detection(
      image:       image_path,
      max_results: 15 # optional, defaults to 10
    )

    response.responses.each do |res|
      res.web_detection.web_entities.each do |entity|
        puts entity.description
      end

      res.web_detection.full_matching_images.each do |match|
        puts match.url
      end
    end

リモート画像でウェブ エンティティを検出する

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

REST とコマンドライン

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

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

HTTP メソッドと URL:

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

JSON 本文のリクエスト:

    {
      "requests": [
        {
          "image": {
            "source": {
              "gcsImageUri": "cloud-storage-image-uri"
            }
          },
          "features": [
            {
              "maxResults": 10,
              "type": "WEB_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 形式のレスポンスを返します。

レスポンス:

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();
    WebDetection annotation = client.DetectWebInformation(image);
    foreach (var matchingImage in annotation.FullMatchingImages)
    {
        Console.WriteLine("MatchingImage Score:\t{0}\tUrl:\t{1}",
            matchingImage.Score, matchingImage.Url);
    }
    foreach (var page in annotation.PagesWithMatchingImages)
    {
        Console.WriteLine("PageWithMatchingImage Score:\t{0}\tUrl:\t{1}",
            page.Score, page.Url);
    }
    foreach (var matchingImage in annotation.PartialMatchingImages)
    {
        Console.WriteLine("PartialMatchingImage Score:\t{0}\tUrl:\t{1}",
            matchingImage.Score, matchingImage.Url);
    }
    foreach (var entity in annotation.WebEntities)
    {
        Console.WriteLine("WebEntity Score:\t{0}\tId:\t{1}\tDescription:\t{2}",
            entity.Score, entity.EntityId, entity.Description);
    }

Go

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


    // detectWeb gets image properties from the Vision API for an image at the given file path.
    func detectWebURI(w io.Writer, file string) error {
    	ctx := context.Background()

    	client, err := vision.NewImageAnnotatorClient(ctx)
    	if err != nil {
    		return err
    	}

    	image := vision.NewImageFromURI(file)
    	web, err := client.DetectWeb(ctx, image, nil)
    	if err != nil {
    		return err
    	}

    	fmt.Fprintln(w, "Web properties:")
    	if len(web.FullMatchingImages) != 0 {
    		fmt.Fprintln(w, "\tFull image matches:")
    		for _, full := range web.FullMatchingImages {
    			fmt.Fprintf(w, "\t\t%s\n", full.Url)
    		}
    	}
    	if len(web.PagesWithMatchingImages) != 0 {
    		fmt.Fprintln(w, "\tPages with this image:")
    		for _, page := range web.PagesWithMatchingImages {
    			fmt.Fprintf(w, "\t\t%s\n", page.Url)
    		}
    	}
    	if len(web.WebEntities) != 0 {
    		fmt.Fprintln(w, "\tEntities:")
    		fmt.Fprintln(w, "\t\tEntity\t\tScore\tDescription")
    		for _, entity := range web.WebEntities {
    			fmt.Fprintf(w, "\t\t%-14s\t%-2.4f\t%s\n", entity.EntityId, entity.Score, entity.Description)
    		}
    	}
    	if len(web.BestGuessLabels) != 0 {
    		fmt.Fprintln(w, "\tBest guess labels:")
    		for _, label := range web.BestGuessLabels {
    			fmt.Fprintf(w, "\t\t%s\n", label.Label)
    		}
    	}

    	return nil
    }
    

Java

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

/**
     * Detects whether the remote image on Google Cloud Storage has features you would want to
     * moderate.
     *
     * @param gcsPath The path to the remote on Google Cloud Storage file to detect web annotations.
     * @param out A {@link PrintStream} to write the results to.
     * @throws Exception on errors while closing the client.
     * @throws IOException on Input/Output errors.
     */
    public static void detectWebDetectionsGcs(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.WEB_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;
          }

          // Search the web for usages of the image. You could use these signals later
          // for user input moderation or linking external references.
          // For a full list of available annotations, see http://g.co/cloud/vision/docs
          WebDetection annotation = res.getWebDetection();
          out.println("Entity:Id:Score");
          out.println("===============");
          for (WebEntity entity : annotation.getWebEntitiesList()) {
            out.println(entity.getDescription() + " : " + entity.getEntityId() + " : "
                + entity.getScore());
          }
          for (WebLabel label : annotation.getBestGuessLabelsList()) {
            out.format("\nBest guess label: %s", label.getLabel());
          }
          out.println("\nPages with matching images: Score\n==");
          for (WebPage page : annotation.getPagesWithMatchingImagesList()) {
            out.println(page.getUrl() + " : " + page.getScore());
          }
          out.println("\nPages with partially matching images: Score\n==");
          for (WebImage image : annotation.getPartialMatchingImagesList()) {
            out.println(image.getUrl() + " : " + image.getScore());
          }
          out.println("\nPages with fully matching images: Score\n==");
          for (WebImage image : annotation.getFullMatchingImagesList()) {
            out.println(image.getUrl() + " : " + image.getScore());
          }
          out.println("\nPages with visually similar images: Score\n==");
          for (WebImage image : annotation.getVisuallySimilarImagesList()) {
            out.println(image.getUrl() + " : " + image.getScore());
          }
        }
      }
    }

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';

    // Detect similar images on the web to a remote file
    const [result] = await client.webDetection(`gs://${bucketName}/${fileName}`);
    const webDetection = result.webDetection;
    if (webDetection.fullMatchingImages.length) {
      console.log(
        `Full matches found: ${webDetection.fullMatchingImages.length}`
      );
      webDetection.fullMatchingImages.forEach(image => {
        console.log(`  URL: ${image.url}`);
        console.log(`  Score: ${image.score}`);
      });
    }

    if (webDetection.partialMatchingImages.length) {
      console.log(
        `Partial matches found: ${webDetection.partialMatchingImages.length}`
      );
      webDetection.partialMatchingImages.forEach(image => {
        console.log(`  URL: ${image.url}`);
        console.log(`  Score: ${image.score}`);
      });
    }

    if (webDetection.webEntities.length) {
      console.log(`Web entities found: ${webDetection.webEntities.length}`);
      webDetection.webEntities.forEach(webEntity => {
        console.log(`  Description: ${webEntity.description}`);
        console.log(`  Score: ${webEntity.score}`);
      });
    }

    if (webDetection.bestGuessLabels.length) {
      console.log(
        `Best guess labels found: ${webDetection.bestGuessLabels.length}`
      );
      webDetection.bestGuessLabels.forEach(label => {
        console.log(`  Label: ${label.label}`);
      });
    }

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_web_gcs($path)
    {
        $imageAnnotator = new ImageAnnotatorClient();

        # annotate the image
        $response = $imageAnnotator->webDetection($path);
        $web = $response->getWebDetection();

        if ($web) {
            printf('%d best guess labels found' . PHP_EOL,
                count($web->getPagesWithMatchingImages()));
            foreach ($web->getBestGuessLabels() as $label) {
                printf('Best guess label: %s' . PHP_EOL, $label->getLabel());
            }
            print(PHP_EOL);

            // Print pages with matching images
            printf('%d pages with matching images found' . PHP_EOL,
                count($web->getPagesWithMatchingImages()));
            foreach ($web->getPagesWithMatchingImages() as $page) {
                printf('URL: %s' . PHP_EOL, $page->getUrl());
            }
            print(PHP_EOL);

            // Print full matching images
            printf('%d full matching images found' . PHP_EOL,
                count($web->getFullMatchingImages()));
            foreach ($web->getFullMatchingImages() as $fullMatchingImage) {
                printf('URL: %s' . PHP_EOL, $fullMatchingImage->getUrl());
            }
            print(PHP_EOL);

            // Print partial matching images
            printf('%d partial matching images found' . PHP_EOL,
                count($web->getPartialMatchingImages()));
            foreach ($web->getPartialMatchingImages() as $partialMatchingImage) {
                printf('URL: %s' . PHP_EOL, $partialMatchingImage->getUrl());
            }
            print(PHP_EOL);

            // Print visually similar images
            printf('%d visually similar images found' . PHP_EOL,
                count($web->getVisuallySimilarImages()));
            foreach ($web->getVisuallySimilarImages() as $visuallySimilarImage) {
                printf('URL: %s' . PHP_EOL, $visuallySimilarImage->getUrl());
            }
            print(PHP_EOL);

            // Print web entities
            printf('%d web entities found' . PHP_EOL,
                count($web->getWebEntities()));
            foreach ($web->getWebEntities() as $entity) {
                printf('Description: %s, Score: %f' . PHP_EOL,
                    $entity->getDescription(),
                    $entity->getScore());
            }
        } else {
            print('No Results.' . PHP_EOL);
        }

        $imageAnnotator->close();
    }

Python

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

def detect_web_uri(uri):
        """Detects web annotations in the file located in Google Cloud Storage."""
        from google.cloud import vision
        client = vision.ImageAnnotatorClient()
        image = vision.types.Image()
        image.source.image_uri = uri

        response = client.web_detection(image=image)
        annotations = response.web_detection

        if annotations.best_guess_labels:
            for label in annotations.best_guess_labels:
                print('\nBest guess label: {}'.format(label.label))

        if annotations.pages_with_matching_images:
            print('\n{} Pages with matching images found:'.format(
                len(annotations.pages_with_matching_images)))

            for page in annotations.pages_with_matching_images:
                print('\n\tPage url   : {}'.format(page.url))

                if page.full_matching_images:
                    print('\t{} Full Matches found: '.format(
                           len(page.full_matching_images)))

                    for image in page.full_matching_images:
                        print('\t\tImage url  : {}'.format(image.url))

                if page.partial_matching_images:
                    print('\t{} Partial Matches found: '.format(
                           len(page.partial_matching_images)))

                    for image in page.partial_matching_images:
                        print('\t\tImage url  : {}'.format(image.url))

        if annotations.web_entities:
            print('\n{} Web entities found: '.format(
                len(annotations.web_entities)))

            for entity in annotations.web_entities:
                print('\n\tScore      : {}'.format(entity.score))
                print(u'\tDescription: {}'.format(entity.description))

        if annotations.visually_similar_images:
            print('\n{} visually similar images found:\n'.format(
                len(annotations.visually_similar_images)))

            for image in annotations.visually_similar_images:
                print('\tImage url    : {}'.format(image.url))

        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.web_detection(
      image:       image_path,
      max_results: 15 # optional, defaults to 10
    )

    response.responses.each do |res|
      res.web_detection.web_entities.each do |entity|
        puts entity.description
      end

      res.web_detection.full_matching_images.each do |match|
        puts match.url
      end
    end

gcloud コマンド

ウェブ検出を行うには、次の例のように gcloud ml vision detect-web コマンドを実行します。

    gcloud ml vision detect-web gs://cloud-samples-data/vision/web/carnaval.jpeg
    

地理メタデータを使用する

Vision API は、画像ファイルのジオタグ メタデータにアクセスして、より関連性の高いウェブ エンティティやページを返すことができます。ジオタグを使用できるようにするには、リクエストに 'includeGeoResults': true を指定します。

REST とコマンドライン

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

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

HTTP メソッドと URL:

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

JSON 本文のリクエスト:

    {
      "requests": [
        {
          "image": {
            "source": {
              "gcsImageUri": "cloud-storage-image-uri"
            }
          },
          "features": [
            {
              "type": "WEB_DETECTION"
            }
          ],
          "imageContext": {
            "webDetectionParams": {
              "includeGeoResults": true
              }
            }
        }
      ]
    }
    

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

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 形式のレスポンスを返します。

レスポンス:

Go

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


    // detectWebGeo detects geographic metadata from the Vision API for an image at the given file path.
    func detectWebGeo(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
    	}
    	imageContext := &visionpb.ImageContext{
    		WebDetectionParams: &visionpb.WebDetectionParams{
    			IncludeGeoResults: true,
    		},
    	}
    	web, err := client.DetectWeb(ctx, image, imageContext)
    	if err != nil {
    		return err
    	}

    	if len(web.WebEntities) != 0 {
    		fmt.Fprintln(w, "Entities:")
    		fmt.Fprintln(w, "\tEntity\t\tScore\tDescription")
    		for _, entity := range web.WebEntities {
    			fmt.Fprintf(w, "\t%-14s\t%-2.4f\t%s\n", entity.EntityId, entity.Score, entity.Description)
    		}
    	}

    	return nil
    }
    

Java

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

/**
     * Find web entities given a local image.
     * @param filePath The path of the image to detect.
     * @param out A {@link PrintStream} to write the results to.
     * @throws Exception on errors while closing the client.
     * @throws IOException on Input/Output errors.
     */
    public static void detectWebEntitiesIncludeGeoResults(String filePath, PrintStream out) throws
        Exception, IOException {
      // Instantiates a client
      try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
        // Read in the local image
        ByteString contents = ByteString.readFrom(new FileInputStream(filePath));

        // Build the image
        Image image = Image.newBuilder().setContent(contents).build();

        // Enable `IncludeGeoResults`
        WebDetectionParams webDetectionParams = WebDetectionParams.newBuilder()
            .setIncludeGeoResults(true)
            .build();

        // Set the parameters for the image
        ImageContext imageContext = ImageContext.newBuilder()
            .setWebDetectionParams(webDetectionParams)
            .build();

        // Create the request with the image, imageContext, and the specified feature: web detection
        AnnotateImageRequest request = AnnotateImageRequest.newBuilder()
            .addFeatures(Feature.newBuilder().setType(Type.WEB_DETECTION))
            .setImage(image)
            .setImageContext(imageContext)
            .build();

        // Perform the request
        BatchAnnotateImagesResponse response = client.batchAnnotateImages(Arrays.asList(request));

        // Display the results
        response.getResponsesList().stream()
            .forEach(r -> r.getWebDetection().getWebEntitiesList().stream()
                .forEach(entity -> {
                  out.format("Description: %s\n", entity.getDescription());
                  out.format("Score: %f\n", entity.getScore());
                }));
      }
    }

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';

    const request = {
      image: {
        source: {
          filename: fileName,
        },
      },
      imageContext: {
        webDetectionParams: {
          includeGeoResults: true,
        },
      },
    };

    // Detect similar images on the web to a local file
    const [result] = await client.webDetection(request);
    const webDetection = result.webDetection;
    webDetection.webEntities.forEach(entity => {
      console.log(`Score: ${entity.score}`);
      console.log(`Description: ${entity.description}`);
    });

PHP

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

namespace Google\Cloud\Samples\Vision;

    use Google\Cloud\Vision\V1\ImageAnnotatorClient;
    use Google\Cloud\Vision\V1\ImageContext;
    use Google\Cloud\Vision\V1\WebDetectionParams;

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

    /**
     * Detect web entities on an image and include the image's geo metadata
     * to improve the quality of the detection.
     */
    function detect_web_with_geo_metadata($path)
    {
        $imageAnnotator = new ImageAnnotatorClient();

        # enable include geo results
        $params = new WebDetectionParams();
        $params->setIncludeGeoResults(true);
        $imageContext = new ImageContext();
        $imageContext-> setWebDetectionParams($params);

        # annotate the image
        $image = file_get_contents($path);
        $response = $imageAnnotator->webDetection($image, ['imageContext' => $imageContext]);
        $web = $response->getWebDetection();

        if ($web->getWebEntities()) {
            printf('%d web entities found:' . PHP_EOL,
                count($web->getWebEntities()));
            foreach ($web->getWebEntities() as $entity) {
                printf('Description: %s ' . PHP_EOL, $entity->getDescription());
                printf('Score: %f' . PHP_EOL, $entity->getScore());
                print(PHP_EOL);
            }
        }

        $imageAnnotator->close();
    }

Python

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

def web_entities_include_geo_results(path):
        """Detects web annotations given an image, using the geotag metadata
        in the image to detect web entities."""
        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)

        web_detection_params = vision.types.WebDetectionParams(
            include_geo_results=True)
        image_context = vision.types.ImageContext(
            web_detection_params=web_detection_params)

        response = client.web_detection(image=image, image_context=image_context)

        for entity in response.web_detection.web_entities:
            print('\n\tScore      : {}'.format(entity.score))
            print(u'\tDescription: {}'.format(entity.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))

gcloud コマンド

ウェブ検出を行うには、次の例のように gcloud ml vision detect-web コマンドを実行します。

    gcloud ml vision detect-web gs://cloud-samples-data/vision/web/carnaval.jpeg
    

試してみる

以下のウェブ エンティティ検出をお試しください。すでに指定済みの画像(gs://cloud-samples-data/vision/web/carnaval.jpeg)を使用することも、独自の画像を指定することもできます。[Execute] を選択してリクエストを送信します。

includeGeoResults を false に設定してリクエストを繰り返してみてください。

カーニバルの画像
画像クレジット: Quinten de GraafUnsplashより抜粋。