CV

人脸识别

2019-12-16  本文已影响0人  此间不留白

One-Shot 学习

在人脸识别的任务中,首要解决的问题就是仅仅需要一张图片或者一个样本实现识别,而利用神经网络实现这一功能时,由于只有一个样本,所以很难实现这样的效果。一种有效的解决方案是实现一个Similarity函数,这个函数可以用如下的表达式表示:
d(img1,img2) = degree\ \ of \ \ difference \ \ images \ \
即用两张图片作为输入,输出两张图片的差异值,当这两张图片的差异值小于某个阈值\tau时,预测输出是同一个人,反之则不是。

Siamese 网络

实现One-Shot功能的一个方式就是使用Siamese网络,该网络的架构如下如下图所示:

输入一张图片,经过卷积,池化和全连接层之后,得到一个向量,将这个向量作为输入图片的编码,并命名为f(x_1)。而实现人脸识别系统的方法就是利用同样的网络比较输出的向量,假设第二张图片的向量为f(x_2),则有如下表达:

Triple损失

利用神经网络学习参数并应用于人脸识别,一种有效的方法是定义三元组损失函数然后利用梯度下降。如下图所示:


定义三元组损失就是利用一张anchor(用A表示)图片,一个正例(Positive,表示和anchor是同一个人,用P表示),一个反例(Negative,表示和anchor不是同一个人,用N并表示),则将其写成公式形式就是:
||f(A)-f(P)||^2 \le ||f(A)-f(N)||^2
对于以上公式,如果出现出现某个函数的输出为0,则会有0 \le 0,那么就会难以区分正例和反例,网络可能会失效,为了避免这种情况,以上表达式可以改为如以下所示:
||f(A)-f(P)||^2 + \alpha \le ||f(A)-f(N)||^2
\alpha表示间隔(margin),是神经网络的一个超参数。

Triple损失基于三元图片组,则其基于三元图片组的损失函数如下所示:
L(A,P,N) = max(||f(A)-f(P)||^2 - ||f(A)-f(N)||^2+\alpha,0)
以上损失函数表达式保证了,损失函数能取得最小值是0.

假设有10000张图片数据集,这些数据集中有1000个人不同的照片,为了训练一个人脸识别的神经网络,需要利用10000张图片生成三元组,然后利用三元组数据集和梯度下降算法训练神经网络。

人脸验证与二分类

实现人脸识别卷积网络学习参数的另外一种方法将人脸识别当作一个二分类问题。如下图所示:


利用Siamese网络,得到两组向量f(x_1),f(x_2)(假设是一个128维的向量),将这两组向量输入到逻辑回归单元,然后进行预测,如果是相同的人,则输出为1,否则,输出为0.如下公式所示:
\hat{y} = \sigma(\sum_{k=1}^{128}w_i|f(x^{(i)})_k-f(x^{(j)})_k|+b)

除了以上公式外,还有一个\chi^2公式实现二分类效果,称之为平方相似度,如下所示:
\frac{(f(x^{(i)})_k-f(x^{(j)})_k)^2}{f(x^{(i)})_k+f(x^{(j)})_k}
与逻辑回归相比,输入是一对图片。

注:以上所有图片来自于吴恩达老师deeplearning.ai 课件

上一篇 下一篇

猜你喜欢

热点阅读