Samsularif's picture
Update app.py
acb43e1 verified
import gradio as gr
import os
import tempfile
import time
from facecomparison_multi_resume import DeepfakeDetector
from PIL import Image
# 1. MENGAMBIL KUNCI API DARI ENVIRONMENT VARIABLES (SECRETS)
API_KEYS = {
"qwen": os.environ.get("OPENROUTER_API_KEY_QWEN"),
"gpt": os.environ.get("OPENROUTER_API_KEY_GPT"),
"gemini": os.environ.get("OPENROUTER_API_KEY_GEMINI"),
"llama": os.environ.get("OPENROUTER_API_KEY_LLAMA"),
# "cohere": os.environ.get("OPENROUTER_API_KEY_COHERE"),
}
MODEL_NAMES = ["qwen", "gpt", "gemini", "llama", "cohere"]
# ===================================================================
# 2. FUNGSI UTAMA UNTUK ANALISIS SATU GAMBAR
# ===================================================================
def analyze_image_with_llms(image_pil):
"""
Menerima gambar PIL, memanggil 5 LLM secara berurutan, dan mengembalikan hasilnya.
"""
if image_pil is None:
return "N/A", "N/A", "N/A", "N/A", "N/A"
# Simpan gambar yang diunggah sementara
with tempfile.NamedTemporaryFile(suffix=".jpg", delete=False) as tmp_file:
# Gunakan mode RGB untuk kompatibilitas yang lebih baik
image_pil.convert("RGB").save(tmp_file.name, "JPEG", quality=90)
temp_path = tmp_file.name
all_results = {}
for model_name in MODEL_NAMES:
api_key = API_KEYS.get(model_name)
if not api_key:
all_results[model_name] = f"❌ Key Missing"
continue
try:
# Inisialisasi Detektor
detector = DeepfakeDetector(
api_key=api_key,
model_name=model_name,
use_face_detector=True # Tetap gunakan cropping RetinaFace
)
# Panggil fungsi deteksi inti
result, _, _ = detector.detect_deepfake_llm(temp_path)
# Ubah output yang ambigu menjadi 'ERROR' untuk tampilan UI yang bersih
if result == "UNKNOWN" or result == "ERROR":
all_results[model_name] = f"⚠️ LLM Gagal Tebak"
else:
all_results[model_name] = result
except Exception as e:
all_results[model_name] = f"❌ API Error: {str(e)[:50]}"
# Tambahkan delay untuk menghindari Rate Limit OpenRouter
time.sleep(1.5)
# Bersihkan file sementara
os.unlink(temp_path)
# Kembalikan hasil dalam urutan yang benar
return (
all_results.get("qwen", "Error"),
all_results.get("gpt", "Error"),
all_results.get("gemini", "Error"),
all_results.get("llama", "Error"),
# all_results.get("cohere", "Error"),
)
# ===================================================================
# 3. INTERFACE GRADIOL
# ===================================================================
iface = gr.Interface(
fn=analyze_image_with_llms,
inputs=gr.Image(type="pil", label="🖼️ Upload Wajah untuk Analisis Deepfake"),
outputs=[
gr.Textbox(label="1. Qwen Prediction", type="text"),
gr.Textbox(label="2. GPT-4o Prediction", type="text"),
gr.Textbox(label="3. Gemini 2.5 Flash Prediction", type="text"),
gr.Textbox(label="4. Llama 3.2 Vision Prediction", type="text"),
# gr.Textbox(label="5. cohere/command-r-plus-08-2024", type="text")
],
title="🔬 Vision-Language Models for Deepfake Face Detection",
description="Unggah gambar wajah. 5 LLM Multimodal (via OpenRouter) akan menganalisis dan menebak: **REAL** atau **FAKE**.",
allow_flagging="never",
theme=gr.themes.Soft()
)
if __name__ == "__main__":
iface.launch()