使用Amazon Rekognition从ImageID下载图像并收集图像

时间:2018-08-18 10:10:02

标签: amazon-web-services amazon-s3 aws-sdk amazon-rekognition

我正在使用AWS Rekognition构建面部识别应用程序。我还想向用户显示与输入图像匹配的图像。当我们为索引建立索引时,AWS是否还会保存图像?如果是,我如何获得该图像?

如果没有,我正在考虑采用这种方式。我可以将图像以与ExternalImageId相同的名称保存到S3中,以便在检测到面部时从Rekognition读取外部ID并从S3中获取。

如果有比这更好的方法,请告诉我。

我正在使用以下代码来索引集合中的图像:

import boto3
from PIL import Image
import io
import time

image1 = 'images/haad2.jpg'

client = boto3.client('rekognition')
image = Image.open(image1)

stream = io.BytesIO()
image.save(stream, format="JPEG")
image_binary = stream.getvalue()

response = client.index_faces(
    Image={
        'Bytes': image_binary
    },
    CollectionId='root_faces_data',
    ExternalImageId=str(time.time()),
    DetectionAttributes=[
        'ALL',
    ]
)

print(response)

以及以下代码来查看集合中是否存在面孔:

import boto3
import io
from PIL import Image

client = boto3.client('rekognition')

image1 = 'images/haad2.jpg'

client = boto3.client('rekognition')
image = Image.open(image1)

stream = io.BytesIO()
image.save(stream, format="JPEG")
image_binary = stream.getvalue()

response = client.search_faces_by_image(
    CollectionId='root_faces_data',
    Image={
        'Bytes': image_binary
    },
    MaxFaces=10,
    FaceMatchThreshold=90
)

print(response)

这是search_faces_by_image的输出:

{
  'SearchedFaceBoundingBox': {
    'Width': 0.2646464705467224,
    'Height': 0.39817628264427185,
    'Left': 0.3186868727207184,
    'Top': 0.23252280056476593
  },
  'SearchedFaceConfidence': 99.9957275390625,
  'FaceMatches': [
    {
      'Similarity': 99.98405456542969,
      'Face': {
        'FaceId': '5bc98595-7d30-4447-b430-4c0fd8f1b926',
        'BoundingBox': {
          'Width': 0.2646459937095642,
          'Height': 0.39817601442337036,
          'Left': 0.31868699193000793,
          'Top': 0.23252299427986145
        },
        'ImageId': '8e631731-4a0c-513d-be32-dbfe3ae5e813',
        'ExternalImageId': '1534576206.8314612',
        'Confidence': 99.9957046508789
      }
    }
  ],
  'FaceModelVersion': '3.0',
  'ResponseMetadata': {
    'RequestId': 'eca4bea6-a2b5-11e8-9345-a5eddf19f47f',
    'HTTPStatusCode': 200,
    'HTTPHeaders': {
      'content-type': 'application/x-amz-json-1.1',
      'date': 'Sat, 18 Aug 2018 07:12:09 GMT',
      'x-amzn-requestid': 'eca4bea6-a2b5-11e8-9345-a5eddf19f47f',
      'content-length': '553',
      'connection': 'keep-alive'
    },
    'RetryAttempts': 0
  }
}

1 个答案:

答案 0 :(得分:2)

不。将脸部添加到“脸部收藏”时,不会保留原始图像。

来自Adding Faces to a Collection - Amazon Rekognition

  

对于检测到的每张脸,Amazon Rekognition都会提取脸部特征并将特征信息存储在数据库中。此外,该命令还存储在指定面部集合中检测到的每个面部的元数据。 Amazon Rekognition不存储实际的图像字节。

您将原始图像存储在Amazon S3中的想法很好。但是,您可以在对BoundingBox的回复中使用search_faces_by_image()信息来改进它。

当Amazon Rekognition将人脸添加到人脸收藏中时,它会在输入图像中搜索最大的人脸。此脸的位置由BoundingBox提供。

在存储原始图像之前,应使用BoundingBox尺寸裁剪图像。请注意,这些是相对于尺寸大小的,因此您需要使用类似以下内容的

(int(face['BoundingBox']['Left'] * width),
 int(face['BoundingBox']['Top'] * height)),
(int((face['BoundingBox']['Left'] + face['BoundingBox']['Width']) * width),
 int((face['BoundingBox']['Top'] + face['BoundingBox']['Height']) * height))

结果是,您所有的图像都将聚焦在面部本身上。