HE 在人脸识别中的应用demo 演示文档
文章目录
- HE 在人脸识别中的应用demo 演示文档
- 说明
- 数据来源
- 过程步骤
-
- 一: 将input和database中的数据分别加密获得encrypt_probe_p和 encrypt_E_matrix
- 二: 计算 r i = dist ( p , c i ) ⋅ k \mathbf{r}_{i}=\operatorname{dist}\left(\mathbf{p}, \mathbf{c}_{i}\right) \cdot \mathbf{k} ri=dist(p,ci)⋅k
- 三: 将得到 R 进行移位叠加操作:
- 四: 将得到 R − > ( r 1 , 1 , r 2 , 1 , … r N , 1 ) R->\left(\mathbf{r}_{1,1}, \mathbf{r}_{2,1}, \ldots \mathbf{r}_{N, 1}\right) R−>(r1,1,r2,1,…rN,1):
- 最终结果展示
说明
使用的HE方案是
CKKS
/
| Encryption parameters :
| scheme: CKKS
| poly_modulus_degree: 8192
| coeff_modulus size: 200 (60 + 40 + 40 + 60) bits
| scale: pow(2.0,40)
\
- 输入数据的长度 n = 10 ,
- 因为没有用FaceNet数据集的缘故,演示所用的测试数据来源为简单生成,生成方式为:
- 编译平台: Visual Studio 2019
- 所需外部环境:
seal.h
;examples.h
;bits/stdc++.h
- 项目代码上传至: github: https://github.com/sizaif/SEALExamples/tree/main
数据来源
输入的input数据和database数据来源生成代码如下:
// slot_count = poly_modulus_degree /2 => 4096
double curr_point = 0;
double step_size = 1.0 / (static_cast<double>(slot_count) - 1);
ofstream out;
out.open("database.txt", ios::in | ios::out | ios::binary | ios::trunc);
if (out.is_open()) {
int step = 0;
for (size_t i = 0; i < slot_count; i++)
{
// 每10行一个数据
if(step %10 == 9)
out << curr_point << "\n";
else {
out << curr_point << " ";
}
step++;
curr_point += step_size;
}
out << endl;
out.close();
cout << "Input vector: " << endl;
}
选取的input数据如下:
[0.984127 0.984371 0.984615 0.98486 0.985104 0.985348 0.985592 0.985836 0.986081 0.986325]
从生成的database中最后10行中选取第6行生成
选取的database E 数据如下:
[0.974359 0.974603 0.974847 0.975092 0.975336 0.97558 0.975824 0.976068 0.976313 0.976557]
[0.976801 0.977045 0.977289 0.977534 0.977778 0.978022 0.978266 0.97851 0.978755 0.978999]
[0.979243 0.979487 0.979731 0.979976 0.98022 0.980464 0.980708 0.980952 0.981197 0.981441]
[0.981685 0.981929 0.982173 0.982418 0.982662 0.982906 0.98315 0.983394 0.983639 0.983883]
[0.984127 0.984371 0.984615 0.98486 0.985104 0.985348 0.985592 0.985836 0.986081 0.986325]
[0.986569 0.986813 0.987057 0.987302 0.987546 0.98779 0.988034 0.988278 0.988523 0.988767]
[0.989011 0.989255 0.989499 0.989744 0.989988 0.990232 0.990476 0.99072 0.990965 0.991209]
[0.991453 0.991697 0.991941 0.992186 0.99243 0.992674 0.992918 0.993162 0.993407 0.993651]
[0.993895 0.994139 0.994383 0.994628 0.994872 0.995116 0.99536 0.995604 0.995849 0.996093]
[0.996337 0.996581 0.996825 0.99707 0.997314 0.997558 0.997802 0.998046 0.998291 0.998535]
过程步骤
总览
-
首先计算 p 与 E 中的 C i C_{i} Ci 比较分数并用 r i r_{i} ri表示,求最佳的 r i r_{i} ri,
r i = dist ( p , c i ) ⋅ k \mathbf{r}_{i}=\operatorname{dist}\left(\mathbf{p}, \mathbf{c}_{i}\right) \cdot \mathbf{k} ri=dist(p,ci)⋅k ; k = { 1 , 0 , . . . 0 } k=\left \{ 1,0,...0 \right \} k={ 1,0,...0}
-
处理完全部数据库内容后,N个单独结果的vector R = [ r 1 r 2 ⋮ r N ] = [ ( r 1 , 1 , 0 , … 0 ) ( r 2 , 1 , 0 , … 0 ) ⋮ ( r N , 1 , 0 , … 0 ) ] \mathbf{R}=\left[\begin{array}{c}\mathbf{r}_{1} \\ \mathbf{r}_{2} \\ \vdots \\ \mathbf{r}_{N}\end{array}\right]=\left[\begin{array}{c}\left(\mathbf{r}_{1,1}, 0, \ldots 0\right) \\ \left(\mathbf{r}_{2,1}, 0, \ldots 0\right) \\ \vdots \\ \left(\mathbf{r}_{N, 1}, 0, \ldots 0\right)\end{array}\right] R=⎣⎢⎢⎢⎡r1r2⋮rN⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡(r1,1,0,…0)(r2,1,0,…0)⋮(rN,1,0,…0)⎦⎥⎥⎥⎤ 每个 r i r_{i} ri是单独加密的, 可以随机打乱 r i r_{i} ri的顺序
-
通过将 r i r_{i} ri移位,变成对角矩阵 例如 R = [ ( r 1 , 1 , 0 , … 0 ) ( 0 , r 2 , 1 , … 0 ) ⋮ ( 0 , 0 , … r N , 1 )