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()