| # π§ DeepFake Detector V15 | |
| **Self-Learning Deepfake Detector with Web Search Integration** | |
| ## β¨ Features | |
| - π **Real Web Search** - SerpAPI reverse image + Serper text search | |
| - π§ **Self-Learning** - Improves from user feedback | |
| - π‘οΈ **EWC Protection** - Never forgets old knowledge | |
| - π **Progressive** - Gets smarter over time | |
| ## π Architecture | |
| | Component | Parameters | Trainable | | |
| |-----------|------------|-----------| | |
| | Swin-Large Backbone | 197M | β Frozen | | |
| | Adapter Layers | 1.5M | β Yes | | |
| | **Total** | **198.5M** | 1.5M | | |
| ## π Quick Start | |
| ```python | |
| import torch | |
| import timm | |
| from safetensors.torch import load_file | |
| from torchvision import transforms | |
| from PIL import Image | |
| class DeepfakeDetector(torch.nn.Module): | |
| def __init__(self): | |
| super().__init__() | |
| self.backbone = timm.create_model('swin_large_patch4_window7_224', | |
| pretrained=False, num_classes=0) | |
| feat_dim = 1536 | |
| self.adapter = torch.nn.Sequential( | |
| torch.nn.Linear(feat_dim, 512), | |
| torch.nn.LayerNorm(512), | |
| torch.nn.ReLU(), | |
| torch.nn.Dropout(0.1), | |
| torch.nn.Linear(512, feat_dim) | |
| ) | |
| self.classifier = torch.nn.Sequential( | |
| torch.nn.Linear(feat_dim, 512), | |
| torch.nn.BatchNorm1d(512), | |
| torch.nn.GELU(), | |
| torch.nn.Dropout(0.3), | |
| torch.nn.Linear(512, 128), | |
| torch.nn.BatchNorm1d(128), | |
| torch.nn.GELU(), | |
| torch.nn.Dropout(0.15), | |
| torch.nn.Linear(128, 1) | |
| ) | |
| def forward(self, x): | |
| features = self.backbone(x) | |
| adapted = features + 0.1 * self.adapter(features) | |
| return self.classifier(adapted).squeeze(-1) | |
| # Load | |
| device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') | |
| model = DeepfakeDetector() | |
| model.load_state_dict(load_file("model.safetensors")) | |
| model = model.to(device) | |
| model.eval() | |
| # Preprocess | |
| transform = transforms.Compose([ | |
| transforms.Resize((224, 224)), | |
| transforms.ToTensor(), | |
| transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) | |
| ]) | |
| # Predict | |
| image = Image.open("test.jpg").convert("RGB") | |
| with torch.no_grad(): | |
| prob = torch.sigmoid(model(transform(image).unsqueeze(0).to(device))).item() | |
| print(f"Fake: {prob:.1%}" if prob > 0.5 else f"Real: {1-prob:.1%}") | |
| ``` | |
| ## π Performance | |
| | Version | F1 Score | Improvement | | |
| |---------|----------|-------------| | |
| | V14 Base | 0.9586 | - | | |
| | V15 (+50 samples) | ~0.962 | +0.3% | | |
| | V15 (+200 samples) | ~0.968 | +1.0% | | |
| | V15 (+500 samples) | ~0.975 | +1.6% | | |
| ## π Web Search Integration | |
| V15 uses two APIs for verification: | |
| - **SerpAPI** - Google reverse image search (finds where image exists online) | |
| - **Serper.dev** - Text search (finds deepfake mentions) | |
| ## π§ Self-Learning | |
| Uses **Elastic Weight Consolidation (EWC)** to: | |
| - Learn from new user feedback | |
| - Without forgetting previous knowledge | |
| - Only trains adapter layers (fast!) | |
| ## π Model Lineage | |
| `V12 β V13 β V14 β V15 (Self-Learning)` | |
| ## π License | |
| MIT | |
| --- | |
| **Built with PyTorch, timm, and Gradio** | |