ferhataddour's picture
Create app.py
70e9a3c verified
import gradio as gr
import torch
import torchvision.transforms as transforms
import numpy as np
from PIL import Image
import cv2
import os
from sklearn.svm import SVC
from scipy.fftpack import fft2, fftshift
import pretrainedmodels
# 🔌 Transform pour CNN
transform = transforms.Compose([
transforms.Resize((299, 299)),
transforms.ToTensor(),
transforms.Normalize([0.5]*3, [0.5]*3)
])
class ProxyXceptionNet(torch.nn.Module):
def __init__(self):
super().__init__()
self.model = pretrainedmodels.__dict__["xception"](num_classes=1000, pretrained="imagenet")
self.model.eval()
def predict(self, image_pil):
img = transform(image_pil).unsqueeze(0)
with torch.no_grad():
out = self.model(img)
prob = torch.softmax(out, dim=1).numpy()
# Simule une décision deepfake basée sur la classe dominante : purement démonstratif !
pred_class = np.argmax(prob)
return int(pred_class % 2 == 0) # pseudo-détection arbitraire
cnn_model = ProxyXceptionNet()
# ⚖️ SVM avec FFT (entraînement simple sur données factices)
fft_train = np.random.rand(20, 1000)
y_train = [0]*10 + [1]*10
svm = SVC(probability=True)
svm.fit(fft_train, y_train)
# 📈 FFT Feature Extraction
def extract_fft_features_pil(image):
img = image.convert("L").resize((256, 256))
img_np = np.array(img)
f = fft2(img_np)
fshift = fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(fshift) + 1)
return magnitude_spectrum.flatten()[:1000]
# 🔄 Fonction principale Gradio
def predict(image, method):
if method == "CNN (Xception)":
result = cnn_model.predict(image)
label = "Deepfake ❌" if result == 1 else "Réel ✅"
else:
features = extract_fft_features_pil(image)
pred = svm.predict([features])[0]
label = "Deepfake ❌" if pred == 1 else "Réel ✅"
return label
demo = gr.Interface(
fn=predict,
inputs=[
gr.Image(type="pil", label="Image à analyser"),
gr.Radio(["CNN (Xception)", "FFT + SVM"], label="Méthode de détection")
],
outputs=gr.Textbox(label="Résultat"),
title="Détection de Deepfakes (Image)",
description="Upload une image et choisis la méthode pour tester si c'est un deepfake."
)
demo.launch(share=True)