【隐私计算篇】利用多方安全计算MPC实现VGG16人脸识别隐私推理
1. 背景介绍
本文主要介绍一种利用多方安全计算MPC技术,实现VGG16的人脸识别模型,侧重于模型推理阶段,目前已经公开专利,因此以下内容的分享都是基于公开材料。该分享涉及到最小化多方安全计算(MPC)以及明密文混合计算的思想,仅供参考。
人脸识别是一种基于生物特征识别技术的身份验证和识别方法,在多种场景中广泛应用,比如安防、银行、终端设备等,更贴近生活的还有支付宝的扫脸支付。人脸识别在各领域的广泛应用带来了便利,但也引发了隐私和数据安全方面的讨论以及担忧,传统的人脸识别系统在数据采集、存储和处理过程中很可能会存在隐私泄露的风险。
比如传统人脸识别系统通常需要将用户的面部数据上传到中央服务器进行处理,如果这些数据被黑客入侵、内部人员滥用或系统漏洞利用,可能会导致用户敏感信息泄露。此外,某些公司或机构可能会将收集到的人脸数据用于未经用户同意的商业或其他用途,侵犯个人隐私。
鉴于上述原因,很有必要采用隐私保护技术。隐私计算技术(如联邦学习、差分隐私、多方安全计算等)允许在不直接共享原始数据的前提下进行人脸识别模型的训练和推理,从而防止数据滥用和泄露。实现隐私计算的人脸识别是为了在保证人脸识别技术有效性的同时,最大程度地保护用户的个人隐私。
2. 算法介绍
本文主要介绍利用安全多方计算(MPC)实现VGG16人脸识别模型的推理预测。在介绍具体算法之前,需要对MPC有一定的了解,有助于理解后续的深度学习算法隐私计算化改造。安全多方计算(MPC)是一种密码学技术,它允许多个参与方在不泄露各自私有数据的前提下,协同计算一个共同的函数结果。关于MPC的介绍,这里不做详细展开,有兴趣的话可以看下冯登国院士关于MPC的基础知识分享,包括 基于秘密分享方法的MPC以及基于混淆电路方法的MPC,另外关于混淆电路的知识也可以参考我们之前的文章《混淆电路深入浅出》,涉及的密码原语不经意传输可以参考我们的系列文章《OT&OT扩展(不经意传输扩展)深入浅出》、《不经意传输协议(OT/OTE)的进一步补充》。
2.1 具体算法介绍
整体算法介绍会涉及采集端分片处理、分布式存储、分布式推理、模型本身的MPC化等工作。
2.1.1 人脸分布式存储
在人脸图像采集、识别环节都采用分片形式的分布式存储。采用MPC加性碎片形式,将原始人脸图像数据分成多个小碎片,每个碎片单独存储在不同的存储节点上,不同的存储点可以分布在物理独立的地区,即使某个库被攻破,也无法窃取到具体的人脸明文数据。
2.1.2 VGG模型介绍
在进行VGG模型的改造之前,也调研了相应的其他模型,比如AlexNet模型,总体来看,结构类似,但vgg的层数更深、参数更多。
AlexNet: 共有 8 层,其中 5 层是卷积层,3 层是全连接层。
VGG16: 共有 16 层,其中包括 13 层卷积层和 3 层全连接层【1,2】。
VGG16由13个卷积层、5个最大池化层和3个全连接层组成。因此,具有可调参数的层数为16(13个卷积层和3个全连接层)。这也是该模型被命名为VGG16的原因。第一组卷积层中的滤波器数量为64,之后每个卷积模块中的滤波器数量逐步加倍,直到达到512个。该模型最后由两个全连接隐藏层和一个输出层构成。两个全连接隐藏层的神经元数量相同,均为4096。
因此从模型的结构、复杂度、参数量来看,vgg会比alexnet更强大,因此我们选择vgg16作为mpc化改造的基座模型。
2.1.3 VGG模型MPC化
对于VGG模型的mpc化方案,同样也适合AlexNet网络结构,可以迁移使用。该面向的多方计算场景为两方,当然也可以平滑扩展到N方,但考虑到推理的耗时问题,两方、三方会比较合适。因为随着参与方的增多,进行矩阵乘法的时候,彼此之间的通信量会显著增加。另外,场景面向的是1对N的人脸识别任务。
方案描述
对人脸特征提取算法MPC化,将人脸特征提取算法进行拆分,拆分成若干层,每层都是基本的CNN中的处理层,包括卷积层、激活层、池化层、全连接层等。对每个层次进行MPC化改造,在保证
安全性的情况下进行特定的优化。首先对单层MPC改造的优化,包括卷积层的MPC化、激活层的MPC化、池化层的MPC化、全连接层的MPC化,其次对多个层次的组合优化。
2.1.3.1 对单层MPC改造的优化
将人脸特征提取算法进行拆分,拆分成若干层,每层都是基本的CNN中的处理层,包括卷积层、激活层、池化层、全连接层等,对每个层次进行MPC化改造,在保证安全性的情况下进行特定的优
化。
(1)卷积层的MPC化
方式一: 执行纯碎片态的卷积操作,其中生物信息输入是以碎片态,而卷积核采用明文态。
步骤:
各个参与方用本方碎片化的输入与明文态的卷积核进行向量内积计算,得到碎片态的卷积输入结果。卷积层的MPC化改造不涉及到交互,仅在各个参与方内部进行本地化碎片态的计算。
此外,在某些场景下,也可以选择完全碎片态的卷积核执行分布式MPC计算。更加安全。
方式二: 随机部分恢复后卷积,我们也称之为随机掩码态。
这种模式下,各参与方在本地会进行随机恢复某些信息,但不足以用于判别,并且每一次使用都会用户重分片处理,重新随机。各个参与方随机恢复出明文,非明文位置用0填充,在本地进行
明文卷积运算,得到碎片态输出。这里有个注意点,需要设计一种新的随机化策略,避免恢复对于卷积贡献度较大的随机块。此外,应用该方法,对于输入的矩阵块大小有一定的要求,因为size过小容易造成信息的暴露,所以对于矩阵块的大小以及随机化策略需要重点考虑。
(2)激活层的MPC化
参与方之间需要根据某种机制形成互补的索引集合,标注各个参与方在此步中需要恢复处明文的索引,根据索引各方相互交互,恢复部分明文。各方根据自己恢复出的明文,进行本地明文下的激活函数计算。各方对持有的激活函数计算出来的明文结果进行重分片。由于后续需要对激活层的记过进行进一步的卷积、池化等层操作,参与方在本层恢复出来的明文,在后续的层操作中需要与其他
自己不掌握数据的索引位置进行相应计算,所以随机部分明文化激活操作,不会泄露隐私数据。
这里给出一种数值处理示例:
(3)池化层的MPC化
参与方之间形成互补的池子索引集合,双方恢复各自掌握的池子里的明文信息。对自己恢复的池子里的数据进行本地明文池化。参与方对自己掌握的池化结果进行重分片。
(4)全连接层的MPC化
各个参与方根据公开的权重参数,进行向量内积计算,获得全连接的输出结果,这里采用的是纯MPC乘法计算方式。
2.1.3.2 对多层的组合优化
由于大多数特征提取算法中的单个层次之间的组合模式较为通用。例如"卷积->池化->激活"的操作,可以作如下的进一步优化。对于较为常用的层次组合,可定制化开发优化的算子。
2.1.3.3 MPC化推理模块组成
以下展示整体模型的MPC化推理示例:
2.2 MPC人脸识别系统的整体架构
模型训练参数的生成,可以采用完全MPC的方式直接生成碎片态参数,也可以采用明文训练后对模型参数进行碎片化处理。具体的方式根据实际业务需求进行选择。
(1)一种模型训练参数的碎片化处理方式
(2)人脸识别推理的处理流程
(3)代码示例
使用mpc化的模型,其使用方式和普通的明文模型其实很类似,只不过内部的底层算子是MPC的基本算子,其中的Conv2D、MaxPooling2D、Flatten、activation都是MPC化的算子。
代码使用示例:
def VGG16(x):# Block 1kernel, bias = get_kernel_bias_by_name('conv1_1')x = Conv2D(64, (3, 3), activation='relu', padding='same', name='conv1_1')(x, kernel, bias)kernel, bias = get_kernel_bias_by_name('conv1_2')x = Conv2D(64, (3, 3), activation='relu', padding='same', name='conv1_2')(x, kernel, bias)x = MaxPooling2D((2, 2), strides=(2, 2), name='pool1')(x)# Block 2kernel, bias = get_kernel_bias_by_name('conv2_1')x = Conv2D(128, (3, 3), activation='relu', padding='same', name='conv2_1')(x, kernel, bias)kernel, bias = get_kernel_bias_by_name('conv2_2')x = Conv2D(128, (3, 3), activation='relu', padding='same', name='conv2_2')(x, kernel, bias)x = MaxPooling2D((2, 2), strides=(2, 2), name='pool2')(x)# Block 3kernel, bias = get_kernel_bias_by_name('conv3_1')x = Conv2D(256, (3, 3), activation='relu', padding='same', name='conv3_1')(x, kernel, bias)kernel, bias = get_kernel_bias_by_name('conv3_2')x = Conv2D(256, (3, 3), activation='relu', padding='same', name='conv3_2')(x, kernel, bias)kernel, bias = get_kernel_bias_by_name('conv3_3')x = Conv2D(256, (3, 3), activation='relu', padding='same', name='conv3_3')(x, kernel, bias)x = MaxPooling2D((2, 2), strides=(2, 2), name='pool3')(x)# Block 4kernel, bias = get_kernel_bias_by_name('conv4_1')x = Conv2D(512, (3, 3), activation='relu', padding='same', name='conv4_1')(x, kernel, bias)kernel, bias = get_kernel_bias_by_name('conv4_2')x = Conv2D(512, (3, 3), activation='relu', padding='same', name='conv4_2')(x, kernel, bias)kernel, bias = get_kernel_bias_by_name('conv4_3')x = Conv2D(512, (3, 3), activation='relu', padding='same', name='conv4_3')(x, kernel, bias)x = MaxPooling2D((2, 2), strides=(2, 2), name='pool4')(x)# Block 5kernel, bias = get_kernel_bias_by_name('conv5_1')x = Conv2D(512, (3, 3), activation='relu', padding='same', name='conv5_1')(x, kernel, bias)kernel, bias = get_kernel_bias_by_name('conv5_2')x = Conv2D(512, (3, 3), activation='relu', padding='same', name='conv5_2')(x, kernel, bias)kernel, bias = get_kernel_bias_by_name('conv5_3')x = Conv2D(512, (3, 3), activation='relu', padding='same', name='conv5_3')(x, kernel, bias)x = MaxPooling2D((2, 2), strides=(2, 2), name='pool5')(x)# Block 6kernel, bias = get_kernel_bias_by_name('fc6')x = Conv2D(4096, (7, 7), activation='relu', name='fc6')(x, kernel, bias)# x = Dropout(0.5, name='fc6/dropout')(x)kernel, bias = get_kernel_bias_by_name('fc7')x = Conv2D(4096, (1, 1), activation='relu', name='fc7')(x, kernel, bias)# x = Dropout(0.5, name='fc7/dropout')(x)kernel, bias = get_kernel_bias_by_name('fc8')x_fc = Conv2D(1024, (1, 1), name='fc8')(x, kernel, bias)x_flatten = Flatten(name='flatten')(x_fc)return x_flattendef deepface(random_idx, output_path, img):# y: [5947, 1024] 图像特征碎片化数据库y = mpc.read(ff_db_5947, 5947, 1024, ss_img_feature_db)# x: [1, 224, 224, 3] 图像数据碎片x = mpc.read_img(random_idx, 1, [224, 224, 3], ss_img)# 模型推理得到的输出x = VGG16(x) # -> [1, 1024]
3. 参考材料
【1】An overview of VGG16 and NiN models
【2】Difference between AlexNet, VGGNet, ResNet, and Inception
【3】GitHub - rcmalli/keras-vggface: VGGFace implementation with Keras Framework
相关文章:

