File size: 2,258 Bytes
e73e2a2
 
3a2cd79
e73e2a2
3a2cd79
e6fe7fe
3a2cd79
 
e73e2a2
e6fe7fe
eaa1a24
4ab3d47
e73e2a2
 
 
 
3a2cd79
e73e2a2
 
 
 
 
 
 
4ab3d47
e73e2a2
3df4442
e73e2a2
3a2cd79
e73e2a2
 
4ab3d47
e6fe7fe
3df4442
e73e2a2
 
4ab3d47
3a2cd79
3df4442
e73e2a2
 
4ab3d47
 
3df4442
4ab3d47
 
3a2cd79
3df4442
 
 
 
 
 
3a2cd79
e73e2a2
3a2cd79
4ab3d47
 
 
 
 
 
 
e73e2a2
 
 
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
import os
import cv2
import numpy as np
import gradio as gr
import tensorflow as tf
from tensorflow.keras.models import load_model
from tensorflow.keras.applications.xception import preprocess_input as xcp_pre
from tensorflow.keras.applications.efficientnet import preprocess_input as eff_pre
from huggingface_hub import hf_hub_download
from mtcnn import MTCNN

# Download and load models
xcp_path = hf_hub_download(repo_id="Zeyadd-Mostaffa/deepfake-image-detector", filename="xception_model.h5")
eff_path = hf_hub_download(repo_id="Zeyadd-Mostaffa/deepfake-image-detector", filename="efficientnet_model.h5")
xcp_model = load_model(xcp_path)
eff_model = load_model(eff_path)

# Face detector
detector = MTCNN()

def extract_face(image):
    faces = detector.detect_faces(image)
    if not faces:
        return None
    x, y, w, h = faces[0]['box']
    x, y = max(0, x), max(0, y)
    return image[y:y+h, x:x+w]

def predict(image):
    face = extract_face(image)
    if face is None:
        return "No face detected", None

    # Xception
    xcp_img = cv2.resize(face, (299, 299))
    xcp_tensor = xcp_pre(xcp_img.astype(np.float32))[np.newaxis, ...]
    xcp_pred = xcp_model.predict(xcp_tensor, verbose=0).flatten()[0]

    # EfficientNet
    eff_img = cv2.resize(face, (224, 224))
    eff_tensor = eff_pre(eff_img.astype(np.float32))[np.newaxis, ...]
    eff_pred = eff_model.predict(eff_tensor, verbose=0).flatten()[0]

    # Ensemble
    avg_pred = (xcp_pred + eff_pred) / 2
    label = "Real" if avg_pred > 0.5 else "Fake"

    # Log probabilities
    print(f"Xception: {xcp_pred:.4f}, EfficientNetB4: {eff_pred:.4f}, Ensemble Avg: {avg_pred:.4f}")

    # Return label with confidence
    result = f"{label} (Avg: {avg_pred:.3f}, XCP: {xcp_pred:.3f}, EFF: {eff_pred:.3f})"
    return result, face

interface = gr.Interface(
    fn=predict,
    inputs=gr.Image(type="numpy", label="Upload Image"),
    outputs=[
        gr.Label(label="Prediction"),
        gr.Image(type="numpy", label="Detected Face")
    ],
    title="Deepfake Image Detector (Ensemble: Xception + EfficientNetB4)",
    description="Upload an image. The model detects the face, classifies it as real or fake using an ensemble of Xception and EfficientNetB4."
)

interface.launch()