クロップヒントを検出する

クロップヒントは、画像上のクロップ領域の頂点を示します。

切り抜き前の画像
画像クレジット: Yasmin DangorUnsplash より(元の画像と切り抜いた画像を表示)

クロップヒントを適用(比率 2:1):

切り抜き後の画像

クロップヒント検出リクエスト

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 エンコードをご覧ください。

フィールド固有の考慮事項:

  • cropHintsParams.aspectRatios - 画像の幅と高さに指定された比率に対応する浮動小数点数です。最大 16 個までのクロップ比を指定できます。

HTTP メソッドと URL:

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

リクエストの JSON 本文:

    {
      "requests": [
        {
          "image": {
            "content": "base64-encoded-image"
          },
          "features": [
            {
              "type": "CROP_HINTS"
            }
          ],
          "imageContext": {
            "cropHintsParams": {
              "aspectRatios": [
                 2.0
              ]
            }
          }
        }
      ]
    }
    

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

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

レスポンス:

    

    {
      "responses": [
        {
          "cropHintsAnnotation": {
            "cropHints": [
              {
                "boundingPoly": {
                  "vertices": [
                    {
                      "y": 520
                    },
                    {
                      "x": 2369,
                      "y": 520
                    },
                    {
                      "x": 2369,
                      "y": 1729
                    },
                    {
                      "y": 1729
                    }
                  ]
                },
                "confidence": 0.79999995,
                "importanceFraction": 0.66999996
              }
            ]
          }
        }
      ]
    }
    

C#

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

// Load an image from a local file.
    var image = Image.FromFile(filePath);
    var client = ImageAnnotatorClient.Create();
    CropHintsAnnotation annotation = client.DetectCropHints(image);
    foreach (CropHint hint in annotation.CropHints)
    {
        Console.WriteLine("Confidence: {0}", hint.Confidence);
        Console.WriteLine("ImportanceFraction: {0}", hint.ImportanceFraction);
        Console.WriteLine("Bounding Polygon:");
        foreach (Vertex vertex in hint.BoundingPoly.Vertices)
        {
            Console.WriteLine("\tX:\t{0}\tY:\t{1}", vertex.X, vertex.Y);
        }
    }

Go

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


    // detectCropHints gets suggested croppings the Vision API for an image at the given file path.
    func detectCropHints(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
    	}
    	res, err := client.CropHints(ctx, image, nil)
    	if err != nil {
    		return err
    	}

    	fmt.Fprintln(w, "Crop hints:")
    	for _, hint := range res.CropHints {
    		for _, v := range hint.BoundingPoly.Vertices {
    			fmt.Fprintf(w, "(%d,%d)\n", v.X, v.Y)
    		}
    	}

    	return nil
    }
    

Java

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

public static void detectCropHints(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.CROP_HINTS).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
          CropHintsAnnotation annotation = res.getCropHintsAnnotation();
          for (CropHint hint : annotation.getCropHintsList()) {
            out.println(hint.getBoundingPoly());
          }
        }
      }
    }

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

    // Find crop hints for the local file
    const [result] = await client.cropHints(fileName);
    const cropHints = result.cropHintsAnnotation;
    cropHints.cropHints.forEach((hintBounds, hintIdx) => {
      console.log(`Crop Hint ${hintIdx}:`);
      hintBounds.boundingPoly.vertices.forEach((bound, boundIdx) => {
        console.log(`  Bound ${boundIdx}: (${bound.x}, ${bound.y})`);
      });
    });

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

        # annotate the image
        $image = file_get_contents($path);
        $response = $imageAnnotator->cropHintsDetection($image);
        $annotations = $response->getCropHintsAnnotation();

        # print the crop hints from the annotation
        if ($annotations) {
            print("Crop hints:" . PHP_EOL);
            foreach ($annotations->getCropHints() as $hint) {
                # get bounds
                $vertices = $hint->getBoundingPoly()->getVertices();
                $bounds = [];
                foreach ($vertices as $vertex) {
                    $bounds[] = sprintf('(%d,%d)', $vertex->getX(),
                        $vertex->getY());
                }
                print('Bounds: ' . join(', ', $bounds) . PHP_EOL);
            }
        } else {
            print('No crop hints' . PHP_EOL);
        }

        $imageAnnotator->close();
    }

Python

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