【隐私计算篇】利用多方安全计算MPC实现VGG16人脸识别隐私推理
1. 背景介绍 本文主要介绍一种利用多方安全计算MPC技术,实现VGG16的人脸识别模型,侧重于模型推理阶段,目前已经公开专利,因此以下内容的分享都是基于公开材料。该分享涉及到最小化多方安全计算(MPC)以及明密文混合计算的思想&…...
Python 入门教程(3)基础知识 | 3.7、pass 关键字
文章目录 一、pass 关键字1、定义与用法2、pass 关键字的用法2.1、函数定义中的占位符2.2、 类定义中的占位符2.3、条件语句中的占位符2.4、循环中的占位符 3、注意事项 一、pass 关键字 1、定义与用法 pass语句用作将来代码的占位符。当执行pass语句时,不会有任何…...

nodejs基于vue+express度假村旅游管理系统设计与实现7t82p
目录 功能介绍数据库设计具体实现截图技术栈技术论证解决的思路论文目录核心代码风格详细视频演示源码获取 功能介绍 实现了一个完整的农家乐系统,其中主要有用户表模块、关于我们模块、收藏表模块、公告信息模块、酒店预订模块、酒店信息模块、景区信息模块、景区…...

【裸机装机系列】16.kali(ubuntu)-安装linux和win双系统-重装win11步骤
推荐阅读: 1.kali(ubuntu)-为什么弃用ubuntu,而选择基于debian的kali操作系统 注意: 要先装windows,再装linux,不然linux的启动分区会被覆盖掉。为什么双系统要先装windows呢? 在一个新硬盘上࿰…...
基于TypeScript+React+AntDesign 的车辆车型管理页面
项目目录结构: my-app/├── node_modules/├── public/├── src/│ ├── App.js│ ├── VehicleForm.js│ └── index.js├── package.json└── README.md目录 1.创建项目 2.列表页面VehicleForm.js,预留接口使用axios 1.创建项目 npx crea…...
sentinel-dashboard数据 redis 持久化
概述 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来…...

