如何从零开始构建人脸识别系统?

Posted

技术标签:

【中文标题】如何从零开始构建人脸识别系统?【英文标题】:How to build a Face recognition system from scratch? 【发布时间】:2019-08-12 22:22:34 【问题描述】:

我正在为人脸识别系统构建一个原型,在编写算法时,我有几个问题。

算法:

    收集一对 (A(i),P(i),N(i)) - 组的锚点,在 XYX 公司工作的员工的正面、负面图像。

    使用梯度下降训练三元组损失函数来学习 CNN 参数。实际上,在这里我正在训练一个Siamese network(在 2 个不同的输入上运行两个相同的 CNN 的想法[一次在 A(i)-P(i) 和下一个 A(i)-N(i)] 上)然后比较他们)。

    这些学习到的参数将确保相同图像的扁平化 n-dim 编码之间的距离会很小,而不同的图像会很大。!

    现在,创建一个数据库,您将在其中存储 XYX 公司员工的每个培训图像的编码!

    简单地通过训练好的CNN进行前向传递,并将每张图像的对应编码存储在数据库中

    在测试时,你有一个 XYX 公司员工的形象和一个局外人的形象!

    您将通过 CNN 传递两个测试图像并获得相应的编码!

    现在,问题来了,您如何找到数据库中测试图片编码和所有训练图片编码之间的相似性?

    第一个问题,你会做余弦相似度还是我需要做其他事情?你能增加更多的清晰度吗?

    第二个问题,另外,在效率方面,您将如何处理数据库中存在 100,000 名员工培训图片编码以及您需要的每个新人的情况查看这 100,000 个编码并计算余弦相似度并在

    第三个问题如果我们使用方法(Image-->CNN-->SoftMax--> output)通常用于人脸识别任务,每次有新人加入您的组织时,您都需要重新训练您的网络,那就是为什么这是一个不好的方法!

    这个问题可以通过使用第二种方法来缓解,其中我们在一对员工图像上使用学习距离函数“d(img1,img2)”,如上文第 1 点到3

    我的问题是,如果有新员工加入组织,当这个学习距离函数根本没有在训练集中使用时,它如何能够泛化?测试和训练集的数据分布变化不是问题吗?这方面的任何建议

谁能帮助理解这些概念性故障?

【问题讨论】:

【参考方案1】:

在对计算机视觉中的人脸验证和识别/检测研究论文进行了一些文献调查之后。我想我得到了所有问题的答案,所以我想在这里回答。

第一个问题,你会做余弦相似度吗?你能更清楚地说明它吗?

通过简单地计算它们之间的欧几里得距离,找到测试和每个保存的火车图像 enc 之间的最小距离。

不保留阈值,例如 0.7,并且最小距离为

第二个问题,另外,在效率方面,您将如何处理这样一个场景:您的数据库中有 100,000 名员工培训图片编码,并且您需要为每个新人查看这 100,000编码和计算余弦相似度并在

需要注意的是,在训练过程中使用了一个 128 维的浮点向量,但它可以量化为 128 字节而不会损失精度。因此,每个人脸都由一个 128 维字节向量紧凑地表示,这是大规模聚类和识别的理想选择。更小的嵌入是可能的,但精度损失很小,可以在移动设备上使用

第三个​​问题: - 首先,我们通过最小化三元组损失函数来学习深度 CNN(Siamese n/w)的网络参数!

其次,假设您已经在包含数百万人的庞大数据集上训练了这些模型权重,这些权重已经学习了更高级别的特征,例如人的身份、性别等!以及与人脸相关的边缘等低级特征。
现在,假设这些模型参数一起至少可以代表任何人脸!因此,您将继续通过前向传递将“新人”编码保存在数据库中,然后使用回答 1 计算此人是否属于组织(人脸识别问题)。此外,在 FaceNet 论文中提到,我们保留了大约一百万张图像的保留集,与我们的训练集具有相同的分布,但身份不相交。
第三这两种技术的不同之处在于我们在第一种技术中使用损失函数训练这些模型权重的方式:交叉熵 softmax 与第二种技术损失函数:三重损失函数!

【讨论】:

以上是关于如何从零开始构建人脸识别系统?的主要内容,如果未能解决你的问题,请参考以下文章

Python+OpenCV人脸识别身份认证系统设计:专栏总述

人脸识别 基于MCTNN人脸检测(Pytorch)

7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列

使用Python搭建人脸识别考勤系统

从零学习openCVIOS7人脸识别实战

从零开始玩人工智能-人脸 API-03