File size: 2,545 Bytes
8c30b41
2d38802
c03cdfb
9e3f29f
b8bf0c0
9e3f29f
2882491
9e3f29f
c03cdfb
2882491
 
c03cdfb
2882491
9e3f29f
c03cdfb
2882491
9e3f29f
c03cdfb
9e3f29f
2882491
9e3f29f
 
 
2882491
9e3f29f
 
 
2882491
 
 
 
9e3f29f
 
 
2882491
9e3f29f
2882491
9e3f29f
 
 
2882491
9e3f29f
2882491
9e3f29f
 
 
 
 
2882491
9e3f29f
 
2882491
9e3f29f
 
 
2882491
9e3f29f
 
 
 
 
 
 
c03cdfb
9e3f29f
 
 
c03cdfb
 
8c30b41
9e3f29f
 
2882491
8c30b41
 
9e3f29f
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
import gradio as gr
from transformers import pipeline
from PIL import Image
import numpy as np

# ----------------------------
# Inisialisasi model publik
# ----------------------------

# Model A: Deteksi wajah
model_a = pipeline("image-classification", model="qualcomm/MediaPipe-Face-Detection")

# Model B: Klasifikasi gambar umum
model_b = pipeline("image-classification", model="microsoft/resnet-50")

# Model C: Klasifikasi gambar umum
model_c = pipeline("image-classification", model="google/vit-base-patch16-224")

# ----------------------------
# Fungsi deteksi dengan ensemble
# ----------------------------
def detect_image(image):
    results = []

    # Model A
    res_a = model_a(image)[0]
    label_a, score_a = res_a['label'].lower(), res_a['score']
    # Sederhanakan: ada wajah = human, tidak = AI
    label_a_final = 'human' if 'face' in label_a else 'ai'
    results.append((label_a_final, score_a))

    # Model B
    res_b = model_b(image)[0]
    label_b, score_b = res_b['label'].lower(), res_b['score']
    label_b_final = 'human' if 'person' in label_b or 'human' in label_b else 'ai'
    results.append((label_b_final, score_b))

    # Model C
    res_c = model_c(image)[0]
    label_c, score_c = res_c['label'].lower(), res_c['score']
    label_c_final = 'human' if 'person' in label_c or 'human' in label_c else 'ai'
    results.append((label_c_final, score_c))

    # ----------------------------
    # Voting + Threshold
    # ----------------------------
    votes = [r[0] for r in results]
    scores = [r[1] for r in results]

    # Mayoritas voting
    final_label = max(set(votes), key=votes.count)

    # Rata-rata confidence untuk final label
    relevant_scores = [s for (l, s) in results if l == final_label]
    avg_confidence = np.mean(relevant_scores) * 100  # ke persen

    # Tentukan hasil akhir
    if avg_confidence < 80:
        return "⚠️ Tidak Pasti (cek manual)", round(avg_confidence, 2)
    elif final_label == 'human':
        return f"Foto Asli ✅", round(avg_confidence, 2)
    else:
        return f"AI Detected 🤖", round(avg_confidence, 2)

# ----------------------------
# Gradio Interface
# ----------------------------
iface = gr.Interface(
    fn=detect_image,
    inputs=gr.Image(type="pil"),
    outputs=[gr.Textbox(label="Hasil Deteksi"), gr.Number(label="Confidence (%)")],
    title="AI vs Foto Asli Detector",
    description="Unggah gambar, sistem akan mendeteksi apakah gambar asli atau dihasilkan AI menggunakan ensemble 3 model publik + voting."
)

iface.launch()