File size: 3,474 Bytes
01c9143
 
 
 
 
 
 
896ca03
01c9143
 
a15da10
01c9143
 
 
 
 
 
896ca03
01c9143
 
 
 
 
964e8c0
01c9143
 
964e8c0
a294f5a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
01c9143
 
 
 
896ca03
 
01c9143
 
 
 
 
6b092bc
 
 
e258b52
149f317
18fe3c3
 
87cf104
 
 
 
 
6b092bc
 
01c9143
 
 
 
 
 
c548dde
d08693f
c548dde
01c9143
2c2556c
01c9143
 
 
 
964e8c0
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
import os
import gradio as gr
import requests
import base64
from io import BytesIO
from PIL import Image

count = 0
def image_to_base64(image):
    buffered = BytesIO()
    image.save(buffered, format="JPEG", quality=90)
    return base64.b64encode(buffered.getvalue()).decode('utf-8')

def base64_to_image(base64_str):
    return Image.open(BytesIO(base64.b64decode(base64_str + '=' * (-len(base64_str) % 4))))

def search_face(file):
    global count    
    url = os.environ.get("SERVER_URL")

    try:
        image = Image.open(file)
        image_base64 = image_to_base64(image)
        r = requests.post(url=url, headers={"X-RapidAPI-Key": os.environ.get("API_KEY")}, json={"image": image_base64})
    except:
        raise gr.Error("Please select image file!")

    status_code = r.status_code
    if status_code == 301:
        gr.Info("Too many faces in the photo.")
    elif status_code == 302:
        gr.Info("Face is not clear enough.")
    elif status_code == 303:
        gr.Info("No matches found.")
    elif status_code == 304:
        gr.Info("No face in the photo.")
    elif status_code == 305:
        gr.Info("Search blocked for privacy issue.")
    elif status_code == 401:
        gr.Info("Invalid image format.")
    elif status_code == 402:
        gr.Info("Wrong request.")
    elif status_code == 403:
        gr.Info("Requests all used in your token.")
    elif status_code == 404:
        gr.Info("Timeout, try again.")

    if status_code > 300:
        return [], count   

    try:        
        res = r.json().get('img_array')
        out_array = []
        for item in res:
            out_array.append((base64_to_image(item["image"]), item["url"] + "*********"))
        count += 1            
        return out_array, count
    except:
        raise gr.Error("Try again.")


with gr.Blocks() as demo:
    gr.Markdown(
        """
    # Search Your Face Online For Free
    ## For more detailed information, please check on our website.<br/>
    ## [FaceOnLive: On-premises ID Verification, Biometric Authentication Solution Provider](https://faceonlive.com)    
    <br>
    
    ## Looking to embed this on your website? Use the HTML code below.
    ```html
    <script type="module" src="https://gradio.s3-us-west-2.amazonaws.com/5.5.0/gradio.js"></script>
    <gradio-app src="https://faceonlive-face-search-online.hf.space"></gradio-app>
    ```
    """
    )
    with gr.Row():
        with gr.Column(scale=1):
            image = gr.Image(type='filepath', height=480)
            search_face_button = gr.Button("Search Face")
        with gr.Column(scale=2):
            output = gr.Gallery(label="Found Images", columns=[4], object_fit="contain", height="auto")
            countwg = gr.Number(label="Count")
    
    gr.Examples(['examples/1.jpg', 'examples/2.jpg'], inputs=image, cache_examples=True, cache_mode='lazy', fn=search_face, outputs=[output, countwg])

    search_face_button.click(search_face, inputs=image, outputs=[output, countwg], api_name=False)

    gr.HTML('<a href="https://visitorbadge.io/status?path=https%3A%2F%2Fhuggingface.co%2Fspaces%2FFaceOnLive%2FFace-Search-Online"><img src="https://api.visitorbadge.io/api/combined?path=https%3A%2F%2Fhuggingface.co%2Fspaces%2FFaceOnLive%2FFace-Search-Online&labelColor=%23ff8a65&countColor=%2337d67a&style=flat&labelStyle=upper" /></a>')


demo.queue(api_open=False, default_concurrency_limit=4).launch(server_name="0.0.0.0", server_port=7860, show_api=False)