0

当我将图像上传到 s3 存储桶并调用 AWS Rekognition detect_labels 时,我正在获取检测到的标签的字典,如下所示

{'Labels': [{'Name': 'Plant', 'Confidence': 99.70314025878906, 'Instances': [], 'Parents': []}, {'Name': 'Flower', 'Confidence': 98.37027740478516 ,'实例':[],'父母':[{'名称':'工厂'}]}

但是在这里我需要返回带有识别对象的边界框的图像,如何实现?

4

2 回答 2

3

您必须使用rekognition.detect_labels方法对图像执行对象检测。然后您可以使用 list 的BoundingBox属性Labels来检索边界框的坐标,下面的代码可以是一个好的开始。

import boto3
import io
from PIL import Image, ImageDraw, ImageFont

file_name = 'plant.jpg'
# Get Rekognition client
rek_client = boto3.client('rekognition')
with open(file_name, 'rb') as im:
    # Read image bytes
    im_bytes = im.read()
    # Upload image to AWS 
    response = rek_client.detect_labels(Image={'Bytes': im_bytes})
    # Get default font to draw texts
    image = Image.open(io.BytesIO(im_bytes))
    font = ImageFont.truetype('arial.ttf', size=80)
    draw = ImageDraw.Draw(image)
    # Get all labels
    w, h = image.size
    for label in response['Labels']:
        name = label['Name']
        # Draw all instancex box, if any
        for instance in label['Instances']:
            bbox = instance['BoundingBox']
            x0 = int(bbox['Left'] * w) 
            y0 = int(bbox['Top'] * h)
            x1 = x0 + int(bbox['Width'] * w)
            y1 = y0 + int(bbox['Height'] * h)
            draw.rectangle([x0, y0, x1, y1], outline=(255, 0, 0), width=10)
            draw.text((x0, y1), name, font=font, fill=(255, 0, 0))

    image.save('labels.jpg')
于 2022-02-02T07:18:21.910 回答
0

来自DetectLabels API 文档

DetectLabels 返回Instance 对象数组中常见对象标签实例的边界框。一个 Instance 对象包含一个 BoundingBox 对象,用于图像上标签的位置。它还包括检测到边界框的置信度。

这在检测标签文档中有更多详细说明

Amazon Rekognition Image 和 Amazon Rekognition Video 可以返回常见对象标签的边界框,例如汽车、家具、服装或宠物。对于不太常见的对象标签,不会返回边界框信息。您可以使用边界框来查找图像中对象的确切位置、计算检测到的对象的实例,或使用边界框尺寸测量对象的大小。

简而言之,并非所有标签都返回边界框信息。@Allan Chua 的代码仅在标签是具有边界框信息的“普通对象”时才会在图像中绘制边界框。在您提供的示例 API 响应中,所有标签都没有边界框信息。

于 2022-02-02T15:44:51.097 回答