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).

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