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 with in_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_score
  • train.py β€” full training pipeline (5-fold, EMA, forensic augs)
  • infer.py β€” batch inference β†’ submission.csv (--test_dir parameterized)
  • metric.py β€” FREUID score implementation
  • app.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.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support