Skip to content

Instantly share code, notes, and snippets.

@alexcasalboni
Last active September 6, 2023 15:20
Show Gist options
  • Save alexcasalboni/0f21a1889f09760f8981b643326730ff to your computer and use it in GitHub Desktop.
Save alexcasalboni/0f21a1889f09760f8981b643326730ff to your computer and use it in GitHub Desktop.
Amazon Rekognition - Python Code Samples

Amazon Rekognition - Python Code Samples

  1. Labels Detection
  2. Faces Detection
  3. Faces Comparison
  4. Faces Indexing
  5. Faces Search
import boto3
BUCKET = "amazon-rekognition"
KEY = "test.jpg"
def detect_labels(bucket, key, max_labels=10, min_confidence=90, region="eu-west-1"):
rekognition = boto3.client("rekognition", region)
response = rekognition.detect_labels(
Image={
"S3Object": {
"Bucket": bucket,
"Name": key,
}
},
MaxLabels=max_labels,
MinConfidence=min_confidence,
)
return response['Labels']
for label in detect_labels(BUCKET, KEY):
print "{Name} - {Confidence}%".format(**label)
"""
Expected output:
People - 99.2436447144%
Person - 99.2436447144%
Human - 99.2351226807%
Clothing - 96.7797698975%
Suit - 96.7797698975%
"""
import boto3
BUCKET = "amazon-rekognition"
KEY = "test.jpg"
FEATURES_BLACKLIST = ("Landmarks", "Emotions", "Pose", "Quality", "BoundingBox", "Confidence")
def detect_faces(bucket, key, attributes=['ALL'], region="eu-west-1"):
rekognition = boto3.client("rekognition", region)
response = rekognition.detect_faces(
Image={
"S3Object": {
"Bucket": bucket,
"Name": key,
}
},
Attributes=attributes,
)
return response['FaceDetails']
for face in detect_faces(BUCKET, KEY):
print "Face ({Confidence}%)".format(**face)
# emotions
for emotion in face['Emotions']:
print " {Type} : {Confidence}%".format(**emotion)
# quality
for quality, value in face['Quality'].iteritems():
print " {quality} : {value}".format(quality=quality, value=value)
# facial features
for feature, data in face.iteritems():
if feature not in FEATURES_BLACKLIST:
print " {feature}({data[Value]}) : {data[Confidence]}%".format(feature=feature, data=data)
"""
Expected output:
Face (99.945602417%)
SAD : 14.6038293839%
HAPPY : 12.3668470383%
DISGUSTED : 3.81404161453%
Sharpness : 10.0
Brightness : 31.4071826935
Eyeglasses(False) : 99.990234375%
Sunglasses(False) : 99.9500656128%
Gender(Male) : 99.9291687012%
EyesOpen(True) : 99.9609146118%
Smile(False) : 99.8329467773%
MouthOpen(False) : 98.3746566772%
Mustache(False) : 98.7549591064%
Beard(False) : 92.758682251%
"""
import boto3
BUCKET = "amazon-rekognition"
KEY_SOURCE = "test.jpg"
KEY_TARGET = "target.jpg"
def compare_faces(bucket, key, bucket_target, key_target, threshold=80, region="eu-west-1"):
rekognition = boto3.client("rekognition", region)
response = rekognition.compare_faces(
SourceImage={
"S3Object": {
"Bucket": bucket,
"Name": key,
}
},
TargetImage={
"S3Object": {
"Bucket": bucket_target,
"Name": key_target,
}
},
SimilarityThreshold=threshold,
)
return response['SourceImageFace'], response['FaceMatches']
source_face, matches = compare_faces(BUCKET, KEY_SOURCE, BUCKET, KEY_TARGET)
# the main source face
print "Source Face ({Confidence}%)".format(**source_face)
# one match for each target face
for match in matches:
print "Target Face ({Confidence}%)".format(**match['Face'])
print " Similarity : {}%".format(match['Similarity'])
"""
Expected output:
Source Face (99.945602417%)
Target Face (99.9963378906%)
Similarity : 89.0%
"""
import boto3
BUCKET = "amazon-rekognition"
KEY = "test.jpg"
IMAGE_ID = KEY # S3 key as ImageId
COLLECTION = "my-collection-id"
# Note: you have to create the collection first!
# rekognition.create_collection(CollectionId=COLLECTION)
def index_faces(bucket, key, collection_id, image_id=None, attributes=(), region="eu-west-1"):
rekognition = boto3.client("rekognition", region)
response = rekognition.index_faces(
Image={
"S3Object": {
"Bucket": bucket,
"Name": key,
}
},
CollectionId=collection_id,
ExternalImageId=image_id,
DetectionAttributes=attributes,
)
return response['FaceRecords']
for record in index_faces(BUCKET, KEY, COLLECTION, IMAGE_ID):
face = record['Face']
# details = record['FaceDetail']
print "Face ({}%)".format(face['Confidence'])
print " FaceId: {}".format(face['FaceId'])
print " ImageId: {}".format(face['ImageId'])
"""
Expected output:
Face (99.945602417%)
FaceId: dc090f86-48a4-5f09-905f-44e97fb1d455
ImageId: f974c8d3-7519-5796-a08d-b96e0f2fc242
"""
import boto3
BUCKET = "amazon-rekognition"
KEY = "search.jpg"
COLLECTION = "my-collection-id"
def search_faces_by_image(bucket, key, collection_id, threshold=80, region="eu-west-1"):
rekognition = boto3.client("rekognition", region)
response = rekognition.search_faces_by_image(
Image={
"S3Object": {
"Bucket": bucket,
"Name": key,
}
},
CollectionId=collection_id,
FaceMatchThreshold=threshold,
)
return response['FaceMatches']
for record in search_faces_by_image(BUCKET, KEY, COLLECTION):
face = record['Face']
print "Matched Face ({}%)".format(record['Similarity'])
print " FaceId : {}".format(face['FaceId'])
print " ImageId : {}".format(face['ExternalImageId'])
"""
Expected output:
Matched Face (96.6647949219%)
FaceId : dc090f86-48a4-5f09-905f-44e97fb1d455
ImageId : test.jpg
"""
@alexcasalboni
Copy link
Author

@toto88 you can just remove them from the labels list in your favorite programming language (if you are using one of the available AWS SDK). The detectLabel response is just a JSON object so you should be able to parse it with any JSON parser out there, exclude the "Person"/"People"/"Human" labels and use/store all the others.

@toto88
Copy link

toto88 commented Mar 7, 2020

@alexcasalboni thanks for your reply, how i can get the full list of labels, I have checked the Q&A page, it's just have some examples. https://aws.amazon.com/rekognition/faqs/

@alexcasalboni
Copy link
Author

@toto88 unfortunately there is no public list of labels available yet.. Rekognition uses thousands of labels and the model is updated periodically under the hood.. for now, the best way to know if a given label is recognized is to submit a few images with that object/entity and verify it directly :)

@sunhoro
Copy link

sunhoro commented Aug 30, 2020

@alexcasalboni thanks for all your effort! I tried your script but having an issue with print. Do you have any idea what I can do? Also, MaxLables and MinConfidence does not seem to work either.
123

@alexcasalboni
Copy link
Author

@sunhoro I bet you're using Python3 :) You just need to convert the script to Python 3 (hint: use the print function, with parenthesis).

@AmarNaga
Copy link

AmarNaga commented Oct 1, 2020

The face emotion part displays all the types of available emotions. How can I display the emotion with highest confidence?

@Shreyash1811
Copy link

Shreyash1811 commented Oct 1, 2020 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment