
Implementación de referencia del reconocimiento facial con preservación de la privacidad mediante secret sharing replicado en MP-SPDZ, con inferencia cuantizada de GhostFaceNet, benchmarks y herramientas de QAT.
Implementación oficial de GhostFaceMPC: Privacy-Preserving Face Recognition with Multi-Party Computation (Davide Carnemolla, Dario Catalano, Mario Di Raimondo — Universidad de Catania). Artículo: Cryptology ePrint Archive, Paper 2026/2499.
GhostFaceMPC ejecuta el reconocimiento facial con GhostFaceNetV1 (ancho 1.3, stride 1, cabeza ArcFace, entrenado con MS1MV3) entre tres servidores con replicated secret sharing en MP-SPDZ.
replicated-ring-party) y
malicioso con aborto (ps-rep-ring-party).Este repositorio contiene exactamente el código necesario para reproducir los experimentos del artículo.
@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}
}
| Ruta | Qué es |
|---|---|
src/ghostmpc/ | Paquete de Python y línea de comandos ghostmpc |
src/ghostmpc/codegen/ | compilador del manifiesto del modelo a un programa MP-SPDZ |
src/ghostmpc/eval/ | oráculo de anillo en texto claro (bit-exacto con el programa MPC) y evaluación de precisión |
src/ghostmpc/benchmark/ | arnés de benchmark de tres partes y redes emuladas |
src/ghostmpc/training/ | entrenamiento con cuantización consciente sobre el paso hacia adelante fiel al anillo |
third_party/patches/ | las instrucciones de máquina virtual que este trabajo añade a MP-SPDZ |
baselines/ | las líneas base: TensorFlow en texto claro, MP-SPDZ ingenuo, EzPC/Porthos |
run_experiments.sh | un único script que ejecuta todos los experimentos del artículo |
scripts/ | configuración, emulación de red sin root, recopilación de tablas |
tests/ | pruebas unitarias (pytest) |
Máquina. Linux sobre x86-64. El artículo utilizó una VM de 32 núcleos (Intel Xeon Gold 6238R) y ejecuta 8 hilos por parte. Los tres servidores se ejecutan en un solo host.
Python. Python ≥ 3.10 (probado con 3.11).
Dependencias de compilación de MP-SPDZ (lista upstream):
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
Emulación LAN/WAN. Requiere iproute2 (ip, tc), iputils-ping,
unshare (util-linux) y namespaces de usuario sin privilegios. El script no necesita
root. En Debian/Ubuntu: sudo sysctl kernel.unprivileged_userns_clone=1.
Solo la línea base de Porthos.
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 hace cuatro cosas:
.venv e instala el paquete. Esto descarga tensorflow-cpu,
Pillow, onnx, onnxruntime y onnxsim.third_party/MP-SPDZ:
third_party/patches/;MY_CFLAGS += -DRING_SIZE=32 en CONFIG.mine);replicated-ring-party.x y ps-rep-ring-party.x;Los archivos del modelo se colocan en artifacts/:
| Archivo | Contenido |
|---|---|
GhostFaceNet_W1.3_S1_ArcFace.h5 | teacher en coma flotante, de la release de GhostFaceNets |
model/ | el modelo cuantizado ring32/f6/f_w9, con sus informes de precisión |
model-ring64-f16-b0/ | manifiesto ring64 del que se exporta la línea base de Porthos |
legacy-scalar-236/ | manifiesto ring64/f20 de la línea base ingenua de MP-SPDZ |
Los bundles son assets de release de este repositorio, y cada archivo se
verifica contra su SHA-256. ghostmpc fetch-bundles --bundle qat-start también
descarga el manifiesto desde el que arranca QAT (véase §5).
El experimento de precisión y la línea base en texto plano leen cinco conjuntos
de evaluación de InsightFace: LFW, AgeDB-30, CALFW, CPLFW y CFP-FP. Utilice los archivos .bin
distribuidos con los datos de entrenamiento MS1MV3 del
zoo de conjuntos de datos de InsightFace
y colóquelos como:
datasets/benchmarks/{lfw,agedb_30,calfw,cplfw,cfp_fp}.bin
scripts/setup.sh los verifica contra los digests SHA-256 que utilizamos. Los benchmarks de MPC no necesitan los conjuntos de datos: su comunicación no depende de los valores de entrada, por lo que comparten de forma secreta entradas sintéticas.
./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
Los resultados van a results/ (un report.json y un summary.csv por ejecución), y
tables escribe results/tables.md con el diseño del artículo. Los objetivos se pueden
ejecutar por separado y en cualquier orden. Una ejecución cuyo informe ya existe se omite.
| Objetivo | Artículo | Tiempo de ejecución en nuestra máquina (aprox.) |
|---|---|---|
accuracy | tabla de comparación, columnas de precisión | 3 h por conjunto de datos por núcleo; dividir con WORKERS |
verification | Face Verification Benchmarks: HbC y M, Co-Host / LAN / Fast-WAN / WAN | ~6 h |
identification | Face Identification Benchmarks: 1:128 conjunto cerrado, misma cuadrícula | ~6 h |
plaintext | tabla de comparación, fila de TensorFlow | 1 min |
naive | tabla de comparación, fila de MP-SPDZ (naive) | ~1 h incluyendo compilación |
porthos | tabla de comparación, fila de EzPC (Porthos) | ~5 min de compilación + ~1.5 h |
baselines | las tres líneas base | |
ablation | tabla de ablación: las optimizaciones una a una, desde la línea base naive hasta GhostFaceMPC (HbC, co-host) | ~4 h |
Variables de entorno: