File size: 4,658 Bytes
c88be80
 
 
 
 
f19a916
4ac0a4f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f19a916
 
 
 
 
 
 
 
c88be80
f19a916
 
 
c88be80
f19a916
c88be80
f19a916
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8878d9b
b791bf5
f19a916
 
 
 
4ac0a4f
f19a916
 
 
4ac0a4f
f19a916
 
 
 
 
5b451b0
b791bf5
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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 = ('<img src="data:image/png;base64,{base64_image}" style="width: 100px; height: auto; object-fit: contain;"/>').format(base64_image=pil_image_to_base64(face_image1, format="PNG"))

            face_image2 = face_crop(image2, faces2[face2_idx])
            face_value2 = ('<img src="data:image/png;base64,{base64_image}" style="width: 100px; height: auto; object-fit: contain;"/>').format(base64_image=pil_image_to_base64(face_image2, format="PNG"))

            match_icon = '<svg fill="red" width="19" height="32" viewBox="0 0 19 32"><path d="M0 13.92V10.2H19V13.92H0ZM0 21.64V17.92H19V21.64H0Z"></path><path d="M14.08 0H18.08L5.08 32H1.08L14.08 0Z"></path></svg>'
            if score > 0.7:
                match_icon = '<svg fill="green" width="19" height="32" viewBox="0 0 19 32"><path d="M0 13.9202V10.2002H19V13.9202H0ZM0 21.6402V17.9202H19V21.6402H0Z"></path></svg>'

            item_value = ('<div style="align-items: center; gap: 10px; display: flex; flex-direction: column;">'
                            '<div style="display: flex; align-items: center; gap: 20px;">'
                            '{face_value1}'
                            '{match_icon}'
                            '{face_value2}'
                            '</div>'
                            '<div style="text-align: center; margin-top: 10px;">'
                            'Score: {score}'
                            '</div>'
                            '</div>'
            ).format(face_value1=face_value1, face_value2=face_value2, match_icon=match_icon, score=f"{score:.2f}")
            html += item_value
            html += '<hr style="border: 1px solid #C0C0C0; margin: 10px 0;"/>'

        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], outputs=recog_html_output)

demo.launch(server_name="0.0.0.0", server_port=7860)