import gradio as gr import requests import datadog_api_client from PIL import Image def face_crop(image, face_rect): x1 = face_rect.get('x1') y1 = face_rect.get('y1') x2 = face_rect.get('x2') y2 = face_rect.get('y2') width = x2 - x1 + 1 height = y2 - y2 + 1 if x1 < 0: x1 = 0 if y1 < 0: y1 = 0 if x2 >= image.width: x2 = image.width - 1 if y2 >= image.height: y2 = image.height - 1 face_image = image.crop((x1, y1, x2, y2)) face_image_ratio = face_image.width / float(face_image.height) resized_w = int(face_image_ratio * 150) resized_h = 150 face_image = face_image.resize((int(resized_w), int(resized_h))) return face_image def compare_face(image1, image2): try: img_bytes1 = io.BytesIO() image1.save(img_bytes1, format="JPEG") img_bytes1.seek(0) except: return ["Failed to open image1", {"resultCode": "Failed to open image1"}] try: img_bytes2 = io.BytesIO() image2.save(img_bytes2, format="JPEG") img_bytes2.seek(0) except: return ["Failed to open image2", {"resultCode": "Failed to open image2"}] url = "http://127.0.0.1:8080/compare_face" files = {'image1': img_bytes1, 'image2': img_bytes2} result = requests.post(url=url, files=files) if result.ok: json_result = result.json() if json_result.get("resultCode") != "Ok": return [json_result.get("resultCode"), json_result] html = "" faces1 = json_result.get("faces1", {}) faces2 = json_result.get("faces2", {}) results = json_result.get("results", {}) for result in results: score = result.get('score') face1_idx = result.get('face1') face2_idx = result.get('face2') face_image1 = face_crop(image1, faces1[face1_idx]) face_value1 = ('').format(base64_image=pil_image_to_base64(face_image1, format="PNG")) face_image2 = face_crop(image2, faces2[face2_idx]) face_value2 = ('').format(base64_image=pil_image_to_base64(face_image2, format="PNG")) match_icon = '' if score > 0.7: match_icon = '' item_value = ('
' '
' '{face_value1}' '{match_icon}' '{face_value2}' '
' '
' 'Score: {score}' '
' '
' ).format(face_value1=face_value1, face_value2=face_value2, match_icon=match_icon, score=f"{score:.2f}") html += item_value html += '
' return html else: return result.text with gr.Blocks(css=".gradio-container {background-color: #F4E5E0}") as demo: with gr.Row(): with gr.Column(scale=7): with gr.Row(): with gr.Column(): image_input1 = gr.Image(type='pil') gr.Examples(['face_examples/1.jpg', 'face_examples/3.jpg', 'face_examples/7.jpg', 'face_examples/9.jpg'], inputs=image_input1) with gr.Column(): image_input2 = gr.Image(type='pil') gr.Examples(['face_examples/2.jpg', 'face_examples/4.jpg', 'face_examples/8.jpg', 'face_examples/10.jpg'], inputs=image_input2) face_recog_button = gr.Button("Face Recognition") with gr.Column(scale=3): recog_html_output = gr.HTML() face_recog_button.click(compare_face, inputs=[image_input1, image_input2, verifyThreshold], outputs=recog_html_output) demo.launch(server_name="0.0.0.0", server_port=7860)