Tôi muốn thử Rekognition's CompareFaces, nhưng tôi không thấy ví dụ đầy đủ về cú pháp để sử dụng API HTTP. Giả sử tôi có hai hình ảnh, tôi sẽ gọi API này từ Python để lấy điểm số tương tự như thế nào?Ví dụ về cách gọi API HTTP nhận dạng lại AWS từ Python
Trả lời
Thông tin về mã
Có rất ít tài liệu xung quanh bằng cách sử dụng API HTTP cho AWS Rekognition, nhưng nó là khá đơn giản để sử dụng mô hình mà hầu hết các mã sử dụng để đạt AWS dịch vụ điểm cuối HTTP.
thông tin quan trọng về các mã sau:
Bạn phải có
requests
cài đặt. Nếu bạn không có nó, bạn có thể chạy như sau trong vỏ của bạn (làm nó trongvirtualenv
được khuyến khích).pip install requests
Khu vực
us-east-1
được sử dụng. Tính năng nhận dạng hiện được hỗ trợ trongus-east-1
,eu-west-1
vàus-west-2
để bạn có thể sửa đổi mã để hỗ trợ different region endpoints như bạn muốn.Dự kiến có hai tệp tồn tại trên đĩa để đọc, được gọi là
source.jpg
vàtarget.jpg
.Là cô ấy trong bộ phim mới nhất mà tôi đã xem, tôi đang sử dụng hình ảnh của Felicity Jones từ Star Wars: Rogue One làm nguồn và mục tiêu của tôi.
Nó bao gồm mã để làm ký với AWS Signature Version 4. Có những thư viện ở đó sẽ tạo ra chữ ký cho bạn, nhưng tôi không muốn dựa quá nhiều vào libs của bên thứ ba để chứng minh một ví dụ hoàn chỉnh.
Thông tin đăng nhập AWS bạn đang sử dụng phải có giá trị policy for Rekognition hợp lệ.
Nó được viết cho Python 2.7 (không khó khăn lắm để chuyển sang Python 3).
Bộ luật
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import base64
import datetime
import hashlib
import hmac
import json
import requests
# Key derivation functions
# http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-python
def sign(key, msg):
return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()
def getSignatureKey(key, date_stamp, regionName, serviceName):
kDate = sign(('AWS4' + key).encode('utf-8'), date_stamp)
kRegion = sign(kDate, regionName)
kService = sign(kRegion, serviceName)
kSigning = sign(kService, 'aws4_request')
return kSigning
if __name__ == '__main__':
# Read credentials from the environment
access_key = os.environ.get('AWS_ACCESS_KEY_ID')
secret_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
# Uncomment this line if you use temporary credentials via STS or similar
#token = os.environ.get('AWS_SESSION_TOKEN')
if access_key is None or secret_key is None:
print('No access key is available.')
sys.exit()
# This code shows the v4 request signing process as shown in
# http://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html
host = 'rekognition.us-east-1.amazonaws.com'
endpoint = 'https://rekognition.us-east-1.amazonaws.com'
service = 'rekognition'
# Currently, all Rekognition actions require POST requests
method = 'POST'
region = 'us-east-1'
# This defines the service target and sub-service you want to hit
# In this case you want to use 'CompareFaces'
amz_target = 'RekognitionService.CompareFaces'
# Amazon content type - Rekognition expects 1.1 x-amz-json
content_type = 'application/x-amz-json-1.1'
# Create a date for headers and the credential string
now = datetime.datetime.utcnow()
amz_date = now.strftime('%Y%m%dT%H%M%SZ')
date_stamp = now.strftime('%Y%m%d') # Date w/o time, used in credential scope
# Canonical request information
canonical_uri = '/'
canonical_querystring = ''
canonical_headers = 'content-type:' + content_type + '\n' + 'host:' + host + '\n' + 'x-amz-date:' + amz_date + '\n' + 'x-amz-target:' + amz_target + '\n'
# list of signed headers
signed_headers = 'content-type;host;x-amz-date;x-amz-target'
# Our source image: http://i.imgur.com/OK8aDRq.jpg
with open('source.jpg', 'rb') as source_image:
source_bytes = base64.b64encode(source_image.read())
# Our target image: http://i.imgur.com/Xchqm1r.jpg
with open('target.jpg', 'rb') as target_image:
target_bytes = base64.b64encode(target_image.read())
# here we build the dictionary for our request data
# that we will convert to JSON
request_dict = {
'SimilarityThreshold': 75.0,
'SourceImage': {
'Bytes': source_bytes
},
'TargetImage': {
'Bytes': target_bytes
}
}
# Convert our dict to a JSON string as it will be used as our payload
request_parameters = json.dumps(request_dict)
# Generate a hash of our payload for verification by Rekognition
payload_hash = hashlib.sha256(request_parameters).hexdigest()
# All of this is
canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
algorithm = 'AWS4-HMAC-SHA256'
credential_scope = date_stamp + '/' + region + '/' + service + '/' + 'aws4_request'
string_to_sign = algorithm + '\n' + amz_date + '\n' + credential_scope + '\n' + hashlib.sha256(canonical_request).hexdigest()
signing_key = getSignatureKey(secret_key, date_stamp, region, service)
signature = hmac.new(signing_key, (string_to_sign).encode('utf-8'), hashlib.sha256).hexdigest()
authorization_header = algorithm + ' ' + 'Credential=' + access_key + '/' + credential_scope + ', ' + 'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature
headers = { 'Content-Type': content_type,
'X-Amz-Date': amz_date,
'X-Amz-Target': amz_target,
# uncomment this if you uncommented the 'token' line earlier
#'X-Amz-Security-Token': token,
'Authorization': authorization_header}
r = requests.post(endpoint, data=request_parameters, headers=headers)
# Let's format the JSON string returned from the API for better output
formatted_text = json.dumps(json.loads(r.text), indent=4, sort_keys=True)
print('Response code: {}\n'.format(r.status_code))
print('Response body:\n{}'.format(formatted_text))
Mã Output
Nếu bạn lấy mã chạy, nó nên ra một cái gì đó như thế này:
Response code: 200
Response body:
{
"FaceMatches": [],
"SourceImageFace": {
"BoundingBox": {
"Height": 0.9448398351669312,
"Left": 0.12222222238779068,
"Top": -0.017793593928217888,
"Width": 0.5899999737739563
},
"Confidence": 99.99041748046875
}
}
Thực sự, chỉ cần sử dụng boto3
Điều đơn giản nhất bạn có thể làm là sử dụng boto3
.
Mã sẽ được đơn giản hóa thành một cái gì đó như sau, vì tất cả việc tạo chữ ký và công việc JSON trở nên không cần thiết.
Đảm bảo rằng bạn đã định cấu hình boto3
bằng thông tin xác thực trong môi trường hoặc thông qua tệp cấu hình hoặc đặt thông tin đăng nhập của bạn trực tuyến bằng mã. Để biết thêm thông tin, hãy xem boto3
configuration.
Mã cho mục đích này sử dụng số boto3
Rekognition API.
import pprint
import boto3
# Set this to whatever percentage of 'similarity'
# you'd want
SIMILARITY_THRESHOLD = 75.0
if __name__ == '__main__':
client = boto3.client('rekognition')
# Our source image: http://i.imgur.com/OK8aDRq.jpg
with open('source.jpg', 'rb') as source_image:
source_bytes = source_image.read()
# Our target image: http://i.imgur.com/Xchqm1r.jpg
with open('target.jpg', 'rb') as target_image:
target_bytes = target_image.read()
response = client.compare_faces(
SourceImage={ 'Bytes': source_bytes },
TargetImage={ 'Bytes': target_bytes },
SimilarityThreshold=SIMILARITY_THRESHOLD
)
pprint.pprint(response)
Trên đây boto3
dụ nên sản lượng này:
{u'FaceMatches': [],
'ResponseMetadata': {'HTTPHeaders': {'connection': 'keep-alive',
'content-length': '195',
'content-type': 'application/x-amz-json-1.1',
'date': 'Sat, 31 Dec 2016 23:15:56 GMT',
'x-amzn-requestid': '13edda2d-cfaf-11e6-9999-d3abf4c2feb3'},
'HTTPStatusCode': 200,
'RequestId': '13edda2d-cfaf-11e6-9999-d3abf4c2feb3',
'RetryAttempts': 0},
u'SourceImageFace': {u'BoundingBox': {u'Height': 0.9448398351669312,
u'Left': 0.12222222238779068,
u'Top': -0.017793593928217888,
u'Width': 0.5899999737739563},
u'Confidence': 99.99041748046875}}
Tôi đang thử 'boto3' vì nó chắc chắn trông đơn giản hơn. Không nên gọi ban đầu như sau: 'client = boto3.client ('rekognition', aws_access_key_id = key, aws_secret_access_key = bí mật, region_name = region)'? – jensph
Tôi có thể sử dụng bản demo Rekognition trong giao diện điều khiển AWS, tuy nhiên tôi gặp lỗi khi sử dụng 'boto3':' Đã xảy ra lỗi (AccessDeniedException) khi gọi thao tác CompareFaces: Người dùng: X không được phép thực hiện: rekognition: CompareFaces .' Có lẽ tôi cần phải kiểm tra lại các phím của mình, nhưng tôi muốn kiểm tra xem máy khách đã được thiết lập đúng chưa. – jensph
@jensph Nếu sử dụng boto3, bạn có thể chỉ định khóa/bí mật/mã thông báo/khu vực trong khi yêu cầu khách hàng hoặc chỉ định chúng trong biến môi trường. Ví dụ mã của tôi giả định sau. Ngoài ra còn có [các cách khác để cung cấp thông tin đăng nhập] (http://boto3.readthedocs.io/en/latest/guide/configuration.html). Đối với vấn đề khác mà bạn đang gặp phải, có vẻ như chính sách IAM của bạn không cấp quyền truy cập để sử dụng các tài nguyên 'rekognition'. – birryree
- 1. AWS ví dụ mẫu polly trong python?
- 2. Ví dụ về đọc từ điển Python
- 3. Ví dụ về ASP.NET Web API ActionFilter
- 4. Ví dụ về subclassing string.Template bằng Python?
- 5. Ví dụ về Yêu cầu HTTP của IOS
- 6. Ví dụ về AWS RDS nâng cấp xuống thời gian
- 7. Ví dụ về tìm chuỗi trong Python
- 8. Góc 2 Http Nhận trả lời Ví dụ
- 9. Ví dụ về thiết kế JavaScript API
- 10. Ví dụ về ứng dụng khách HTTP trên win32
- 11. Ví dụ về trang trí Python
- 12. Ví dụ về Cuộc gọi theo tên
- 13. Ví dụ về Numpy C-Api đưa ra một SegFault
- 14. Ví dụ gọi lại RMI đơn giản
- 15. Ví dụ về lượng tử Python?
- 16. Ví dụ về dạng số nhiều trong tệp dịch Yaml cho Rails i18n API
- 17. Ví dụ và mẹo về Crypto API của Window C/C++ Ví dụ và mẹo
- 18. Ví dụ về thời gian khó hiểu javascript Ví dụ
- 19. inpolygon cho Python - Ví dụ về phương thức matplotlib.path.Path contains_points()?
- 20. Ví dụ về MultiSelectListPreference
- 21. Ví dụ về Winsock?
- 22. Ví dụ về D.ccurl
- 23. wxPython Ví dụ về WebView
- 24. Ví dụ về NSTextContainer với hình dạng không thường xuyên?
- 25. Python Peewee execute_sql() ví dụ
- 26. Ví dụ về JSON API trong Swagger 2.0
- 27. Kế thừa từ ví dụ trong Python
- 28. Ví dụ về Scala dispatch
- 29. Ví dụ về API Máy khách Native Client của SQL
- 30. Ví dụ về pysmb
Bất kỳ lý do tại sao bạn muốn sử dụng API HTTP thay vì 'boto3'? – birryree