import os import gradio as gr from services.aws_service import AwsService from dotenv import load_dotenv import cv2 import face_recognition import numpy as np load_dotenv() def find_face_encodings(image): face_enc = face_recognition.face_encodings(image) return face_enc[0] def face_similarity(img1, img2, compare_image_folder=""): image_1 = find_face_encodings(img1) image_2 = find_face_encodings(img2) # checking both images are same is_same = face_recognition.compare_faces([image_1], image_2)[0] accuracy = 0 if is_same: # finding the distance level between images distance = face_recognition.face_distance([image_1], image_2) distance = round(distance[0] * 100) # calcuating accuracy level between images accuracy = 100 - round(distance) return {"is_same": "true" if is_same else "false", "accuracy": accuracy, "error": "false", "compare_image": compare_image_folder} def convert_pil_to_open_cv(pil_image): open_cv_image = np.array(pil_image) open_cv_image = open_cv_image[:, :, ::-1].copy() return open_cv_image def check_image_similarity(main_image_folder, compare_image_folder): main_image = AwsService.get_image_from_s3(os.environ.get('AWS_S3_BUCKET'), main_image_folder) compare_image = AwsService.get_image_from_s3(os.environ.get('AWS_S3_BUCKET'), compare_image_folder) result = False try: result = face_similarity(convert_pil_to_open_cv(main_image["pil"]), convert_pil_to_open_cv(compare_image["pil"]), compare_image_folder) except Exception as e: print("Error on execution: ", e) finally: if not result: result = {"is_same": "false", "accuracy": 0, "error": "true", "compare_image": compare_image_folder} return result def compare_photoshoot_crops(photo_shoot_id, main_image_folder, compare_image_folder): if compare_image_folder == "": folder = "PhotoShoots/" + str(photo_shoot_id) + "/Croppeds" files = AwsService.get_files_from_s3(os.environ.get('AWS_S3_BUCKET'), folder) results = [] for file in files: if main_image_folder != file['Key']: result = check_image_similarity(main_image_folder, file['Key']) results.append(result) return results else: return check_image_similarity(main_image_folder, compare_image_folder) iface = gr.Interface( fn=compare_photoshoot_crops, inputs=[ gr.Textbox(lines=1, placeholder="Photo Shoot ID"), gr.Textbox(lines=1, placeholder="Main Image Key"), gr.Textbox(lines=1, placeholder="Compare Image Key") ], outputs="text" ) iface.launch()