Классифицировать изображения по основам сходства
У меня есть 30,40 изображений людей, которые я хочу получить в коде Python. И сделать группу из похожих картинок. Как 5 фото Джона и 10 Петра. как это. Я новичок в области обработки изображений. Поэтому мой вопрос в том, какой алгоритм лучше для этого. И я хочу сделать это на лямбда-функции AWS. Любая помощь будет высоко оценен.
PS (Это моя первая задача в этой области. Пожалуйста, не обращайте внимания на ошибки, скажите мне, чтобы улучшить их Спасибо)
1 ответ
Я бы посоветовал вам сделать это с помощью AWS Rekognition. Это довольно просто. Вы можете достичь желаемого за 3 простых шага:
1. Загрузка изображений с метаданными: означает, что вы загружаете изображения людей с их именами в s3, чтобы сохранить их информацию, на которую будут ссылаться позже
2. Индексация фотографий : это означает добавление информационных тегов к лицам, эта информация хранится в DynamodB, и это делается с помощью API index_faces
3. Сравнение фотографий с индексированными лицами: это будет достигнуто с помощью rekognition search_faces_by_image api
Теперь часть 1 код: пакетная загрузка с метаданными
import boto3
s3 = boto3.resource('s3')
# Get list of objects for indexing
images=[('image01.jpeg','Albert Einstein'),
('image02.jpeg','Candy'),
('image03.jpeg','Armstrong'),
('image04.jpeg','Ram'),
('image05.jpeg','Peter'),
('image06.jpeg','Shashank')
]
# Iterate through list to upload objects to S3
for image in images:
file = open(image[0],'rb')
object = s3.Object('rekognition-pictures','index/'+ image[0])
ret = object.put(Body=file,
Metadata={'FullName':image[1]}
)
Теперь часть 2 кода: индексирование
from __future__ import print_function
import boto3
from decimal import Decimal
import json
import urllib
print('Loading function')
dynamodb = boto3.client('dynamodb')
s3 = boto3.client('s3')
rekognition = boto3.client('rekognition')
# --------------- Helper Functions ------------------
def index_faces(bucket, key):
response = rekognition.index_faces(
Image={"S3Object":
{"Bucket": bucket,
"Name": key}},
CollectionId="family_collection")
return response
def update_index(tableName,faceId, fullName):
response = dynamodb.put_item(
TableName=tableName,
Item={
'RekognitionId': {'S': faceId},
'FullName': {'S': fullName}
}
)
# --------------- Main handler ------------------
def lambda_handler(event, context):
# Get the object from the event
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.unquote_plus(
event['Records'][0]['s3']['object']['key'].encode('utf8'))
try:
# Calls Amazon Rekognition IndexFaces API to detect faces in S3 object
# to index faces into specified collection
response = index_faces(bucket, key)
# Commit faceId and full name object metadata to DynamoDB
if response['ResponseMetadata']['HTTPStatusCode'] == 200:
faceId = response['FaceRecords'][0]['Face']['FaceId']
ret = s3.head_object(Bucket=bucket,Key=key)
personFullName = ret['Metadata']['fullname']
update_index('family_collection',faceId,personFullName)
# Print response to console
print(response)
return response
except Exception as e:
print(e)
print("Error processing object {} from bucket {}. ".format(key, bucket))
raise e
Теперь часть 3 кода: Сравнить
import boto3
import io
from PIL import Image
rekognition = boto3.client('rekognition', region_name='eu-west-1')
dynamodb = boto3.client('dynamodb', region_name='eu-west-1')
image = Image.open("group1.jpeg")
stream = io.BytesIO()
image.save(stream,format="JPEG")
image_binary = stream.getvalue()
response = rekognition.search_faces_by_image(
CollectionId='family_collection',
Image={'Bytes':image_binary}
)
for match in response['FaceMatches']:
print (match['Face']['FaceId'],match['Face']['Confidence'])
face = dynamodb.get_item(
TableName='family_collection',
Key={'RekognitionId': {'S': match['Face']['FaceId']}}
)
if 'Item' in face:
print (face['Item']['FullName']['S'])
else:
print ('no match found in person lookup')
с помощью функции сравнения, приведенной выше, вы получите имена лиц на фотографиях, а затем сможете решить, что делать дальше, например, сохранить фотографии с одинаковыми именами в другой папке, переименовав фотографии, что даст фотографии разных людей в разных папках.
Предпосылки:
создать коллекцию rekognition с именем family_collection
aws rekognition create-collection --collection-id family_collection --region eu-west-1
создать таблицу динамодаб с именем family_collection
aws dynamodb create-table --table-name family_collection \
--attribute-definitions AttributeName=RekognitionId,AttributeType=S \
--key-schema AttributeName=RekognitionId,KeyType=HASH \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
--region eu-west-1