| |
| import torch |
| import torch.nn as nn |
| import torchvision.transforms as transforms |
| import torchvision.models as models |
| from PIL import Image |
| import os |
| import numpy as np |
| from huggingface_hub import hf_hub_download |
|
|
| |
| import torch.serialization |
| try: |
| torch.serialization.add_safe_globals([np.core.multiarray.scalar]) |
| except: |
| pass |
|
|
| _original_load = torch.load |
| def _patched_load(*args, **kwargs): |
| kwargs['weights_only'] = False |
| return _original_load(*args, **kwargs) |
| torch.load = _patched_load |
| |
|
|
| |
| device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
|
|
| |
| class Deepfake_Hybrid_Network(nn.Module): |
| def __init__(self, num_classes=2): |
| super(Deepfake_Hybrid_Network, self).__init__() |
| resnet = models.resnet18(weights=None) |
| self.cnn_extractor = nn.Sequential(*list(resnet.children())[:-2]) |
| |
| encoder_layer = nn.TransformerEncoderLayer( |
| d_model=512, nhead=8, dim_feedforward=1024, dropout=0.3, batch_first=True |
| ) |
| self.transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=2) |
| |
| self.classifier = nn.Sequential( |
| nn.Linear(512, 128), |
| nn.BatchNorm1d(128), |
| nn.ReLU(), |
| nn.Dropout(0.4), |
| nn.Linear(128, num_classes) |
| ) |
|
|
| def forward(self, x): |
| x = self.cnn_extractor(x) |
| b, c, h, w = x.shape |
| x = x.view(b, c, h * w).permute(0, 2, 1) |
| x = self.transformer_encoder(x) |
| x = x.mean(dim=1) |
| return self.classifier(x) |
|
|
| |
| print("Loading Image Hybrid SOTA Model...") |
| model = Deepfake_Hybrid_Network(num_classes=2).to(device) |
|
|
| try: |
| |
| model_path = hf_hub_download(repo_id="aneela-pervez/My-Deepfake-Models", filename="Deepfake_Hybrid_SOTA.pth") |
| state_dict = torch.load(model_path, map_location=device) |
| |
| if any(k.startswith('module.') for k in state_dict.keys()): |
| from collections import OrderedDict |
| new_state_dict = OrderedDict() |
| for k, v in state_dict.items(): |
| new_state_dict[k.replace('module.', '')] = v |
| model.load_state_dict(new_state_dict) |
| else: |
| model.load_state_dict(state_dict) |
| model.eval() |
| print("✅ Image SOTA Model loaded successfully!") |
| except Exception as e: |
| print(f"⚠️ Error loading image model weights: {e}") |
|
|
| |
| test_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]) |
| ]) |
|
|
| |
| def predict_image(img): |
| if img is None: |
| return {"Error": 1.0} |
| |
| img_tensor = test_transform(img).unsqueeze(0).to(device) |
| |
| with torch.no_grad(): |
| outputs = model(img_tensor) |
| probabilities = torch.nn.functional.softmax(outputs[0], dim=0) |
| |
| results = { |
| "Fake (Deepfake)": float(probabilities[0]), |
| "Real Image": float(probabilities[1]) |
| } |
| return results |