import gradio as gr from transformers import pipeline from PIL import Image, ExifTags import numpy as np import cv2 # ---------------------------- # MODEL # ---------------------------- try: hf_detector = pipeline("image-classification", model="umm-maybe/AI-image-detector") except Exception as e: hf_detector = None print("HF AI-detector gagal dimuat:", e) try: general_model = pipeline("image-classification", model="google/vit-base-patch16-224") except Exception as e: general_model = None print("General classifier gagal dimuat:", e) # ---------------------------- # ANALISIS LOKAL # ---------------------------- def calculate_blur(image): gray = np.array(image.convert("L")) return cv2.Laplacian(gray, cv2.CV_64F).var() def calculate_noise(image): gray = np.array(image.convert("L"), dtype=np.float32) noise_std = np.std(gray - np.mean(gray)) return noise_std def has_camera_exif(image): try: exif = image._getexif() if exif: for tag, value in exif.items(): decoded = ExifTags.TAGS.get(tag, tag) if decoded in ["Make", "Model"]: return True except: return False return False # ---------------------------- # DETEKSI HYBRID # ---------------------------- def detect_image(image): # Prediksi HF AI-detector hf_score = 0 hf_label = "N/A" hf_conf = 0 if hf_detector: try: result = hf_detector(image) hf_label = result[0]['label'] hf_conf = result[0]['score'] * 100 if any(x in hf_label.lower() for x in ["fake", "ai", "artificial"]): hf_score = hf_conf else: hf_score = 100 - hf_conf # jika human, kurangi except: hf_score = 0 # Prediksi general model general_score = 0 general_label = "N/A" general_conf = 0 if general_model: try: result2 = general_model(image) general_label = result2[0]['label'] general_conf = result2[0]['score'] * 100 if any(x in general_label.lower() for x in ["anime","cartoon","illustration","maya","3d"]): general_score = general_conf except: general_score = 0 # Analisis lokal blur_score = calculate_blur(image) noise_score = calculate_noise(image) exif_present = has_camera_exif(image) local_score = 0 # Blur rendah atau noise rendah → kemungkinan AI if blur_score < 100 or noise_score < 10: local_score += 50 # Tidak ada metadata kamera → kemungkinan AI if not exif_present: local_score += 40 else: local_score -= 20 # ada metadata kamera → lebih asli # Weighted hybrid weighted_score = hf_score*0.4 + general_score*0.2 + local_score*0.4 # Konversi ke persen AI / Asli if weighted_score >= 95: final_result = "🖼️ Gambar ini hasil AI (100%)" elif weighted_score <= 5: final_result = "🖼️ Gambar ini asli (100%)" else: final_result = f"🖼️ Gambar ini {round(weighted_score,2)}% AI / {round(100-weighted_score,2)}% Asli" # Output output_lines = [ f"### Hasil Deteksi:\n{final_result}", f"HF AI-detector: {hf_label} ({hf_conf:.2f}%)", f"General Model: {general_label} ({general_conf:.2f}%)", f"Blur Score: {blur_score:.2f}", f"Noise Score: {noise_score:.2f}", f"Metadata Kamera: {'Ada' if exif_present else 'Tidak Ada'}" ] return "\n".join(output_lines) # ---------------------------- # Gradio Interface # ---------------------------- iface = gr.Interface( fn=detect_image, inputs=gr.Image(type="pil"), outputs="markdown", title="AI vs Foto Asli Detector (Hybrid)", description="Unggah gambar, sistem akan mendeteksi persentase AI vs Asli." ) if __name__ == "__main__": iface.launch()