DecoyFace
Implementation of DecoyFace split face recognition privacy protection: client-side Decoy-Guided Coherent Mixing (DGCM) and the server-side Authorized Canonicalization Module (ACM), together with the scripts that build the Reconstruction-Sensitive Subspace Decomposition (RSSD) statistics and train the server backbone.
The client encoder F_c is AdaFace IR-50 (MS1MV2) stem + stage 1 (output 64x56x56);
the server backbone F_s is the rest of the IR-50.
Files
| File | Content |
|---|---|
decoyface.py |
DecoyProtector: protect(z_A, z_B) (client, DGCM) and server_recover(z_t) (server, ACM) |
models.py |
IR-50, its split into ClientEncoder (F_c) / ServerBackbone (F_s), and the proxy inversion U-Net used by RSSD |
common.py |
DecoyFace hyper-parameters CFG, fixed channel permutation, checkpoint paths |
data.py |
MS1M identity-folder dataset |
build_rssd.py |
Trains the proxy inversion U-Net, estimates the reconstruction-sensitive subspace -> checkpoints/rssd.pt |
build_bank.py |
Builds the auxiliary complementary bank and mu_rec -> checkpoints/bank.pt |
train_defender.py |
Trains F_s + ArcFace head on canonicalized protected features -> checkpoints/defender.pt |
Checkpoints
| File | Content |
|---|---|
checkpoints/adaface_ir50_ms1mv2.backbone.pth |
AdaFace IR-50 MS1MV2 backbone state dict (from https://github.com/mk-minchul/AdaFace) |
checkpoints/rssd.pt |
P_rec, P_N (64x64), U_rec, evals, sigma |
checkpoints/bank.pt |
aux_bank (5000x64x56x56, fp16), mu_rec (64x56x56), perm (64) |
proxy_unet.pt and defender.pt are not included.
Usage
import torch
from common import ADAFACE_CKPT, CKPT, CFG
from models import load_ir50, ClientEncoder
from decoyface import DecoyProtector
Fc = ClientEncoder(load_ir50(ADAFACE_CKPT, "cuda")).cuda().eval()
rssd = torch.load(CKPT / "rssd.pt", map_location="cuda")
bank = torch.load(CKPT / "bank.pt", map_location="cuda")
protector = DecoyProtector(rssd["P_rec"], rssd["P_N"], bank["mu_rec"],
bank["aux_bank"].float(), bank["perm"], CFG, "cuda")
# x, decoy: (B,3,112,112) RGB in [0,1], ArcFace-aligned; decoy is a different identity
with torch.no_grad():
z_t = protector.protect(Fc(x), Fc(decoy)) # transmitted by the client
z_can = protector.server_recover(z_t) # fed to F_s on the server
Rebuilding
MS1M root: identity folders named by integer, each holding 112x112 aligned .jpg faces.
Identities used: proxy U-Net first 5000, auxiliary bank 50000-60000, defender first 30000 (--num_ids).
python build_rssd.py --ms1m_root /path/to/ms1m
python build_bank.py --ms1m_root /path/to/ms1m
python train_defender.py --ms1m_root /path/to/ms1m
Scripts log to Weights & Biases (project decoyface-repro).
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐ Ask for provider support