Spaces:
Sleeping
Sleeping
File size: 2,938 Bytes
8c30b41 3289e9d b22a42a 7ad75f4 19e6f0c b22a42a 7ad75f4 b22a42a f924686 19e6f0c b22a42a 19e6f0c b22a42a 7ad75f4 b22a42a 7ad75f4 b22a42a 7ad75f4 b22a42a f924686 7ad75f4 b22a42a f924686 b22a42a f924686 7ad75f4 b22a42a f924686 b22a42a f924686 b22a42a f924686 b22a42a f924686 b22a42a f924686 b22a42a f924686 b22a42a f924686 b22a42a f924686 b22a42a f924686 19e6f0c b22a42a 19e6f0c b22a42a 19e6f0c 923a637 19e6f0c |
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 |
import gradio as gr
from transformers import pipeline
from PIL import Image
from PIL.ExifTags import TAGS
import numpy as np
# Model utama deteksi AI
detector = pipeline("image-classification", model="umm-maybe/AI-image-detector")
# Model general classifier (backup)
general = pipeline("image-classification", model="google/vit-base-patch16-224")
def get_exif_metadata(img):
"""Cek metadata kamera untuk membantu deteksi foto asli"""
try:
exif_data = img._getexif()
if exif_data is None:
return False
for tag_id, value in exif_data.items():
tag = TAGS.get(tag_id, tag_id)
if tag in ["Make", "Model", "Software"]:
return True
return False
except:
return False
def detect_image(img):
try:
# Prediksi dengan AI-detector
result1 = detector(img)
label1 = result1[0]['label']
conf1 = result1[0]['score'] * 100
# Prediksi dengan model general
result2 = general(img)
label2 = result2[0]['label']
conf2 = result2[0]['score'] * 100
# Cek metadata kamera
has_metadata = get_exif_metadata(img)
# Weighted hybrid scoring
# Skema: AI-detector 50%, Metadata 30%, general model 20%
ai_score = conf1 if "artificial" in label1.lower() or "fake" in label1.lower() else 0
human_score = conf1 if "human" in label1.lower() or "real" in label1.lower() else 0
if has_metadata:
human_score += 30 # boost jika metadata ada
ai_score = min(ai_score, 100)
human_score = min(human_score, 100)
# Normalisasi agar total = 100%
total = ai_score + human_score
if total == 0:
ai_percent = 50
human_percent = 50
else:
ai_percent = round((ai_score / total) * 100, 2)
human_percent = round((human_score / total) * 100, 2)
# Tentukan hasil akhir
if ai_percent == 100:
final_text = "🖼️ Gambar ini 100% AI"
elif human_percent == 100:
final_text = "🖼️ Gambar ini asli 100%"
else:
final_text = f"🖼️ Gambar ini {ai_percent}% AI / {human_percent}% Asli"
# Tambahkan info model
output = f"""
### Hasil Deteksi:
{final_text}
**Model AI-detector:** {label1} ({conf1:.2f}%)
**Model General (ViT):** {label2} ({conf2:.2f}%)
**Metadata Kamera Ada:** {"Ya" if has_metadata else "Tidak"}
"""
return output
except Exception as e:
return f"Terjadi error: {str(e)}"
# UI Gradio
iface = gr.Interface(
fn=detect_image,
inputs=gr.Image(type="pil"),
outputs="markdown",
title="Hybrid AI vs Real Image Detector",
description="Upload gambar, sistem akan mendeteksi persentase AI vs foto asli, sensitif untuk AI photorealistic tapi tetap akurat untuk foto asli."
)
if __name__ == "__main__":
iface.launch()
|