算法面试高频知识点:人脸识别FaceNet解析
FaceNet解决的问题
虽然传统人脸识别技术发展很快,但是人脸验证和人脸识别在自然条件下应用依然存在很多困难。论文中作者提出了一个新的人脸识别模型:FaceNet。这个模型可以直接向人脸图片映射到欧几里得空间,空间距离的长度代表了人脸图像的相似性。只要映射空间生成,以FaceNet嵌入作为特征向量,那么人脸识别,验证和聚类等任务就可以轻松完成。
FaceNet的创新点
FaceNet是一个通用系统,可以用于人脸验证(是否是同一个人?),人脸识别(这个人是谁?)和聚类(寻找类似的人)。
FaceNet采用的方法是通过卷积神经网络学习将图像映射到欧几里得空间,比起之前的方法更加简单,只需要对图片进行很少量的处理(只需要裁剪脸部区域,而不需要额外预处理,比如3d对齐等)。并且空间距离直接和图片相似度相关:同一个人的不同图像在空间距离很小,不同人的图像在空间中有较大的距离。
当前存在的基于深度神经网络的人脸识别模型使用了分类层(classification layer):中间层为人脸图像的向量映射,然后以分类层作为输出层。这类方法的弊端是不直接和效率低。为此论文中提出了==三元组损失==用于对FaceNet区分正负类。
更好的表现效率:论文实现了当时最先进的人脸识别性能,每个人脸仅使用128维向量。
FaceNet在LFW数据集上,准确率为0.9963,在YouTube Faces DB数据集上,准确率为0.9512。
FaceNet的框架流程
FaceNet网络backbone
- Zeiler&Fergus研究中使用的神经网络。
- Inception网络。
模型结构的末端使用triplet loss来直接进行分类。
三元组损失(triplet loss)
其中,a为positive/negative的边界。
triplets筛选:
我们选择了大样本的mini-batch(1800样本/batch)来增加每个batch的样本数量。每个mini-batch中,我们对单个个体选择40张人脸图片作为正样本,随机筛选其它人脸图片作为负样本。负样本选择不当也可能导致训练过早进入局部最小。为了避免,我们采用如下公式来帮助筛选负样本:
Facenet训练
采用adagrad优化器,使用随机梯度下降法训练CNN模型。在cpu集群上训练了1000-2000小时。边界值a设定为0.2。
总共实验了两类模型,参数如表1和表2所示。