使用Cloud Shell的Google Cloud Vision API:如何为多个图像运行API?我的request.json应该是什么样的?

问题描述

我已经使用[Cloud Shell]对单个图像进行了测试,并且request.json如下所示。如何为整个图像文件夹运行Vision API? 此外,为什么要公开图像的用户权限才能运行API? 谢谢。

{
"requests": [
      {
"image": {
"source": {
"gcsImageUri": "gs://visionapitest/landmark/test.jpeg"
          } 
        },"features": [
          {
"type": "LABEL_DETECTION","maxResults": 10
          }
        ]
      }
  ]
}

解决方法

如果要使用Cloud Shell执行请求,则必须按照以下方式进行操作

{
"requests": [
{
  "image": {
    "source": {
      "gcsImageUri": "gs://visionapitest/landmark/test.jpeg"
    }
  },"features": [
    {
      "type": "LABEL_DETECTION","maxResults": 10
    }
  ]
},{
  "image": {
    "source": {
      "gcsImageUri": "gs://visionapitest/landmark/test2.jpeg"
    }
  },… ]}

请注意,这不是指定完整文件夹的方法,因为您可以看到“ requests”字段是AnnotateImageRequest对象的数组,因此您必须逐项列出JSON文件中的每个图像。

另一方面,您可以通过使用可用的Vision Client Libraries中的一个来动态创建“请求”数组,以读取文件夹中的所有图像。我想分享我从Vision API documentation那里获取的python代码段,尽管它只是考虑了图像,但我对其进行了修改以读取整个文件夹。

from google.cloud import vision_v1
from google.cloud.vision_v1 import enums
from google.cloud import storage
from google.cloud.vision_v1 import types
from re import search

def sample_async_batch_annotate_images(
   bucket_name,output_uri
):
"""Perform async batch image annotation."""
client = vision_v1.ImageAnnotatorClient()

storage_client = storage.Client()
blobs = storage_client.list_blobs(
    bucket_name,prefix='vision/label/',delimiter='/'
)

requests = []

for blob in blobs:
    if search('jpg',blob.name):
        input_image_uri = 'gs://' + bucket_name +'/'+ blob.name
        print(input_image_uri)

        source = {"image_uri": input_image_uri}
        image = {"source": source}
        features = [
            {"type": enums.Feature.Type.LABEL_DETECTION},]

        request = types.AnnotateImageRequest(image=image,features=features)
        requests.append(request)

gcs_destination = {"uri": output_uri}

# The max number of responses to output in each JSON file
batch_size = 2
output_config = {"gcs_destination": gcs_destination,"batch_size": batch_size}

operation = client.async_batch_annotate_images(requests,output_config)

print("Waiting for operation to complete...")
response = operation.result(90)

# The output is written to GCS with the provided output_uri as prefix
gcs_output_uri = response.output_config.gcs_destination.uri
print("Output written to GCS with prefix: {}".format(gcs_output_uri))

但是,您可以将此作为参考,但这取决于您的用例和代码语言首选项。

关于权限的问题,我想您指的是Cloud Storage存储桶。据我了解,不必公开图像,您只需要在存储桶中为执行请求的服务帐户提供读/写Cloud Storage permissions