关于人脸的任务一般分验证(是否同一个人?)、识别(是谁?)和聚类(是不是长得较接近?)。而facenet是可以同时用于这三种任务的一个网络。
为什么可以做到呢?
facenet通过卷积神经网络将图像映射到欧几里得空间。空间上的距离直接体现了图片相似度:同一个人的不同图像在空间距离很近,反之则较远。
所以,映射矩阵得到后,这些任务就变得简单。
前面就是一个传统的卷积神经网络,然后在求L2范数之前进行归一化,就建立了这个嵌入空间,最后损失函数。
网络结构如下:
我们关注最后两个层:fully conn 和 L2 normalization。
关于L2标准化的作用,简单说就是映射到欧几里得空间,后面再专文解释。
重点需要说明的算法原理,包括两个部分:
一、对图片使用CNN 网络提取特征向量。
存在特征向量的维度选择问题,维度约小计算越快,但是太小的话很难区分不同图片;维度越大越容易区分不同图片,但是太大训练模型不易收敛,且测试时计算慢,占用空间大。作者实验证明 128 维的特征能够较好的平衡这个问题。
CNN 模型的选择,高精度的模型往往参数多,计算量大。移动设备上最好使用体积小,精度略低的模型;服务器上可以使用高精度,高计算量的模型。
另外一点embeding这层实现方式就是linear,这点在论文上找了一会儿才找到,通过模型训练收敛得到一个合适的线性欧式向量提取器。再利用L2进行归一化。
二、使用三元损失函数。
之前的工作有人使用的是二元损失函数,二元损失函数的目标是把相同个体的人脸特征映射到空间中的相同点,而三元损失函数目标是映射到相同的区域,使得类内距离小于类间距离。
训练系统需要通过三元组的图像(A,P,N),其中:
A:“Anchor”图像,是一个人的图片;P:“Positive”图,与“Anchor”为同一个人的图像;
N:“Negative”图像,与“Anchor”为不同人的图像。
三元组triplets的筛选,通常采用mini-batch中进行筛选positive/negative样本。我们采用在线生成triplets的方法。我们选择了大样本的mini-batch(1800样本/batch)来增加每个batch的样本数量。每个mini-batch中,我们对单个个体选择40张人脸图片作为正样本,随机筛选其它人脸图片作为负样本。
领取专属 10元无门槛券
私享最新 技术干货