在相似性基础上对图像进行分类

在相似性基础上对图像进行分类

问题描述:

我有30张40张人类照片,我想用Python代码获取。并制作一组类似的照片。像5张约翰和10张彼得。喜欢这个 。我是图像处理的新手。所以我的问题是哪个算法最适合这个。我想在AWS lambda函数上执行此操作。任何帮助都将受到高度赞赏。

I have 30 ,40 pictures of humans , Which I want to get in Python code . And make group of similar pics . Like 5 pic of john and 10 of peter . like this . I am new in Image processing thing. So my question is which algo is best for this . And I want to do this on AWS lambda function . Any help would be highly appreciated.

PS(这是我在这个领域的第一个任务。请忽略错误告诉我改进它们谢谢)

P.S (Its my first ever task in this field. Kindly ignore mistakes of tell me to improve them Thanks)

我建议你用AWS Rekognition来做这件事。这很简单。
您可以通过3个简单步骤实现您想要的目标:

I would suggest you to do the thing with AWS Rekognition. It's pretty simple. You can achieve what you want in 3 simple steps:

1。使用元数据上传图片表示您要将名称为strong> s3 的人员上传图像以存储他们的信息以供日后参考

1. Uploading images with metadata: means you are uploading images of person with their names to s3 to store their info to be referenced later

2。照片索引 这意味着向面孔添加信息标记,此信息存储在dynamodb中,这是通过 index_faces api完成的

2. Indexing of photos : this means adding info tags to faces , this info is stored in dynamodb and this is done with index_faces api

3。比较具有索引面的照片这将通过重新识别来实现 search_faces_by_image api

3. Comparision of photos with indexed faces : this will be achieved with 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部分代码:比较

Now part 3 code : Compare

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')

使用上面的比较功能,您将获得照片中的面部名称,然后您可以决定下一步要做什么,例如通过重命名照片将具有相同名称的照片存储到不同的文件夹,这将给出不同人物的照片文件夹

with above compare function you will get the names of faces in photos , then you can decide what you want to do next, like storing photos with same names to a different folder by renaming the photos, this will give photos of different people in different folders

先决条件:

Prerequisites:

创建重新认知名为 family_collection 的集合

create a rekognition collection named 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