def detect_crop_hints(path):
        """Detects crop hints in 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)

        crop_hints_params = vision.types.CropHintsParams(aspect_ratios=[1.77])
        image_context = vision.types.ImageContext(
            crop_hints_params=crop_hints_params)

        response = client.crop_hints(image=image, image_context=image_context)
        hints = response.crop_hints_annotation.crop_hints

        for n, hint in enumerate(hints):
            print('\nCrop Hint: {}'.format(n))

            vertices = (['({},{})'.format(vertex.x, vertex.y)
                        for vertex in hint.bounding_poly.vertices])

            print('bounds: {}'.format(','.join(vertices)))

        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.crop_hints_detection image: image_path

    response.responses.each do |res|
      puts "Crop hint bounds:"
      res.crop_hints_annotation.crop_hints.each do |crop_hint|
        crop_hint.bounding_poly.vertices.each do |bound|
          puts "#{bound.x}, #{bound.y}"
        end
      end
    end

リモート画像のクロップヒントを検出する

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

REST とコマンドライン

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

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

フィールド固有の考慮事項:

  • cropHintsParams.aspectRatios - 画像の幅と高さに指定された比率に対応する浮動小数点数です。最大 16 個までのクロップ比を指定できます。

HTTP メソッドと URL:

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

リクエストの JSON 本文:

    {
      "requests": [
        {
          "image": {
            "source": {
              "gcsImageUri": "cloud-storage-image-uri"
            }
          },
          "features": [
            {
              "type": "CROP_HINTS"
            }
          ],
          "imageContext": {
            "cropHintsParams": {
              "aspectRatios": [
                 2.0
              ]
            }
          }
        }
      ]
    }
    

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

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

レスポンス:

    

    {
      "responses": [
        {
          "cropHintsAnnotation": {
            "cropHints": [
              {
                "boundingPoly": {
                  "vertices": [
                    {
                      "y": 520
                    },
                    {
                      "x": 2369,
                      "y": 520
                    },
                    {
                      "x": 2369,
                      "y": 1729
                    },
                    {
                      "y": 1729
                    }
                  ]
                },
                "confidence": 0.79999995,
                "importanceFraction": 0.66999996
              }
            ]
          }
        }
      ]
    }
    

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();
    CropHintsAnnotation annotation = client.DetectCropHints(image);
    foreach (CropHint hint in annotation.CropHints)
    {
        Console.WriteLine("Confidence: {0}", hint.Confidence);
        Console.WriteLine("ImportanceFraction: {0}", hint.ImportanceFraction);
        Console.WriteLine("Bounding Polygon:");
        foreach (Vertex vertex in hint.BoundingPoly.Vertices)
        {
            Console.WriteLine("\tX:\t{0}\tY:\t{1}", vertex.X, vertex.Y);
        }
    }

Java

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

public static void detectCropHintsGcs(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.CROP_HINTS).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
          CropHintsAnnotation annotation = res.getCropHintsAnnotation();
          for (CropHint hint : annotation.getCropHintsList()) {
            out.println(hint.getBoundingPoly());
          }
        }
      }
    }

Go

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


    // detectCropHints gets suggested croppings the Vision API for an image at the given file path.
    func detectCropHintsURI(w io.Writer, file string) error {
    	ctx := context.Background()

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

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

    	fmt.Fprintln(w, "Crop hints:")
    	for _, hint := range res.CropHints {
    		for _, v := range hint.BoundingPoly.Vertices {
    			fmt.Fprintf(w, "(%d,%d)\n", v.X, v.Y)
    		}
    	}

    	return nil
    }
    

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

    // Find crop hints for the remote file
    const [result] = await client.cropHints(`gs://${bucketName}/${fileName}`);
    const cropHints = result.cropHintsAnnotation;
    cropHints.cropHints.forEach((hintBounds, hintIdx) => {
      console.log(`Crop Hint ${hintIdx}:`);
      hintBounds.boundingPoly.vertices.forEach((bound, boundIdx) => {
        console.log(`  Bound ${boundIdx}: (${bound.x}, ${bound.y})`);
      });
    });

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

        # annotate the image
        $response = $imageAnnotator->cropHintsDetection($path);
        $annotations = $response->getCropHintsAnnotation();

        # print the crop hints from the annotation
        if ($annotations) {
            print("Crop hints:" . PHP_EOL);
            foreach ($annotations->getCropHints() as $hint) {
                # get bounds
                $vertices = $hint->getBoundingPoly()->getVertices();
                $bounds = [];
                foreach ($vertices as $vertex) {
                    $bounds[] = sprintf('(%d,%d)', $vertex->getX(),
                        $vertex->getY());
                }
                print('Bounds: ' . join(', ', $bounds) . PHP_EOL);
            }
        } else {
            print('No crop hints' . PHP_EOL);
        }

        $imageAnnotator->close();
    }

Python

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

def detect_crop_hints_uri(uri):
        """Detects crop hints 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

        crop_hints_params = vision.types.CropHintsParams(aspect_ratios=[1.77])
        image_context = vision.types.ImageContext(
            crop_hints_params=crop_hints_params)

        response = client.crop_hints(image=image, image_context=image_context)
        hints = response.crop_hints_annotation.crop_hints

        for n, hint in enumerate(hints):
            print('\nCrop Hint: {}'.format(n))

            vertices = (['({},{})'.format(vertex.x, vertex.y)
                        for vertex in hint.bounding_poly.vertices])

            print('bounds: {}'.format(','.join(vertices)))

        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.crop_hints_detection image: image_path

    response.responses.each do |res|
      puts "Crop hint bounds:"
      res.crop_hints_annotation.crop_hints.each do |crop_hint|
        crop_hint.bounding_poly.vertices.each do |bound|
          puts "#{bound.x}, #{bound.y}"
        end
      end
    end

gcloud コマンド

テキスト検出を行うには、次の例のように gcloud ml vision suggest-crop コマンドを実行します。

    gcloud ml vision suggest-crop gs://cloud-samples-data/vision/crop_hints/bubble.jpeg
    

試してみる

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

切り抜き前の画像
画像クレジット: Yasmin DangorUnsplash より