| import gradio as gr |
| import os |
| import requests |
|
|
| from PIL import Image |
|
|
| def face_compare(frame1, frame2): |
| url = "https://face.miniai.live/api/face_match" |
| files = {'image1': open(frame1, 'rb'), 'image2': open(frame2, 'rb')} |
| r = requests.post(url=url, files=files) |
| response = r.json() |
|
|
| detections = response.get("detections", []) |
| matches = response.get("match", []) |
| detection_rows = "" |
| match_rows = "" |
|
|
| |
| for detection in detections: |
| face_image = detection.get("face", "") |
| face_img_tag = f"<img src='data:image/png;base64,{face_image}' width='100' />" if face_image else "N/A" |
| first_face_index = detection.get("firstFaceIndex", "N/A") |
| second_face_index = detection.get("secondFaceIndex", "N/A") |
|
|
| detection_rows += f""" |
| <tr> |
| <td>{first_face_index}</td> |
| <td>{second_face_index}</td> |
| <td>{face_img_tag}</td> |
| </tr> |
| """ |
|
|
| |
| for match in matches: |
| first_face_index = match.get("firstFaceIndex", "N/A") |
| second_face_index = match.get("secondFaceIndex", "N/A") |
| similarity = match.get("similarity", "N/A") |
|
|
| match_rows += f""" |
| <tr> |
| <td>{first_face_index}</td> |
| <td>{second_face_index}</td> |
| <td>{similarity:.6f}</td> |
| </tr> |
| """ |
|
|
| |
| detections_table = f""" |
| <h3>Face Detection</h3> |
| <table border="1" style="border-collapse: collapse; width: 100%;"> |
| <tr> |
| <th>First Face Index</th> |
| <th>Second Face Index</th> |
| <th>Face Image</th> |
| </tr> |
| {detection_rows} |
| </table> |
| """ |
|
|
| matches_table = f""" |
| <h3>Matching Results</h3> |
| <table border="1" style="border-collapse: collapse; width: 100%;"> |
| <tr> |
| <th>First Face Index</th> |
| <th>Second Face Index</th> |
| <th>Similarity</th> |
| </tr> |
| {match_rows} |
| </table> |
| """ |
|
|
| return detections_table + matches_table |
|
|
| def check_liveness(frame): |
| url = "https://facelive.miniai.live/api/check_liveness" |
| files = {'image': open(frame, 'rb')} |
| r = requests.post(url=url, files=files) |
|
|
| html = None |
| table_value = "" |
|
|
| for key, value in r.json().items(): |
| row_value = ("<tr>" |
| "<td>{key}</td>" |
| "<td>{value}</td>" |
| "</tr>".format(key=key, value=value)) |
| table_value = table_value + row_value |
|
|
| html = ("<table>" |
| "<tr>" |
| "<th style=""width:30%"">Field</th>" |
| "<th style=""width:50%"">Value</th>" |
| "</tr>" |
| "{table_value}" |
| "</table>".format(table_value=table_value)) |
| |
| return html |
|
|
| |
| with gr.Blocks() as MiniAIdemo: |
| gr.Markdown( |
| """ |
| <a href="https://miniai.live" style="display: flex; align-items: center;"> |
| <img src="https://miniai.live/wp-content/uploads/2024/02/logo_name-1-768x426-1.png" style="width: 18%; margin-right: 15px;"/> |
| <div> |
| <p style="font-size: 40px; font-weight: bold; margin-right: 20px;">FaceRecognition-LivenessDetection SDK Demo</p> |
| <p style="font-size: 20px; margin-right: 0;">Experience our NIST FRVT Top Ranked FaceRecognition, iBeta 2 Certified Face Liveness Detection Engine</p> |
| </div> |
| </a> |
| <br/> |
| <div style="display: flex; justify-content: center; align-items: center;"> |
| <table style="text-align: center;"> |
| <tr> |
| <td style="text-align: center; vertical-align: middle;"><a href="https://github.com/MiniAiLive"><img src="https://miniai.live/wp-content/uploads/2024/10/new_git-1-300x67.png" style="height: 50px; margin-right: 5px;" title="GITHUB"/></a></td> |
| <td style="text-align: center; vertical-align: middle;"><a href="https://huggingface.co/MiniAiLive"><img src="https://miniai.live/wp-content/uploads/2024/10/new_hugging-1-300x67.png" style="height: 50px; margin-right: 5px;" title="HuggingFace"/></a></td> |
| <td style="text-align: center; vertical-align: middle;"><a href="https://demo.miniai.live"><img src="https://miniai.live/wp-content/uploads/2024/10/new_gradio-300x67.png" style="height: 50px; margin-right: 5px;" title="Gradio"/></a></td> |
| </tr> |
| <tr> |
| <td style="text-align: center; vertical-align: middle;"><a href="https://docs.miniai.live/"><img src="https://miniai.live/wp-content/uploads/2024/10/a-300x70.png" style="height: 50px; margin-right: 5px;" title="Documentation"/></a></td> |
| <td style="text-align: center; vertical-align: middle;"><a href="https://www.youtube.com/@miniailive"><img src="https://miniai.live/wp-content/uploads/2024/10/Untitled-1-300x70.png" style="height: 50px; margin-right: 5px;" title="Youtube"/></a></td> |
| <td style="text-align: center; vertical-align: middle;"><a href="https://play.google.com/store/apps/dev?id=5831076207730531667"><img src="https://miniai.live/wp-content/uploads/2024/10/googleplay-300x62.png" style="height: 50px; margin-right: 5px;" title="Google Play"/></a></td> |
| </tr> |
| </table> |
| </div> |
| <br/> |
| """ |
| ) |
| with gr.Tabs(): |
| with gr.Tab("Face Recognition"): |
| with gr.Row(): |
| with gr.Column(): |
| im_match_in1 = gr.Image(type='filepath', height=300) |
| gr.Examples( |
| [ |
| "images/compare/demo-pic22.jpg", |
| "images/compare/demo-pic60.jpg", |
| "images/compare/demo-pic35.jpg", |
| "images/compare/demo-pic33.jpg", |
| "images/compare/demo-pic34.jpg", |
| ], |
| inputs=im_match_in1 |
| ) |
| with gr.Column(): |
| im_match_in2 = gr.Image(type='filepath', height=300) |
| gr.Examples( |
| [ |
| "images/compare/demo-pic41.jpg", |
| "images/compare/demo-pic32.jpg", |
| "images/compare/demo-pic39.jpg", |
| "images/compare/demo-pic61.jpg", |
| "images/compare/demo-pic40.jpg", |
| ], |
| inputs=im_match_in2 |
| ) |
| with gr.Column(): |
| txt_compare_out = gr.HTML() |
| btn_f_match = gr.Button("Check Comparing!", variant='primary') |
| btn_f_match.click(face_compare, inputs=[im_match_in1, im_match_in2], outputs=txt_compare_out) |
| with gr.Tab("Face Liveness Detection"): |
| with gr.Row(): |
| with gr.Column(): |
| im_liveness_in = gr.Image(type='filepath', height=300) |
| gr.Examples( |
| [ |
| "images/liveness/f_real_andr.jpg", |
| "images/liveness/f_fake_andr_mask3d.jpg", |
| "images/liveness/f_fake_andr_monitor.jpg", |
| "images/liveness/f_fake_andr_outline.jpg", |
| "images/liveness/f_fake_andr_outline3d.jpg", |
| "images/liveness/1.jpg", |
| "images/liveness/3.png", |
| "images/liveness/4.jpg", |
| ], |
| inputs=im_liveness_in |
| ) |
| btn_f_liveness = gr.Button("Check Liveness!", variant='primary') |
| with gr.Column(): |
| livness_result_output = gr.HTML() |
| btn_f_liveness.click(check_liveness, inputs=im_liveness_in, outputs=livness_result_output) |
| gr.HTML('<a href="https://visitorbadge.io/status?path=https%3A%2F%2Fhuggingface.co%2Fspaces%2FMiniAiLive%2FFaceRecognition-LivenessDetection-Demo"><img src="https://api.visitorbadge.io/api/combined?path=https%3A%2F%2Fhuggingface.co%2Fspaces%2FMiniAiLive%2FFaceRecognition-LivenessDetection-Demo&label=VISITORS&labelColor=%2337d67a&countColor=%23ff8a65&style=plastic&labelStyle=none" /></a>') |
| if __name__ == "__main__": |
| MiniAIdemo.launch() |