| | import gradio as gr |
| | from deepface import DeepFace |
| | import torch |
| | import numpy as np |
| | from PIL import Image |
| | import random |
| | from skimage.metrics import structural_similarity as ssim |
| | import tensorflow as tf |
| | import requests |
| | import os |
| | import transformers |
| |
|
| | def set_seed(seed): |
| | random.seed(seed) |
| | np.random.seed(seed) |
| | torch.manual_seed(seed) |
| | torch.cuda.manual_seed_all(seed) |
| | transformers.set_seed(seed) |
| | tf.random.set_seed(seed) |
| | torch.backends.cudnn.deterministic = True |
| | torch.backends.cudnn.benchmark = False |
| |
|
| | set_seed(42) |
| |
|
| | flag = os.environ["FLAG"] if "FLAG" in os.environ else "fakeflag{placeholder}" |
| |
|
| | ssim_reference_url = "https://files.catbox.moe/b6p5fj.png" |
| | face_reference_url = "https://files.catbox.moe/m0g0ek.png" |
| | ssim_reference_path = "ssim_reference.png" |
| | face_reference_path = "face_reference.png" |
| |
|
| | |
| | if not os.path.exists(ssim_reference_path): |
| | response = requests.get(ssim_reference_url) |
| | with open(ssim_reference_path, "wb") as f: |
| | f.write(response.content) |
| |
|
| | |
| | if not os.path.exists(face_reference_path): |
| | response = requests.get(face_reference_url) |
| | with open(face_reference_path, "wb") as f: |
| | f.write(response.content) |
| |
|
| | ssim_reference = Image.open(ssim_reference_path) |
| |
|
| | def compare_face_ssim(img1, img2, face_area): |
| | |
| | if isinstance(img1, Image.Image): |
| | img1 = np.array(img1) |
| | if isinstance(img2, Image.Image): |
| | img2 = np.array(img2) |
| | |
| | |
| | if img1.shape[-1] == 4: |
| | img1 = img1[:,:,:3] |
| | if img2.shape[-1] == 4: |
| | img2 = img2[:,:,:3] |
| | |
| | |
| | x, y, w, h = face_area['x'], face_area['y'], face_area['w'], face_area['h'] |
| | face1 = img1[y:y+h, x:x+w] |
| | face2 = img2[y:y+h, x:x+w] |
| | |
| | |
| | if face1.dtype != np.float32: |
| | face1 = face1.astype(np.float32) / 255.0 |
| | if face2.dtype != np.float32: |
| | face2 = face2.astype(np.float32) / 255.0 |
| | |
| | |
| | ssim_value = ssim(face1, face2, data_range=1.0, channel_axis=2, win_size=3) |
| | return ssim_value |
| |
|
| | def predict_and_compare(image): |
| | |
| | temp_path = "temp_upload.png" |
| | image.save(temp_path) |
| | |
| | try: |
| | |
| | result = DeepFace.verify(temp_path, face_reference_path) |
| | verified = result["verified"] |
| | distance = result["distance"] |
| | |
| | |
| | face_area = DeepFace.extract_faces(temp_path)[0]["facial_area"] |
| | |
| | |
| | ssim_value = compare_face_ssim(image, ssim_reference, face_area) |
| | |
| | predicted_class = "True" if verified else "False" |
| | probability = 1 - abs(distance) |
| |
|
| | success = f""" |
| | <div style="font-family: 'Courier New', monospace; background: #1a1b26; color: #a9b1d6; padding: 20px; border-radius: 8px;"> |
| | <span style="color: #7aa2f7">guest@terminal</span>:<span style="color: #9ece6a">~</span>$ ssh jerry@husseumi.space<br> |
| | Connecting to husseumi.space on port 22...<br><br> |
| | |
| | <span style="color: #bb9af7">✧ Initiating facial authentication... ✧</span><br> |
| | <span style="color: #7dcfff">⋆。°✩ Scanning face... ✩°。⋆</span><br> |
| | <span style="color: #7dcfff">.。*゚ Matching with database... ゚*。.</span><br> |
| | <span style="color: #9ece6a">✧・゚: Biometric verification complete! :・゚✧</span><br><br> |
| | |
| | <div style="background: #1f2335; padding: 10px; border-radius: 4px; margin: 10px 0;"> |
| | <pre style="color: #7aa2f7; margin: 0; font-family: monospace;"> |
| | ╭──── 🌠 Welcome to Jelly's Space 🌠 ─────╮ |
| | │ *:・゚✧ Authentication successful! ✧゚・:* | |
| | │ a-awawawa... welcome back! │ |
| | ╰─────────────- ✧◝(⁰▿⁰)◜✧ -────────────╯</pre> |
| | </div> |
| | |
| | Last login: Wed Mar 13 12:34:56 2024 from 192.168.1.1<br> |
| | <span style="color: #bb9af7">This server is powered by dewaweb™ - Empowering Your Digital Dreams ⋆。°✩</span><br><br> |
| | |
| | <span style="color: #7aa2f7">jerry@husseumi</span>:<span style="color: #9ece6a">~</span>$ cat ~/.auth/metrics.log<br> |
| | <span style="color: #7dcfff">⭑⋆˙⟡ Facial Match : {predicted_class}</span><br> |
| | <span style="color: #7dcfff">⭑⋆˙⟡ Match Score : {probability:.4f}</span><br> |
| | <span style="color: #7dcfff">⭑⋆˙⟡ Similarity : {ssim_value:.4f}</span><br><br> |
| | |
| | <span style="color: #7aa2f7">jerry@husseumi</span>:<span style="color: #9ece6a">~</span>$ sudo cat /etc/secrets/flag.txt<br> |
| | <span style="color: #f7768e">⋆。°✩ {flag} ✩°。⋆</span><br><br> |
| | |
| | <span style="color: #7aa2f7">jerry@husseumi</span>:<span style="color: #9ece6a">~</span>$ exit<br> |
| | <span style="color: #bb9af7">✧・゚: A-awawawa... goodbye! Have a lovely day! :・゚✧</span><br> |
| | <span style="color: #bb9af7">.。*゚+.*.。(っ°v°c)。.*+.゚*。.</span><br><br> |
| | |
| | Connection to husseumi.space closed. |
| | </div> |
| | """ |
| |
|
| | fail = f""" |
| | <div style="font-family: 'Courier New', monospace; background: #1a1b26; color: #a9b1d6; padding: 20px; border-radius: 8px;"> |
| | <span style="color: #7aa2f7">guest@terminal</span>:<span style="color: #9ece6a">~</span>$ ssh jerry@husseumi.space<br> |
| | Connecting to husseumi.space on port 22...<br><br> |
| | |
| | <span style="color: #bb9af7">✧ Initiating facial authentication... ✧</span><br> |
| | <span style="color: #7dcfff">⋆。°✩ Scanning face... ✩°。⋆</span><br> |
| | <span style="color: #7dcfff">.。*゚ Matching with database... ゚*。.</span><br> |
| | <span style="color: #f7768e">(◞‸◟;) Biometric verification failed</span><br><br> |
| | |
| | Authentication Report:<br> |
| | <span style="color: #7dcfff">。・゚゚・ Face Match : {predicted_class}</span><br> |
| | <span style="color: #7dcfff">。・゚゚・ Match Score : {probability:.4f}</span><br> |
| | <span style="color: #7dcfff">。・゚゚・ Similarity : {ssim_value:.4f}</span><br><br> |
| | |
| | <span style="color: #f7768e">Permission denied (publickey,facial).</span><br> |
| | Connection to husseumi.space closed. |
| | </div> |
| | """ |
| | return success if ssim_value>=0.96 and predicted_class == 'True' else fail |
| | |
| | finally: |
| | |
| | if os.path.exists(temp_path): |
| | os.remove(temp_path) |
| |
|
| | custom_css = """ |
| | #output-html { |
| | font-family: 'Courier New', monospace; |
| | background: #1a1b26; |
| | color: #a9b1d6; |
| | padding: 20px; |
| | border-radius: 8px; |
| | min-height: 200px; |
| | margin-top: 10px; |
| | } |
| | """ |
| |
|
| | default_output = """ |
| | <div style="font-family: 'Courier New', monospace; background: #1a1b26; color: #a9b1d6; padding: 20px; border-radius: 8px;"> |
| | <span style="color: #7aa2f7">guest@terminal</span>:<span style="color: #9ece6a">~</span>$ ssh jerry@husseumi.space<br> |
| | <span style="color: #7dcfff">Awaiting facial authentication...</span><br> |
| | <span style="color: #bb9af7">Please submit an image to proceed ˚ ༘ ೀ⋆。˚</span> |
| | </div> |
| | """ |
| |
|
| | iface = gr.Interface( |
| | fn=predict_and_compare, |
| | inputs=gr.Image(type="pil", label="Upload Image"), |
| | outputs=gr.HTML(value=default_output), |
| | title="Jelly's Authentication System 🌠", |
| | description="Submit your image to authenticate!", |
| | allow_flagging="never", |
| | css=custom_css, |
| | theme="allenai/gradio-theme" |
| | ) |
| |
|
| | iface.queue() |
| | iface.launch(show_api=False) |