Spaces:
Sleeping
Sleeping
| import torch | |
| import torch.nn as nn | |
| from efficientnet_pytorch import EfficientNet | |
| from src.config_reader import Config | |
| class DeepfakeDetector(nn.Module): | |
| def __init__(self): | |
| super().__init__() | |
| self.cfg = Config() | |
| # Spatial branch | |
| self.spatial_branch = self.build_spatial_branch() | |
| # Frequency branch | |
| self.frequency_branch = self.build_frequency_branch() | |
| # Classifier | |
| self.classifier = self.build_classifier() | |
| def build_spatial_branch(self): | |
| model = EfficientNet.from_pretrained('efficientnet-b4') | |
| model._fc = nn.Identity() | |
| return model | |
| def build_frequency_branch(self): | |
| return nn.Sequential( | |
| nn.Conv2d(1, 32, 3, padding=1), | |
| nn.ReLU(), | |
| nn.Conv2d(32, 64, 3, padding=1), | |
| nn.ReLU(), | |
| nn.AdaptiveAvgPool2d((8, 8)), | |
| nn.Flatten(), | |
| nn.Linear(64 * 8 * 8, 256) | |
| ) | |
| def build_classifier(self): | |
| return nn.Sequential( | |
| nn.Linear(1792 + 256, 512), | |
| nn.ReLU(), | |
| nn.Dropout(0.4), | |
| nn.Linear(512, 1), | |
| nn.Sigmoid() | |
| ) | |
| def forward(self, x): | |
| # Spatial features | |
| spatial_feat = self.spatial_branch(x) | |
| # Frequency features | |
| gray = x.mean(dim=1, keepdim=True) | |
| freq_map = torch.fft.fft2(gray) | |
| freq_map = torch.log1p(torch.abs(freq_map)) | |
| freq_feat = self.frequency_branch(freq_map) | |
| # Combine aur classify | |
| combined = torch.cat([spatial_feat, freq_feat], dim=1) | |
| return self.classifier(combined) |