【C++】——vector深度剖析模拟实现
低头赶路,敬事如仪 目录 1、模拟vector 1.1底层结构 1.2构造析构 1.3尾插扩容 1.4迭代器 1.5增删查改 1.6模拟中的注意事项 2、vector模拟补充 2.1迭代器区间构造问题 2.2memcpy深浅拷贝问题 2.3动态二维数组的模拟及遍历 1、模拟vector 想要模拟实现自…...
OpenCV特征检测(11)从一组点中检测直线的函数
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在一组点中使用标准霍夫变换查找直线。 该函数使用霍夫变换的一种改进方法在一组点中查找直线。 HoughLinesPointSet 是 OpenCV 中的一个函数&a…...

C++_24_适配器
A 函数对象 概念: 重载函数调用运算符的类实例化的对象,就叫函数对象.又名仿函数,函数对象和()触发重载函数调用运算符的执行。 作用: 为算法提供策略 示例: #include <iostream> using namespace s…...

算法.图论-并查集
文章目录 1. 并查集介绍2. 并查集的实现2.1 实现逻辑2.2 isSameSet方法2.3 union方法(小挂大优化)2.4 find方法(路径压缩优化) 3. 并查集模板4. 并查集习题4.1 情侣牵手4.2 相似字符串组 1. 并查集介绍 定义: 并查集是一种树型的数据结构,用于处理一些不…...
elasticSearch常见命令及历史数据迁移
es这种非关系型数据库,感觉可视化效果不是很好,个人在操作中,习惯性通过简单的方式去访问。也是接触不久。只能出一些基操。共同学习记录,大家有好的操作也可留言备注。 1,常见命令 1)查询有哪些index&…...

