Spaces:
Running
Running
File size: 4,047 Bytes
5ba9330 |
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 sqlite3
import re
import bcrypt
import numpy as np
import cv2
from PIL import Image
import tensorflow as tf
import os
import warnings
# Suppress all warnings
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
warnings.filterwarnings("ignore")
np.seterr(all='ignore')
# Load model
deepfake_model = tf.keras.models.load_model("model_15_64.h5")
# Setup SQLite instead of MySQL
conn = sqlite3.connect("users.db", check_same_thread=False)
cursor = conn.cursor()
# Create user_details table in SQLite
cursor.execute('''
CREATE TABLE IF NOT EXISTS user_details (
id INTEGER PRIMARY KEY AUTOINCREMENT,
NAME TEXT,
PHONE TEXT,
EMAIL TEXT UNIQUE,
GENDER TEXT,
PASSWORD TEXT
)
''')
conn.commit()
# Validation utilities
def is_valid_email(email):
return re.match(r"[^@]+@[^@]+\.[^@]+", email)
def is_valid_phone(phone):
return re.match(r"^[0-9]{10}$", phone)
def preprocess_image(image):
image = np.array(image)
image = cv2.resize(image, (128, 128))
image = image.astype(np.float32) / 255.0
return np.expand_dims(image, axis=0)
def predict_image(image):
preprocessed = preprocess_image(image)
prediction = deepfake_model.predict(preprocessed)[0][0]
return "β
Real Image" if prediction >= 0.5 else "β οΈ Fake Image"
# Register user
def register_user(name, phone, email, password):
if not is_valid_email(email):
return "β Invalid email", False
if not is_valid_phone(phone):
return "β Phone must be 10 digits", False
cursor.execute("SELECT * FROM user_details WHERE EMAIL = ?", (email,))
if cursor.fetchone():
return "β οΈ Email already registered", False
hashed_pw = bcrypt.hashpw(password.encode(), bcrypt.gensalt())
cursor.execute("INSERT INTO user_details (NAME, PHONE, EMAIL, GENDER, PASSWORD) VALUES (?, ?, ?, ?, ?)",
(name, phone, email, "U", hashed_pw))
conn.commit()
return "β
Registration successful! Please log in.", True
# Login user
def login_user(email, password):
cursor.execute("SELECT PASSWORD FROM user_details WHERE EMAIL = ?", (email,))
result = cursor.fetchone()
if result and bcrypt.checkpw(password.encode(), result[0].encode() if isinstance(result[0], str) else result[0]):
return "β
Login successful!", True
return "β Invalid credentials", False
# App layout
with gr.Blocks() as demo:
session = gr.State({})
show_login = gr.State(True)
status = gr.Textbox(label="", interactive=False)
with gr.Column(visible=True) as login_panel:
gr.Markdown("### Login or Sign Up")
name = gr.Textbox(label="Name (Sign Up Only)")
phone = gr.Textbox(label="Phone (Sign Up Only)")
email = gr.Textbox(label="Email")
password = gr.Textbox(label="Password", type="password")
login_btn = gr.Button("Login")
signup_btn = gr.Button("Sign Up")
with gr.Column(visible=False) as prediction_panel:
gr.Markdown("## Upload Image for Deepfake Detection")
image_input = gr.Image(type="pil")
result = gr.Textbox(label="Result")
predict_btn = gr.Button("Predict")
logout_btn = gr.Button("Logout")
# Logic
def handle_login(e, p):
msg, ok = login_user(e, p)
return msg, gr.update(visible=not ok), gr.update(visible=ok)
def handle_signup(n, ph, e, p):
msg, ok = register_user(n, ph, e, p)
return msg
def handle_logout():
return {}, gr.update(visible=True), gr.update(visible=False)
login_btn.click(handle_login, [email, password], [status, login_panel, prediction_panel])
signup_btn.click(handle_signup, [name, phone, email, password], status)
predict_btn.click(predict_image, inputs=image_input, outputs=result)
logout_btn.click(handle_logout, outputs=[session, login_panel, prediction_panel])
# Launch
if __name__ == "__main__":
demo.launch()
|