3 计算机视觉-阅读笔记(8)

2019-04-29  本文已影响0人  深度学习模型优化

算法和码力是核心能力。

3.7 人脸识别简介

先看几个容易混淆的概念,区分清楚。

3.7.1 FaceNet

人脸识别问题和常见识别问题的区别,也就是人脸识别问题的特殊性--训练数据少。因此一般采用聚类算法。

来介绍第一个选手Siamese Network。

图1 Siamese Network网络架构

但是如果要比对的图片很多,Siamese Network就爆炸了,因此需要改进。方法称为Face Embedding。即用一个降维的向量来表示人脸。然后就有了FaceNet。

图2 FaceNet模型结构

这里损失函数为Triplet Loss。

图3

Face Embedding将输入图像x映射为d维欧式空间的一个点,表示为f(x) \in R^{d \times 1}。另外在这个基础上增加一个归一化约束\Vert f(x) \Vert_2 = 1,即将Face Embedding都限制在半径为1的超平面上。

公式描述为:
\Vert f(x_i^a) - f(x_i^p) \Vert_2^2 + \alpha \leq \Vert f(x_i^a) - f(x_i^n) \Vert_2^2
其中f(x_i^a)表示第i个triplet中的anchor,f(x_i^p)表示第i个triplet中和anchor同一个人的另一张图片,f(x_i^n)表示第i个triplet中其他人的图片。\alpha表示margin。
总之,可以表述为:同一个人的图片的距离加上一个margin(\alpha)仍然要小于不同人图片的距离。于是损失函数可以写为:
L = \mathop \sum_i \left[ \Vert f(x_i^a) - f(x_i^p) \Vert_2^2 + \alpha - \Vert f(x_i^a) - f(x_i^n) \Vert_2^2 \right]_+
其中[x]_+ = \max(0, x)。其意思为:如果相同人的图片的Embedding的距离加上\alpha小于不同人,那么就没有loss(零),否则loss就是它们的差值,并且差值越大损失也越大。因此这样的损失函数迫使模型让相同人的照片尽量聚集在一起,而不同人的照片尽量远离彼此。提高类间距离,减小类内距离。

定义好了损失函数,那么接下来的问题如何选择这个Triplet。一般来讲如果要遍历所有的组合,那是很难为人的,接近NP-hard吧!

那么怎么选择这个Triplet呢?
首先想到的是随机挑选,真的是hin随意呀?
这个方法从统计上而言还可以,但是直观的思考,并不能很好的提高人脸识别的性能。

FaceNet作者给出的方法是找最难的样本,那么怎么定义最难呢?请看下式。
最难的正样本(和anchor最远的正样本):
\mathop \arg \max_{x_p} \Vert f(x_i^a - x_i^p) \Vert_2^2

最难的负样本(和anchor最近的负样本):
\mathop \arg \min_{x_n} \Vert f(x_i^a - x_i^n) \Vert_2^2

但是用最困难样本存在运算量大的问题,同时由于样本很难,导致学习困难。于是取一个折中的方案,先易后难,逐步训练的方法。

FaceNet的方法为(上面的第二种,也即从易到难样本):

上面的步骤来得到Triplet样本集。有时候也会用到semi-hard样本。semi-hard样本的具体概念请参考原论文。

最后,这里的人脸图像特征提取,可以使用已有的CNN来做迁移学习,提取特征。

上一篇下一篇

猜你喜欢

热点阅读