FaceNet的Key features有哪些?
端对端,没有3D modeling,alignment 的步骤
通过FaceNet就能获得每张image的Embedding Vector,拿到Embedding Vector后
加一个阈值(Thresholding value)就能做人脸验证(verification)任务
加KNN就能做人脸识别(recognition)任务
加K-means就能做人脸聚类(clustering)任务
前人论文中是如何获取 embedding?
-训练一个有K个人的CNN classifier
-从模型中间取出某一层作为 embedding 向量
前人方法有哪些弊端?
前人方法是间接的;此外,这种中间层通常具有数千个维度,相比直接输出一个小维数的向量如128,这是低效的。
FaceNet需要怎样的损失函数?如何设计?
希望vector能够表达一张图片中的两个信息,
如果是指向同一个人的,那么两个vector的距离是接近的
如果是指向不同的两个人,那么两个vector的距离是远的
需要最小化属于同一个人的两个面部之间的距离,并最大化两个属于不同身份的人之间的面部距离。并最大化两者之间的绝对差异。
如何从损失函数的目标转化为真实的函数?
如何计算和选择triplets来计算损失函数?
A 样本需要有3张图像
o Anchor 图像
o Positive 图像
o Negative 图像
三元组的选择直接影响模型的速度和收敛。理想情况下,我们选择对模型来说很困难的三元组
简单与困难的Triplets对模型训练效果的影响?
简单的Triplets easiness and hardness vs convergence
·简单的Triplets是那些模型能很容易就分辨出来是否是同一人的图像对,
·因为太简单了,模型就不用怎么更新参数。所以不能让模型总是面对简单的Triplets
选择困难的三元组可能导致训练不佳,因为按照上述要求选到的多是错误标记和不良成像的面孔
应该从全局样本还是从mini-batch中选取困难的triplets?为什么?
从整个数据集寻找
要遍历整个数据集,效率低
不可避免遇到标签错误和质量差的图像,因为这些图像本身就有问题,那么他们就会成为占据主导的困难的positive,negative三元组。可能导致模型训练非常糟糕,从而出现模型崩塌(model collapse)(即,无论输入什么图片,模型输出的vector总是 f(x)=0)
从mini-batch中寻找
遇到标签错误和质量差的图像的概率要减小很多
更容易找到期望的正常的hard positive,negative
进行online训练,一边训练一边寻找困难的positive,negative三元组
如何组合triplets来构成训练样本和mini-batch?
使用所有的positive图像来生成positive对
只使用hard negative图像生成negative对
也会选取semi-negative图像生成negative对, semi-negative图像指的是negative对的距离大于positive对的距离,但是他们的差异小于阈值(margin)
怎样组成一个mini-batch一个mini-batch有1800张图像
里面针对性的1个身份有40张图像,用来构成positive对
剩下的图像是其他不同身份的,用来构成negative对