File size: 4,957 Bytes
c88be80
 
 
07f61a7
 
 
c88be80
 
f19a916
4ac0a4f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f19a916
 
 
 
 
 
 
8da3e7b
 
 
 
 
 
b2c192d
8da3e7b
b2c192d
 
c88be80
b2c192d
8da3e7b
b2c192d
 
f19a916
8da3e7b
 
 
3fe116d
831cf0c
 
3b0ca05
 
 
3fe116d
c852adf
 
 
07f61a7
918690a
85c4c94
 
 
c852adf
85c4c94
 
 
 
c852adf
e8e96f0
 
c852adf
e8e96f0
 
c852adf
e8e96f0
 
 
c852adf
85c4c94
e8e96f0
 
 
 
 
85c4c94
 
 
 
e8e96f0
660b4ca
647160b
85c4c94
c852adf
 
 
 
831cf0c
1d8e88d
 
f19a916
8878d9b
b791bf5
f19a916
 
 
db99fd4
4ac0a4f
f19a916
 
db99fd4
4ac0a4f
f19a916
db99fd4
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import gradio as gr
import requests
import datadog_api_client
import json
import io

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(frame1, frame2):
    url = "http://127.0.0.1:8080/compare_face"
    files = {'file1': open(frame1, 'rb'), 'file2': open(frame2, 'rb')}

    file1 = None
    file2 = None
    try:
        file1 = open(frame1, 'rb')
    except:
        return "Failed to open image1"

    try:
        file2 = open(frame2, 'rb')
    except:
        return "Failed to open image2"
    
    url = "http://127.0.0.1:8080/compare_face"
    files = {'file1': file1, 'file2': file2}
    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")
        
        try:
            image1 = Image.open(frame1)
            image2 = Image.open(frame2)

            html = ""
            faces1 = json_result.get("faces1", {})           
            faces2 = json_result.get("faces2", {})
            results = json_result.get("results", {})
    
            for result in results:
                similarity = result.get('similarity')
                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 similarity > 0.67:
                    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;">'
                                'Similarity: {similarity}'
                                '</div>'
                                '</div>'
                ).format(face_value1=face_value1, face_value2=face_value2, match_icon=match_icon, similarity=f"{similarity:.2f}")

                html += item_value
                html += '<hr style="border: 1px solid #C0C0C0; margin: 10px 0;"/>'
    
            return html
        except:
            return "abcdeefddddd"
    else:
        return "abcdeef"
        # 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='filepath')
                    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='filepath')
                    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("Compare Face")
        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)