| import cv2 |
| import numpy as np |
| import torch |
| from PIL import Image |
| from facenet_pytorch import MTCNN, InceptionResnetV1 |
| import gradio as gr |
| import os |
|
|
| |
| mtcnn = MTCNN(image_size=160, margin=0, min_face_size=20) |
| resnet = InceptionResnetV1(pretrained='vggface2').eval() |
|
|
| reference_image_embedding = None |
|
|
| |
| def preprocess_image(image): |
| image = Image.fromarray(image) |
| image_cropped = mtcnn(image) |
| if image_cropped is not None: |
| image_embedding = resnet(image_cropped.unsqueeze(0)) |
| return image_embedding |
| return None |
|
|
| def set_reference_image(image): |
| global reference_image_embedding |
| if image is not None: |
| reference_image_embedding = preprocess_image(image) |
| if reference_image_embedding is not None: |
| return "Reference image set successfully." |
| else: |
| return "No face detected in the reference image." |
| else: |
| return "Failed to set reference image." |
|
|
| def capture_and_compare(captured_image): |
| if reference_image_embedding is None: |
| return "Please set the reference image first." |
|
|
| captured_image_embedding = preprocess_image(captured_image) |
| if captured_image_embedding is None: |
| return "No face detected in the captured image." |
|
|
| similarity = torch.nn.functional.cosine_similarity(captured_image_embedding, reference_image_embedding) |
| if similarity.item() > 0.6: |
| return "Faces match! Access granted." |
| else: |
| return "Faces do not match. Access denied." |
|
|
| |
| with gr.Blocks() as demo: |
| gr.Markdown("# Face Recognition Lock") |
|
|
| with gr.Row(): |
| with gr.Column(): |
| reference_image_input = gr.Image(label="Upload Reference Image") |
| reference_image_button = gr.Button("Set Reference Image") |
| reference_image_status = gr.Textbox(label="Status") |
|
|
| with gr.Column(): |
| captured_image_input = gr.Image(label="Capture or Upload Image to Compare") |
| compare_faces_button = gr.Button("Compare Faces") |
| compare_faces_status = gr.Textbox(label="Result") |
|
|
| reference_image_button.click(set_reference_image, inputs=[reference_image_input], outputs=[reference_image_status]) |
| compare_faces_button.click(capture_and_compare, inputs=[captured_image_input], outputs=[compare_faces_status]) |
|
|
| |
| demo.launch() |
|
|