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

Google cloud platform 使用Cloud Shell的Google Cloud Vision API:如何为多个图像运行该API?我的request.json应该是什么样子?,google-cloud-platform,google-cloud-vision,Google Cloud Platform,Google Cloud Vision,我[使用Cloud Shell]在单个图像上运行了一个测试,request.json如下所示。如何为整个图像文件夹运行Vision API? 另外,为什么图像的用户权限必须是公共的,API才能运行? 谢谢 如果您希望使用Cloud Shell执行请求,则必须按照以下方式执行 { "requests": [ { "image": { "source": { "gcsImageUri": &quo

我[使用Cloud Shell]在单个图像上运行了一个测试,request.json如下所示。如何为整个图像文件夹运行Vision API? 另外,为什么图像的用户权限必须是公共的,API才能运行? 谢谢


如果您希望使用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"
    }
  },
  "features": [
    {
      "type": "LABEL_DETECTION",
      "maxResults": 10
    }
  ]
}, … ]}
请注意,这不是指定完整文件夹的方法,因为您可以看到“requests”字段是一个对象数组,因此您必须逐项列出JSON文件中的每个图像

另一方面,为了读取文件夹中的所有图像,您可以使用一个可用的方法动态创建“requests”数组。我想与大家分享我从中获取的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))
但是,您可以将其作为参考,但这取决于您的用例和代码语言偏好


关于权限的问题,我想您指的是云存储桶。据我所知,没有必要公开您的图像,您只需在bucket中对执行请求的服务帐户进行读/写操作。

如果您想使用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"
    }
  },
  "features": [
    {
      "type": "LABEL_DETECTION",
      "maxResults": 10
    }
  ]
}, … ]}
请注意,这不是指定完整文件夹的方法,因为您可以看到“requests”字段是一个对象数组,因此您必须逐项列出JSON文件中的每个图像

另一方面,为了读取文件夹中的所有图像,您可以使用一个可用的方法动态创建“requests”数组。我想与大家分享我从中获取的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))
但是,您可以将其作为参考,但这取决于您的用例和代码语言偏好


关于权限的问题,我想您指的是云存储桶。据我所知,没有必要公开您的图像,您只需在bucket内对执行请求的服务帐户进行读/写操作。

谢谢,Mariana。我还没有Python方面的经验,但会研究一下。从Cloud Shell中,如何将API响应下载为JSON?您可以将已执行命令的响应重定向到一个文件,在命令末尾添加“>response.JSON”,通过这样做,响应将存储在“response.JSON”文件中。请注意,您可以根据需要命名该文件。为了下载创建的文件,您可以在Cloud Shell“cloudshell download file_name”中执行此命令,有关更多详细信息,您可以查看。谢谢,Mariana。我将在这里留下一条注释,解释上述命令,以防有人无意中发现此线程。在终端屏幕:1。curl-s-X POST-H“Content-Type:application/json”--data-binary@request.json-images:annotate?key=your-api-key>response.json 2。cloudshell download response.json应该下载响应文件谢谢,Mariana。我还没有Python方面的经验,但会研究一下。从Cloud Shell中,如何将API响应下载为JSON?您可以将已执行命令的响应重定向到一个文件,在命令末尾添加“>response.JSON”,通过这样做,响应将存储在“response.JSON”文件中。请注意,您可以根据需要命名该文件。为了下载创建的文件,您可以在Cloud Shell“cloudshell download file_name”中执行此命令,有关更多详细信息,您可以查看。谢谢,Mariana。我将在这里留下一条注释,解释上述命令,以防有人无意中发现此线程。在终端屏幕:1。curl-s-X POST-H“Content-Type:application/json”--data-binary@request.json-images:annotate?key=your-api-key>response.json 2。cloudshell download response.json,它应该下载响应文件