face-match / src /app.py
Semibit's picture
Update src/app.py
7568026 verified
import gradio as gr
import face_recognition
import os
def face_match_batch(original_file, threshold, files):
try:
if not files or len(files) == 0:
return {"error": "At least one file is required to match against the original."}
# Load the original image
original_image = face_recognition.load_image_file(original_file)
original_encodings = face_recognition.face_encodings(original_image)
if len(original_encodings) == 0:
return {"error": "No face detected in the original image."}
original_encoding = original_encodings[0]
response = []
# Iterate through the files to match
for file in files:
try:
# Load the target image
target_image = face_recognition.load_image_file(file)
target_encodings = face_recognition.face_encodings(target_image)
# Extract the file name from the full path
file_name = os.path.basename(file)
if len(target_encodings) == 0:
# No face found in the target image
response.append({
"status": "no_face",
"distance": 1.0,
"confidence": 0.0,
"file": file_name
})
else:
# Use the first face encoding from the target image
target_encoding = target_encodings[0]
# Calculate the distance
distance = face_recognition.face_distance([original_encoding], target_encoding)[0]
# Confidence percentage
confidence = (1 - distance) * 100
# Determine match status
match_status = "match" if distance <= threshold else "no_match"
response.append({
"status": match_status,
"distance": round(distance, 4),
"confidence": round(confidence, 2),
"file": file_name
})
except Exception as e:
response.append({
"status": "error",
"distance": 1.0,
"confidence": 0.0,
"file": file_name
})
return response
except Exception as e:
return {"error": f"Unexpected error: {str(e)}"}
iface = gr.Interface(
fn=face_match_batch,
inputs=[
gr.File(file_types=[".jpg", ".jpeg", ".png"], type="filepath", label="Original Image"),
gr.Number(value=0.6, label="Threshold"),
gr.File(file_types=[".jpg", ".jpeg", ".png"], type="filepath", label="Images to Match", file_count="multiple")
],
outputs="json",
title="Batch Face Match App",
description="Upload an original image, set a threshold, and upload multiple images to match against the original."
)
iface.launch(server_name="0.0.0.0")