【隐私计算篇】利用多方安全计算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

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1542988.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA开源项目 甘肃非物质文化网站 计算机毕业设计

本文项目编号 T 043 ,文末自助获取源码 \color{red}{T043,文末自助获取源码} T043,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

python画图|把X轴标签移动到图像顶端

在前述学习过程中,我们一直使用的是默认的轴坐标,X轴往往置于图像的下端。 有时候,也会有将X轴标签放置在图形顶端的需求,今天就一起学习一下。 【1】官网教程 首先打开官网,可以通过下述链接一步直达: …

软考高级:系统安全 -区块链特点:去中心化、开放性、自治性、安全性、匿名性

讲解 生活化例子 想象一下,你和朋友们玩一个共享账本的游戏。每个人都可以在账本上记账,没人可以单独改动账本,大家都可以随时查看账本内容,也不用再信任某个单独的人来管理账本。这就类似于区块链的工作原理。 概念讲解 去中…

基于c++实现的简易shell

代码逻辑 核心思想 解析命令行,拆解命令及其选项创建子进程,在子进程中执行命令如果是前台执行命令,则父进程就阻塞等待子进程中命令执行结束后回收子进程的资源如果是后台执行命令,则父进程不进行阻塞等待,可继续向下…

【机器学习】---神经架构搜索(NAS)

这里写目录标题 引言1. 什么是神经架构搜索(NAS)1.1 为什么需要NAS? 2. NAS的三大组件2.1 搜索空间搜索空间设计的考虑因素: 2.2 搜索策略2.3 性能估计 3. NAS的主要方法3.1 基于强化学习的NAS3.2 基于进化算法的NAS3.3 基于梯度的…

【数据结构】图的遍历

快乐的流畅:个人主页 个人专栏:《C游记》《进击的C》《Linux迷航》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、深度优先遍历1.1 定义1.2 实现 二、广度优先遍历2.1 定义2.2 实现 三、DFS与BFS的对比 引言 前置知识&…

linux用户管理运行级别找回root密码

目录 1.用户的添加 1.1用户添加的基本指令 1.2不指定家目录的名称 1.3指定家目录的名称 2.密码的修改 3.删除目录 3.1删除的两个情况 3.2删除的流程 4.查询用户的信息 5.用户的切换 6.用户组 6.1用户组的概念 6.2创建用户到指定的组 6.3修改用户到其他的组 6.4用…

SpringCloud Alibaba之Sentinel实现熔断与限流

(学习笔记) QPS(Query Per Second):即每秒查询率,是对⼀个特定的查询服务器在规定时间内所处理流量多少的衡量标准。QPS req/sec 请求数/秒,即每秒的响应请求数,也即是最⼤吞吐能⼒…

ATTCK实战系列-Vulnstack三层网络域渗透靶场(一)

ATT&CK实战系列-Vulnstack三层网络域渗透靶场(一) 一、环境搭建1.1 靶场拓扑图1.2 靶场下载链接1.3 虚拟机配置1.3.1 Windows 7 (web服务器)1.3.2 Windows 2008 (域控)1.3.3 Win2k3 (域内主机) 二、外网打点突破2.1 信息搜集2.2 phpmyadmin 后台 Get…

肾癌的多模态预测模型-临床-组织学-基因组

目录 摘要 技术路线 ① lncRNA的预测模型 ②病理 WSI 的分类器 ③临床病理分类器 模型结果 与别的模型比较 同行评审学习 1)使用lncRNA的原因 2)模型临床使用意义 3)关于截止值的使用 摘要 A multi-classifier system integrated…

.NET常见的5种项目架构模式

前言 项目架构模式在软件开发中扮演着至关重要的角色,它们为开发者提供了一套组织和管理代码的指导原则,以提高软件的可维护性、可扩展性、可重用性和可测试性。 假如你有其他的项目架构模式推荐,欢迎在文末留言🤞!&a…

Java_Day04学习

类继承实例 package com.dx.test03; public class extendsTest {public static void main(String args[]) {// 实例化一个Cat对象,设置属性name和age,调用voice()和eat()方法,再打印出名字和年龄信息/********* begin *********/Cat cat ne…

实战OpenCV之直方图

基础入门 直方图是对数据分布情况的图形表示,特别适用于图像处理领域。在图像处理中,直方图通常用于表示图像中像素值的分布情况。直方图由一系列矩形条(也被称为bin)组成,每个矩形条的高度表示某个像素值(…

鸿蒙设置,修改APP图标和名称

1、先看默认的图标和名称 2、打开项目开始设置自己需要的图标和名称 2.1找到 路径src\main\module.json5, 找到 abilities,下的,图标icon、名称label,label可以按住ctrl鼠标左键点击跳转 2.2先修改APP名称 1、ctrl鼠标左键点击…

华为OD机试 - 选修课(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

【C语言零基础入门篇 - 15】:单链表

文章目录 单链表链表的基本概念单链表功能的实现单链表的初始化单链表新结点的创建单链表头插法单链表的输出单链表的查找单链表修改单链表的删除单链表所有数据结点释放源代码 单链表 链表的基本概念 一、什么是链表? 链表是数据结构中线性表的一种,其…

华为OD机试 - 需要打开多少监控器(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

软考高级:数据库保持函数依赖和有损无损分解 AI 解读

讲解 生活化例子 想象你经营着一家快餐店,店里有各种商品,你也记录了每天的销量。你有一个表格,记录了「商品名称」、「价格」、「库存数量」、「供应商信息」等数据。最开始,你可能把所有数据都写在一张表上,但时间…

2024年9月22日---关于MyBatis框架(1)

一 Mybatis概述 1.1 简介 MyBatis(官网:mybatis – MyBatis 3 | 简介 )是一款优秀的开源的 持久层 框架,用于简化JDBC的开发。是 Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code&#xff0c…

PCL 随机下采样

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、概述 随机下采样 是一种常用的点…