This repository implements a deepfake detection framework that combines adversarial robustness with explainable AI (XAI) for detecting AI-generated faces. The system uses pretrained CNNs (Xception, ResNet-50) and Vision Transformers (ViT) with adversarial training (FGSM/PGD) and Grad-CAM visualizations.
- Multiple Model Architectures: Xception, Vision Transformer (ViT-B/16), ResNet-50
- Adversarial Training: FGSM and PGD attacks for robustness
- Explainability: Grad-CAM visualizations showing model attention
- Comprehensive Evaluation: Accuracy, Precision, Recall, F1, AUC, and Adversarial Robustness Index (ARI)
- Binary and Tri-class Support: Real vs Fake, or Artificial vs Deepfake vs Real
# Create virtual environment
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install dependencies
pip install -r requirements.txtTrain Xception with PGD adversarial training:
python -m src.train \
--model xception \
--binary True \
--epochs 5 \
--batch-size 32 \
--adv-train pgd \
--eps 8 \
--alpha 2 \
--pgd-steps 5Evaluate on clean, FGSM, and PGD adversarial examples:
python -m src.eval \
--ckpt outputs/last-xception.pt \
--binary True \
--eps 8 \
--alpha 2 \
--pgd-steps 10This generates:
outputs/metrics_clean_fgsm_pgd.csv- Evaluation metricsoutputs/roc_clean.png- ROC curve plot
python -m src.gradcam_viz \
--ckpt outputs/last-xception.pt \
--binary True \
--num-images 12Outputs are saved to outputs/gradcam/*.png
Vision Transformer:
python -m src.train --model vit_b16 --adv-train pgd --epochs 5ResNet-50:
python -m src.train --model resnet50 --adv-train fgsm --eps 4Without Adversarial Training:
python -m src.train --model xception --adv-train nonepython -m src.train --model xception --binary False --epochs 5face-explainability/
├── src/
│ ├── data.py # Dataset loading (Hugging Face)
│ ├── models.py # Model architectures (Xception, ViT, ResNet)
│ ├── attacks.py # Adversarial attacks (FGSM, PGD)
│ ├── metrics.py # Evaluation metrics (Accuracy, F1, AUC, ARI)
│ ├── utils.py # Utility functions
│ ├── train.py # Training script
│ ├── eval.py # Evaluation script
│ └── gradcam_viz.py # Grad-CAM visualization
├── outputs/ # Runtime outputs
│ ├── *.pt # Model checkpoints
│ ├── *.csv # Evaluation metrics
│ ├── *.png # Plots
│ └── gradcam/ # Grad-CAM images
├── config.example.yaml # Configuration template
├── requirements.txt # Python dependencies
└── README.md # This file
The code uses the AI-vs-Deepfake-vs-Real dataset from Hugging Face:
- Dataset:
prithivMLmods/AI-vs-Deepfake-vs-Real - Automatically downloaded on first run
- Supports binary (Real vs Fake) and tri-class (Artificial vs Deepfake vs Real) classification
- Accuracy: Overall classification accuracy
- Precision/Recall/F1: Per-class metrics
- AUC-ROC: Area under ROC curve
- ARI (Adversarial Robustness Index):
acc_adv / acc_clean- measures robustness under attack
- FGSM (Fast Gradient Sign Method): Single-step attack
- PGD (Projected Gradient Descent): Multi-step iterative attack (stronger)
Perturbation budgets (eps) are specified in 0..255 pixel space and automatically scaled to [0, 1] for model inputs.
Grad-CAM visualizations highlight facial regions that influence the model's decision:
- Real faces: Model typically focuses on eyes, nose, mouth
- Fake faces: Model often highlights blending boundaries, forehead, chin (artifact regions)
Copy config.example.yaml to config.yaml and modify as needed. The config file supports all training and evaluation parameters.
- Python 3.9+
- PyTorch 2.2+
- CUDA-capable GPU (recommended for training)
- See
requirements.txtfor full dependency list
If you use this code in your research, please cite:
@article{kotov2025adversarial,
title={Adversarial Robustness and Explainability in AI-Generated Face Detection},
author={Kotov, Georgi},
journal={Technical University of Sofia},
year={2025}
}This project is for research purposes. Please respect dataset licenses and usage terms.
- Hugging Face for dataset hosting
timmlibrary for pretrained modelspytorch-grad-camfor explainability tools