繁体   English   中英

如何使用 Google 的视觉 API 从单个调用中注释多个图像? Python

[英]How to annotate MULTIPLE images from a single call using Google's vision API? Python

我最近开始使用谷歌的愿景 API。 我正在尝试注释一批图像,因此从他们的文档中发布了“离线批量图像注释”指南。

但是,我不清楚如何从一个 API 调用中注释多个图像。 所以假设我在我的谷歌云存储桶中存储了 10 张图片。 如何一次注释所有这些图像并将它们存储在一个 JSON 文件中? 现在,我编写了一个程序,调用他们的示例 function 并且它可以工作,但简单地说,为什么我不能说:“查看此文件夹并注释其中的所有图像。”?

提前致谢。

from batch_image_labeling import sample_async_batch_annotate_images
counter = 0
for file in os.listdir('my_directory'):
    filename = file
    sample_async_batch_annotate_images('gs://my_bucket/{}'.format(filename), 'gs://my_bucket/{}'.format(counter))
    counter += 1


from google.cloud import vision_v1
from google.cloud.vision_v1 import enums
import six

def sample_async_batch_annotate_images(input_image_uri, output_uri):
  """Perform async batch image annotation"""

  client = vision_v1.ImageAnnotatorClient()

  if isinstance(input_image_uri, six.binary_type):
    input_image_uri = input_image_uri.decode('utf-8')
  if isinstance(output_uri, six.binary_type):
    output_uri = output_uri.decode('utf-8')
  source = {'image_uri': input_image_uri}
  image = {'source': source}
  type_ = enums.Feature.Type.LABEL_DETECTION
  features_element = {'type': type_}
  type_2 = enums.Feature.Type.IMAGE_PROPERTIES
  features_element_2 = {'type': type_2}
  features = [features_element, features_element_2]
  requests_element = {'image': image, 'features': features}
  requests = [requests_element]
  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()

  # 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))

从该示例中有些不清楚,但是您对async_batch_annotate_images的调用需要一个requests参数,该参数是多个请求的列表。 所以你可以做这样的事情:

rom google.cloud import vision_v1
from google.cloud.vision_v1 import enums
import six

def generate_request(input_image_uri):
  if isinstance(input_image_uri, six.binary_type):
    input_image_uri = input_image_uri.decode('utf-8')
  if isinstance(output_uri, six.binary_type):
    output_uri = output_uri.decode('utf-8')
  source = {'image_uri': input_image_uri}
  image = {'source': source}
  type_ = enums.Feature.Type.LABEL_DETECTION
  features_element = {'type': type_}
  type_2 = enums.Feature.Type.IMAGE_PROPERTIES
  features_element_2 = {'type': type_2}
  features = [features_element, features_element_2]
  requests_element = {'image': image, 'features': features}

  return requests_element


def sample_async_batch_annotate_images(input_uri, output_uri):
  """Perform async batch image annotation"""

  client = vision_v1.ImageAnnotatorClient()

  requests = [
    generate_request(input_uri.format(filename))
    for filename in os.listdir('my_directory')
  ]

  gcs_destination = {'uri': output_uri}

  # The max number of responses to output in each JSON file
  batch_size = 1
  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()

  # 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))


sample_async_batch_annotate_images('gs://my_bucket/{}', 'gs://my_bucket/results')

这可以在单个请求中注释多达 2,000 个图像。 唯一的缺点是您只能将单个output_uri指定为目标,因此您将无法使用counter将每个结果放在单独的文件中,但您可以设置batch_size = 1以确保在以下情况下单独写入每个响应这就是你想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM