
Implémentation de référence de la reconnaissance faciale préservant la vie privée à l'aide du partage de secret répliqué dans MP-SPDZ, avec inférence quantifiée de GhostFaceNet, benchmarks et outillage QAT.
Implémentation officielle de GhostFaceMPC: Privacy-Preserving Face Recognition with Multi-Party Computation (Davide Carnemolla, Dario Catalano, Mario Di Raimondo — Université de Catane). Article : Cryptology ePrint Archive, Paper 2026/2499.
GhostFaceMPC exécute la reconnaissance faciale avec GhostFaceNetV1 (largeur 1.3, stride 1, tête ArcFace, entraîné sur MS1MV3) entre trois serveurs avec un partage de secret répliqué dans MP-SPDZ.
replicated-ring-party) et
malveillant avec abandon (ps-rep-ring-party).Ce dépôt contient exactement le code nécessaire pour reproduire les expériences de l'article.
@misc{cryptoeprint:2026/2499,
author = {Davide Carnemolla and Dario Catalano and Mario Di Raimondo},
title = {{GhostFaceMPC}: Privacy-Preserving Face Recognition with Multi-Party Computation},
howpublished = {Cryptology {ePrint} Archive, Paper 2026/2499},
year = {2026},
url = {https://eprint.iacr.org/2026/2499}
}
| Chemin | Ce que c'est |
|---|---|
src/ghostmpc/ | Package Python et ligne de commande ghostmpc |
src/ghostmpc/codegen/ | compilateur du manifeste de modèle vers un programme MP-SPDZ |
src/ghostmpc/eval/ | oracle en clair sur anneau (bit-exact avec le programme MPC) et évaluation de la précision |
src/ghostmpc/benchmark/ | harnais de benchmark à trois parties et réseaux émulés |
src/ghostmpc/training/ | entraînement avec quantification sur la passe avant fidèle à l'anneau |
third_party/patches/ | les instructions de machine virtuelle que ce travail ajoute à MP-SPDZ |
baselines/ | les références : TensorFlow en clair, MP-SPDZ naïf, EzPC/Porthos |
run_experiments.sh | un script qui exécute toutes les expériences de l'article |
scripts/ | installation, émulation réseau sans privilèges root, collecte des tableaux |
tests/ | tests unitaires (pytest) |
Machine. Linux sur x86-64. L'article a utilisé une VM à 32 cœurs (Intel Xeon Gold 6238R) et exécute 8 threads par partie. Les trois serveurs tournent sur un seul hôte.
Python. Python ≥ 3.10 (testé avec 3.11).
Dépendances de compilation de MP-SPDZ (liste amont) :
sudo apt-get install automake build-essential clang cmake git libboost-dev \
libboost-filesystem-dev libboost-iostreams-dev libboost-thread-dev \
libgmp-dev libntl-dev libsodium-dev libssl-dev libtool python3 python3-venv
Émulation LAN/WAN. Nécessite iproute2 (ip, tc), iputils-ping,
unshare (util-linux) et les espaces de noms utilisateur non privilégiés. Le script ne nécessite pas
root. Sur Debian/Ubuntu : sudo sysctl kernel.unprivileged_userns_clone=1.
Porthos baseline uniquement.
libboost-system-devopam install ocamlbuild menhir ocamlfind stdintgit clone --recursive https://github.com/crypto-unict/ghostfacempc.git
cd ghostfacempc
scripts/setup.sh
scripts/setup.sh effectue quatre choses :
.venv et installe le paquet. Cela récupère tensorflow-cpu,
Pillow, onnx, onnxruntime et onnxsim.third_party/MP-SPDZ :
third_party/patches/ ;MY_CFLAGS += -DRING_SIZE=32 dans CONFIG.mine) ;replicated-ring-party.x et ps-rep-ring-party.x ;Les fichiers de modèle arrivent dans artifacts/ :
| Fichier | Contenu |
|---|---|
GhostFaceNet_W1.3_S1_ArcFace.h5 | enseignant float, issu de la version GhostFaceNets |
model/ | le modèle quantifié ring32/f6/f_w9, avec ses rapports de précision |
model-ring64-f16-b0/ | manifeste ring64 à partir duquel la référence Porthos est exportée |
legacy-scalar-236/ | manifeste ring64/f20 de la référence naïve MP-SPDZ |
Les bundles sont des ressources de version de ce dépôt, et chaque archive est
vérifiée par rapport à son SHA-256. ghostmpc fetch-bundles --bundle qat-start télécharge également
le manifeste à partir duquel QAT démarre (voir §5).
L'expérience de précision et la référence en clair lisent cinq ensembles
d'évaluation InsightFace : LFW, AgeDB-30, CALFW, CPLFW et CFP-FP. Utilisez les fichiers .bin
distribués avec les données d'entraînement MS1MV3 du
zoo de jeux de données InsightFace
et placez-les comme suit :
datasets/benchmarks/{lfw,agedb_30,calfw,cplfw,cfp_fp}.bin
scripts/setup.sh les vérifie par rapport aux empreintes SHA-256 que nous avons utilisées. Les benchmarks MPC n'ont pas besoin des jeux de données : leur communication ne dépend pas des valeurs d'entrée, ils partagent donc en secret des entrées synthétiques.
./run_experiments.sh --quick verification # smoke test, about one hour
./run_experiments.sh all # every table of the paper
./run_experiments.sh tables # print the tables measured so far
Les résultats sont écrits dans results/ (un report.json et un summary.csv par exécution), et tables écrit results/tables.md selon la disposition de l'article. Les cibles peuvent être exécutées séparément et dans n'importe quel ordre. Une exécution dont le rapport existe déjà est ignorée.
| Cible | Article | Durée d'exécution sur notre machine (approx.) |
|---|---|---|
accuracy | table de comparaison, colonnes de précision | 3 h par jeu de données par cœur ; répartir avec WORKERS |
verification | Face Verification Benchmarks : HbC et M, Co-Host / LAN / Fast-WAN / WAN | ~6 h |
identification | Face Identification Benchmarks : 1:128 ensemble fermé, même grille | ~6 h |
plaintext | table de comparaison, ligne TensorFlow | 1 min |
naive | table de comparaison, ligne MP-SPDZ (naive) | ~1 h incluant la compilation |
porthos | table de comparaison, ligne EzPC (Porthos) | ~5 min de compilation + ~1,5 h |
baselines | les trois baselines | |
ablation | table d'ablation : les optimisations une à une, de la baseline naive à GhostFaceMPC (HbC, co-host) | ~4 h |
Variables d'environnement :