facenet是谷歌提出的一种新的人脸识别的方法,该方法在LFW数据集上的准确度已经达到了99.6%,目前是该数据集上检测的最好记录。关于facenet的官方介绍看链接论文地址 。
facenet 不同于传统的CNN方法。传统的CNN先通过网络进行处理,然后将处理后的结构利用SVM方法进行分类。该方法是直接通过学习将特征变为欧式平面上的一个点,然后通过比较点之间的距离来进行判断。
在模型的训练中,采用了一个被称为triple loss的方法进行,其具体如下:也就是说对于组内的距离要尽可能的小,对于组间的距离要尽可能的大。
根据上述原理定义了对应的损失函数为:
学习的目标就是最小化上述损失函数,对于上述函数要找出所有的三元组合是一个很大的工作量。所以在实现的过程中,我们在positive中选择一个最不像的,在negative中选择一个最像的(因为这样算出的损失距离是最大的距离,优化这样的损失函数即可,当采用这种方式算出来的值都能达到要求时,其他更小的也能达到要求)。
采用上述方法选择三元组时也存在一个弊端,在选取最近和最远的元素时也需要遍历所有的样本,遍历所有的样本也有很大的工作量。对此,可以采用分批查找的方式。因为图片的执行是分批的,我们可以在每批图片处理的时候找出对应的符合条件的positive和negative的样本。为了保证该方法选出的数据合理。在生成对应的批图片时保证每个人平均有40张图片并且随机加入反例进去(不知道为啥)。同时在选取negative时遵循semi-hard约束条件:
网路结构:
对于facennet的执行方式如下:
从上图可以看出网络结构是一个黑盒的过程。目前使用的主要是两种网络结构,一种是Zelier&Fefgus提出的网络结构,该结构主要有22层,140M参数。另一种是基于谷歌的Inception模型为基础的结构(下一篇的代码是基于该网络模型进行的)。该模型的参数较小。通过减小Inception模型的参数和大小生成了NNS1,NNS2的网络结构。由于NNS1和NNS2的参数较小,可以在移动端使用。下图给出了第一种网路结构。
对于实验中参数的影响在这里就不介绍了,可以自己看文献了解。
注意:文献中说明了网络最终输出的是128维的向量,并且区分是否为同一人的阀值为1.1