Spaces:
Running
Running
import gradio as gr | |
import torch | |
from PIL import Image | |
from torchvision import transforms | |
import os | |
import numpy as np | |
import random | |
from resnet import resnet50 | |
def seed_torch(seed=1029): | |
random.seed(seed) | |
os.environ['PYTHONHASHSEED'] = str(seed) | |
np.random.seed(seed) | |
torch.manual_seed(seed) | |
torch.cuda.manual_seed(seed) | |
torch.cuda.manual_seed_all(seed) | |
torch.backends.cudnn.benchmark = False | |
torch.backends.cudnn.deterministic = True | |
torch.backends.cudnn.enabled = False | |
seed_torch(100) | |
def load_model(model_path): | |
model = resnet50(num_classes=1) | |
state_dict = torch.load(model_path, map_location='cpu') | |
model.load_state_dict(state_dict, strict=True) | |
if torch.cuda.is_available(): | |
model.cuda() | |
model.eval() | |
return model | |
def preprocess_image(image): | |
transform = transforms.Compose([ | |
transforms.Resize((224, 224)), | |
transforms.ToTensor(), | |
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) | |
]) | |
image = transform(image).unsqueeze(0) | |
return image | |
def predict_image(model, image): | |
if torch.cuda.is_available(): | |
image = image.cuda() | |
with torch.no_grad(): | |
output = model(image) | |
# Apply sigmoid to get probability between 0 and 1 | |
prediction = torch.sigmoid(output).item() | |
# Clamp prediction between 0 and 1 | |
prediction = max(0, min(prediction, 1)) | |
# Convert to percentages | |
real_prob = round(prediction * 1, 2) # Rounded to 2 decimal places | |
fake_prob = round(1 - real_prob, 2) # Complementary probability | |
return real_prob, fake_prob | |
# def predict_image(model, image): | |
# if torch.cuda.is_available(): | |
# image = image.cuda() | |
# with torch.no_grad(): | |
# output = model(image) | |
# prediction = torch.sigmoid(output).item() | |
# real_prob = gr.number(min(max(prediction * 100, 0), 100)) # Convert to integer | |
# fake_prob = int(100 - real_prob) # Ensure complementary probability | |
# return real_prob, fake_prob | |
# Load the model once at the start | |
model_path = "model_epoch_last_3090.pth" # Update with the correct path to your model | |
model = load_model(model_path) | |
def detect_deepfake(image): | |
image = Image.fromarray(image).convert("RGB") | |
preprocessed_image = preprocess_image(image) | |
real_prob, fake_prob = predict_image(model, preprocessed_image) | |
print("real_prob", real_prob) | |
print("fake_prob", fake_prob) | |
return {"Real Confidence": real_prob, "Fake Confidence": fake_prob} | |
iface = gr.Interface( | |
fn=detect_deepfake, | |
inputs=gr.Image(type="numpy", label="Upload Image"), | |
outputs=gr.Label(num_top_classes=2, label="Confidence Scores"), | |
title="Deepfake Detection", | |
description="Upload an image to determine its confidence scores for being real or fake." | |
) | |
if __name__ == "__main__": | |
iface.launch() | |