【隐私计算篇】利用多方安全计算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(); // 获…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
