FREUID 2026 β Identity Document Fraud Detector
A two-stream forensic detector for spotting manipulated identity documents across three attack families: physical tampering, GenAI/digital edits, and print-and-recapture. Built for the IJCAI-ECAI FREUID 2026 challenge (unconstrained ID-document fraud detection).
Why two streams?
No single view catches every attack, so the model sees the image through two lenses at once:
| Stream | Channels | Catches |
|---|---|---|
| RGB | 3 | semantics, layout errors, GenAI "look" |
| SRM noise residual | 3 | splice/edit seams invisible to the eye |
These are stacked into a 6-channel input to a ConvNeXt-V2 backbone.
Method
- Backbone:
convnextv2_base.fcmae_ft_in22k_in1k_384, pretrained, fine-tuned within_chans=6 - Forensic augmentation: JPEG re-compression + moirΓ© (print-recapture) simulation
- Training: 5-fold stratified (label Γ document-type), AdamW, cosine schedule, EMA
- Checkpoint selection: best FREUID score (not loss)
- Inference: horizontal-flip TTA; multi-fold via rank-averaging
Metric
The challenge metric rewards both global ranking and performance at a strict operating point:
FREUID = 1 β harmonic_mean(AUC, TPR@1%FPR) # lower is better
AUC= overall separation (= 1 β area under the Detection Error Trade-off curve)TPR@1%FPR= fraction of attacks caught while flagging only 1% of genuine documents
Results (internal cross-validation)
On a held-out validation split, the best fold reached:
| value | |
|---|---|
| FREUID | ~0.0001 |
| AUC | 0.9999 |
| TPR@1%FPR | 0.9998 |
Honest note: the near-perfect separation was learned inconsistently across folds (1 of 3 folds "cracked" the dominant discriminative signal; the others plateaued at AUC β 0.92). This is a known shortcut-learning effect β the dataset contains a strong, suddenly-learnable signal. Reported numbers are internal validation, not an official leaderboard score. Treat them as an upper-bound indication, not a guarantee of generalization to unseen document types.
Files
freuid_fold1.ptβ trained weights (best fold)inference.pyβ standalone loader +predict(image) -> fraud_scoretrain.pyβ full training pipeline (5-fold, EMA, forensic augs)infer.pyβ batch inference βsubmission.csv(--test_dirparameterized)metric.pyβ FREUID score implementationapp.pyβ Gradio demo (upload an ID image β fraud score)
Usage
import torch, cv2, numpy as np
from inference import load_model, predict
model = load_model("freuid_fold1.pt") # CPU or CUDA
img = cv2.cvtColor(cv2.imread("doc.jpg"), cv2.COLOR_BGR2RGB)
score = predict(model, img) # 0..1, higher = more likely fraud
print(f"fraud score: {score:.3f}")
Intended use & limitations
- Use: research / educational demonstration of forensic ML for document fraud.
- Not for production identity verification without further validation on representative, consented data and fairness/bias auditing across document types and demographics.
- Performance on unseen document types / new attack generators is unverified.
Author
Built as an applied AI Γ Security project β forensic signal analysis, adversarial (attack-simulating) augmentation, and detection-metric-aware training.