问题描述
我已经使用[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。