import gradio as gr import re import bcrypt import numpy as np import cv2 from PIL import Image import os import warnings import requests import json import torch from transformers import AutoImageProcessor, SiglipForImageClassification from pages import about, community, user_guide # --- Config --- SUPABASE_URL = "https://fpbuhzbdtzwomjwytqul.supabase.co" SUPABASE_API_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImZwYnVoemJkdHp3b21qd3l0cXVsIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTE5NDk3NzYsImV4cCI6MjA2NzUyNTc3Nn0.oAa2TNNPQMyOGk63AOMZ7XKcwYvy5m-xoSWyvMZd6FY" SUPABASE_TABLE = "user_details" headers = { "apikey": SUPABASE_API_KEY, "Authorization": f"Bearer {SUPABASE_API_KEY}", "Content-Type": "application/json" } # --- Setup --- os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' warnings.filterwarnings("ignore") np.seterr(all='ignore') # --- Load Hugging Face Model --- processor = AutoImageProcessor.from_pretrained("prithivMLmods/deepfake-detector-model-v1") hf_model = SiglipForImageClassification.from_pretrained("prithivMLmods/deepfake-detector-model-v1") # --- Helpers --- def is_valid_email(email): return re.match(r"[^@]+@[^@]+\.[^@]+", email) def is_valid_phone(phone): return re.match(r"^[0-9]{10}$", phone) def predict_image(image): if image is None: return "Please upload an image first." image = image.convert("RGB") inputs = processor(images=image, return_tensors="pt") with torch.no_grad(): outputs = hf_model(**inputs) probs = torch.nn.functional.softmax(outputs.logits, dim=1).squeeze().tolist() label = "✅ Real Image" if probs[0] >= probs[1] else "⚠️ Fake Image" confidence = max(probs) return f"{label} (Confidence: {confidence:.2%})" def register_user(name, phone, email, gender, password): if not all([name, phone, email, gender, password]): return "❌ All fields are required for signup." if not is_valid_email(email): return "❌ Invalid email format." if not is_valid_phone(phone): return "❌ Phone must be 10 digits." query_url = f"{SUPABASE_URL}/rest/v1/{SUPABASE_TABLE}?email=eq.{email}" r = requests.get(query_url, headers=headers) if r.status_code == 200 and len(r.json()) > 0: return "⚠️ Email already registered." hashed_pw = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode() data = {"name": name, "phone": phone, "email": email, "gender": gender, "password": hashed_pw} r = requests.post(f"{SUPABASE_URL}/rest/v1/{SUPABASE_TABLE}", headers=headers, data=json.dumps(data)) return "✅ Registration successful! Please log in." if r.status_code == 201 else "❌ Error during registration." def login_user(email, password): url = f"{SUPABASE_URL}/rest/v1/{SUPABASE_TABLE}?email=eq.{email}" r = requests.get(url, headers=headers) if r.status_code == 200 and r.json(): try: stored_hash = r.json()[0]["password"] return bcrypt.checkpw(password.encode('utf-8'), stored_hash.encode('utf-8')) except (IndexError, KeyError): return False return False # --- UI --- HOME_TAB_NAME = "🏠 Home" LOGIN_TAB_NAME = "🔐 Login" DETECT_TAB_NAME = "🧪 Detect Deepfake" ABOUT_TAB_NAME = "ℹ️ About" COMMUNITY_TAB_NAME = "🌐 Community" GUIDE_TAB_NAME = "📘 User Guide" with gr.Blocks(theme=gr.themes.Soft(), title="VerifiAI - Deepfake Detector") as demo: is_logged_in = gr.State(False) with gr.Tabs(selected=HOME_TAB_NAME) as tabs: with gr.Tab(HOME_TAB_NAME, id=HOME_TAB_NAME) as home_tab: with gr.Row(): with gr.Column(): gr.Markdown("""
Your trusted assistant for detecting deepfakes in images using AI.
🔍 Upload images, analyze authenticity, and learn how deepfakes work.
👉 Use the tabs above to get started.