Spaces:
Sleeping
Sleeping
File size: 3,333 Bytes
8c30b41 3289e9d 39cfaa0 958932b 39cfaa0 958932b 39cfaa0 958932b 39cfaa0 958932b 39cfaa0 958932b 39cfaa0 958932b 39cfaa0 958932b 39cfaa0 958932b 39cfaa0 958932b 39cfaa0 958932b 39cfaa0 958932b 19e6f0c 958932b 39cfaa0 19e6f0c 923a637 19e6f0c 958932b |
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 |
import gradio as gr
from transformers import pipeline
from PIL import Image, ExifTags
import numpy as np
import cv2
# Model utama AI-detector
detector = pipeline("image-classification", model="umm-maybe/AI-image-detector")
# Model backup (general classifier)
general = pipeline("image-classification", model="google/vit-base-patch16-224")
def analyze_image(img_pil):
img = np.array(img_pil)
# Blur detection (variance of Laplacian)
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
blur_score = cv2.Laplacian(gray, cv2.CV_64F).var()
# Noise estimation (std deviation)
noise_score = np.std(gray)
# Edge consistency
edges = cv2.Canny(gray, 100, 200)
edge_score = np.std(edges)
# JPEG artifacts (kasar: std dev dari DCT block)
dct = cv2.dct(np.float32(gray) / 255.0)
jpeg_artifact = np.std(dct)
# Metadata kamera
metadata = "Tidak Ada"
try:
exif_data = img_pil._getexif()
if exif_data:
metadata = "Ada"
except:
pass
return blur_score, noise_score, edge_score, jpeg_artifact, metadata
def detect_image(img):
try:
# Prediksi AI-detector
result1 = detector(img)
label1 = result1[0]['label']
conf1 = round(result1[0]['score'] * 100, 2)
# Prediksi model general
result2 = general(img)
label2 = result2[0]['label']
conf2 = round(result2[0]['score'] * 100, 2)
# Analisis teknis
blur, noise, edge, jpeg_art, metadata = analyze_image(img)
# --- Voting System ---
ai_score = 0
real_score = 0
# Dari model AI-detector
if "fake" in label1.lower() or "artificial" in label1.lower():
ai_score += conf1
elif "real" in label1.lower() or "human" in label1.lower():
real_score += conf1
# Dari metadata
if metadata == "Ada":
real_score += 30 # bobot ekstra untuk foto asli
else:
ai_score += 20
# Dari noise & blur
if noise > 20 and blur > 50:
real_score += 20
else:
ai_score += 10
# Hasil akhir
total = ai_score + real_score + 1e-6
ai_pct = round((ai_score / total) * 100, 2)
real_pct = round((real_score / total) * 100, 2)
if ai_pct > real_pct:
final = f"⚠️ Kemungkinan Besar AI Generated ({ai_pct}%)"
else:
final = f"✅ Kemungkinan Besar Foto Asli ({real_pct}%)"
output = f"""
### Hasil Deteksi:
{final}
**Persentase AI:** {ai_pct}%
**Persentase Asli:** {real_pct}%
**Model AI-detector:** {label1} ({conf1}%)
**Model General (ViT):** {label2} ({conf2}%)
**Analisis Kamera & Teknis:**
- Blur Score: {round(blur,2)}
- Noise Score: {round(noise,2)}
- Edge Consistency (STD): {round(edge,2)}
- JPEG Artifact Level: {round(jpeg_art,2)}
- Metadata Kamera: {metadata}
"""
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="AI vs Real Image Detector (Hybrid)",
description="Deteksi AI vs Foto Asli dengan kombinasi model + analisis teknis (blur, noise, edge, metadata)."
)
if __name__ == "__main__":
iface.launch()
|