2016-12-30 13 views

Trả lời

13

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ó trong virtualenv đượ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ợ trong us-east-1, eu-west-1us-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.jpgtarget.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.

    Các source.jpg là: Felicity Jones source image

    Các target.jpg là: Felicity Jones target image

  • 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}} 
+1

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

+0

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

+1

@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