WebLogic 漏洞复现
1、后台弱⼝令GetShell 默认账号密码:weblogic/Oracle123 weblogic常⽤弱⼝令:https://cirt.net/passwords?criteriaweblogic 这⾥注意, 单个账号错误密码5次之后就会⾃动锁定。 http://47.121.212.195:7001/console 2、登录后台后&#…...
web基础:域名、网页、HTML、web版本
文章目录 引言域名网站访问方式域名结构域名解析DNS解析过程 网页网页文件类型静态网页与动态网页常用动态网页编程语言 HTMLHTML 语法规则HTML 文件结构HTML 文件基本结构示例:常用 HTML 标签HTML文件基本结构 WEB版本 引言 web(World Wide Web&#x…...

【项目案例】物联网比较好的10+练手项目推荐,附项目文档/源码/视频
练手项目推荐 1 智能小车 项目功能介绍: 本项目由三部分组成:应用端(微信小程序)、设备端(Hi3861)、驱动端(UPS)。 1. 应用端,采用微信小程序作为应用端控制界面。在开…...

AWS注册时常见错误处理
引言 创建AWS账号是使用AWS云服务的第一步,但在注册过程中可能会遇到一些常见的问题。本文中九河云将帮助您排查和解决在创建AWS账户时可能遇到的一些常见问题,包括未接到验证电话、最大失败尝试次数错误以及账户激活延迟等。 常见问题及解决方法 1. …...

Spark-RDD持久化
一、Spark的三种持久化机制 1、cache 它是persist的一种简化方式,作用是将RDD缓存到内存中,以便后续快速访问,提高计算效率。cache操作是懒执行的,即执行action算子时才会触发。 2、persist 它提供了不同的存储级别࿰…...

vue2中使用tailwindCss 详细教程
1、先看官方文档:https://www.tailwindcss.cn/ 2、先安装:npm install -D tailwindcss ---------------通过 npm 安装 tailwindcss,然后创建你自己的 create your tailwind.config.js 配置文件。 npm install -D tailwindcss 3、初始化文件—npx tailwindcss init npx ta…...
机器视觉工程师一直做调试,维护岗位,想转岗软件方面C#从零开始,快则三年不到,慢则一辈子不会
其实不是每一家做视觉检测,或者是做设备必须要机器视觉工程师开发,其实公司对标准软件更感兴趣,主要非常高的性价比,省时省钱省人。所以这里有个问题,就是公司平台的重要性,首先他对开发是刚需,…...

【初阶数据结构】详解二叉树 - 树和二叉树(三)(递归的魅力时刻)
文章目录 前言1. 二叉树链式结构的意义2. 手搓一棵二叉树3. 二叉树的遍历(重要)3.1 遍历的规则3.2 先序遍历3.3 中序遍历3.4 后序遍历3.5 遍历的代码实现3.5.1 先序遍历代码实现3.5.2 中序遍历代码实现3.5.3 后序遍历代码实现 4. 统计二叉树结点的个数5.…...
【QT】QWidget 重要属性
文章目录 enabledgeometrywindowTitlewindowIconqrc 机制windowOpacitycursorfontQFont toolTip 和 toolTipDurationfocusPolicyQt::FocusPolicy styleSheet enabled 作用:设置控件是否可使用. true 表⽰可用, false 表⽰禁用. 对应的API bool isEnabled(); // 获…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...