Spaces:
Sleeping
Sleeping
File size: 3,062 Bytes
8c30b41 f034887 f658766 f23fa83 923a637 f658766 505b320 f658766 f034887 505b320 0738ed7 f034887 f23fa83 f658766 458c1f5 f23fa83 afd314f f23fa83 269f417 f23fa83 f034887 f23fa83 458c1f5 afd314f 0738ed7 afd314f 0738ed7 f034887 0738ed7 f034887 0738ed7 afd314f 0738ed7 923a637 b735378 923a637 f658766 458c1f5 f658766 afd314f 269f417 8c30b41 923a637 269f417 |
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 PIL import Image, ExifTags
import numpy as np
import cv2
# ----------------------------
# 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)
return np.std(gray - np.mean(gray))
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
# -------- FFT ANALYSIS --------
def high_freq_artifacts(image):
gray = np.array(image.convert("L"), dtype=np.float32)
f = np.fft.fft2(gray)
fshift = np.fft.fftshift(f)
magnitude_spectrum = np.abs(fshift)
rows, cols = gray.shape
crow, ccol = rows // 2 , cols // 2
r = min(crow, ccol) // 4
mask = np.zeros((rows, cols))
mask[crow-r:crow+r, ccol-r:ccol+r] = 1
low_energy = np.sum(magnitude_spectrum * mask)
total_energy = np.sum(magnitude_spectrum)
high_ratio = (total_energy - low_energy) / total_energy * 100
return high_ratio
# ----------------------------
# DETEKSI AI HYBRID ADAPTIF
# ----------------------------
def detect_image(image: Image.Image):
blur_score = calculate_blur(image)
noise_score = calculate_noise(image)
exif_present = has_camera_exif(image)
high_freq_score = high_freq_artifacts(image)
# ---------- Scoring adaptif ----------
# Normalisasi high_freq_score ke 0-10
hf_norm = min(high_freq_score / 10, 10)
# Noise invers (AI biasanya noise rendah)
noise_norm = max(0, 12 - noise_score)
# Weighted score
weighted_score = 0.5 * hf_norm + 0.5 * noise_norm
# Kondisi tegas: threshold > 5 → AI
is_ai = False
if not exif_present and weighted_score > 5 and blur_score < 150:
is_ai = True
final_result = "🤖 AI Detected" if is_ai else "✅ Foto Asli"
output_lines = [
f"### Hasil Deteksi:\n{final_result}",
f"Blur Score: {blur_score:.2f}",
f"Noise Score: {noise_score:.2f}",
f"High-Freq Artifacts Score: {high_freq_score:.2f}",
f"Weighted Score: {weighted_score:.2f}",
f"Metadata Kamera: {'Ada' if exif_present else 'Tidak Ada'}"
]
return "\n".join(output_lines)
# ----------------------------
# GRADIO INTERFACE
# ----------------------------
with gr.Blocks(title="Hybrid AI Realistic Detector (Adaptif & Tegas)") as demo:
gr.Markdown("Unggah gambar, sistem akan mendeteksi apakah gambar kemungkinan besar asli atau dihasilkan AI.")
with gr.Row():
img_input = gr.Image(type="pil", label="Unggah Gambar")
output_md = gr.Markdown(label="Hasil Deteksi")
detect_btn = gr.Button("Deteksi")
detect_btn.click(fn=detect_image, inputs=img_input, outputs=output_md)
if __name__ == "__main__":
demo.launch()
|