Face Recognition
1、问题描述
人脸识别问题其实主要分为两类:
* 人脸验证 通过一对一比对预测是否属于同一人脸
* 人脸识别 通过一对多的样本与数据库比较预测人脸所属身份
如果有一些图片处理的神经网络的知识的话就会知道,神经网络不同深度神经元计算图片的不同层次的特征,所以我们可以通过对比网络提取的人脸图片的高级特征的相似度来完成人脸验证或者是人脸识别任务。
2、Inception Network(V1)
这里我们使用Inception Network作为图片特征提取网络,所以这里介绍Inception Network(V1)的基本内容(参考:Inception V1)。
a、写在前面
- 通过“Network in Network”方式扩展网络规模
- 通过“ 1×1 1 × 1 Conv”网络进行维度缩减减小计算成本
b、动机
提升神经网络的基本方法就是增加神经网络的深度和每层神经元的规模,但随之而来就存在两个问题:一是更大规模的神经网络势必会训练更大量的参数,这对监督学习条件下的任务的训练集的覆盖范围提出了更高的要求,否则会导致严重的过拟合;另一个问题就是大规模神经网络的计算成本会急剧增加,同时存在其他一系列问题。
Inception Network主要优化这两个问题来获得更大规模的网络而同时计算代价可控。
c、详述
Inception Network的基本思想来自于Provable Bounds for Learning Some Deep
Representations:如果某分布的数据可以用足够规模并且稀疏的深层神经网络表示,那么我们可以根据神经网络每层的神经元与最后一层输出的关联程序来构建最优的的网络拓扑,类似于“Hebbian Principle”。
但是非一致的稀疏网络结构更加复杂同时计算成本极高,主要的问题是后者。
* 1×1 1 × 1 Conv *
Inception 使用“1x1 Conv”的灵感来自一篇名为“On Two-Dimensional Sparse Matrix Partitioning: Models, Methods, and a Recipe”的文章,其中给出的结论是:对于稀疏矩阵相乘我们可以通过将稀疏矩阵“集中到”相关的稠密矩阵中后再计算来获得计算性能上的提升。
所以Inception Network就是在使用稀疏网络从而可以得到更大型网络的同时通过“1x1 Conv”来削减计算量获得了性能上的提升。
d、模型
Naive Inception Module
Inception固定使用“1 x 1”,”3 x 3”,”5 x 5”的Convolution来实现不同层次特征的连接 ,在浅层网络主要体现低维特征可以用“1 x 1”来覆盖,在深层主要体现高维特征可以用“5 x 5”来覆盖,当然这些形状的固定只是为了方便,也可以使用其他不同形状替换。但是这样的稀疏网络计算效率较低,所以不能满足计算成本要求。
Dimension Reduction Inception Module
为了保持网络大部分连接为稀疏连接的同时降低计算开销这里使用“1 x 1 Conv”进行降维,即在”3 x 3”,”5 x 5”等之前使用“1 x 1 Conv”然后进行其他运算。
- GoogLeNet
3、Triplet Loss
现有一张图片 x x (来自deeplearning.ai), 我们将其放入网络计算得出的特征向量记作。
在训练网络时我们需要三张图片, (A,P,N) ( A , P , N ) :
- A “Anchor image” – 某人的脸部图片
- P “Positive image” – 与”Anchor image”同属一人的脸部图片
- N “Negative image” – 与”Anchor image”不属一人的脸部图片
如下所示我们希望
A
A
与之间的差异和
A
A
与之间的差异至少存在
α
α
大小的缓冲:
所以我们训练网络的目的就是最小化下面的”triplet loss”:
“ [m]+ [ m ] + ” 表示 max(m,0) m a x ( m , 0 ) 。
4、识别
识别过程为:
- 将待识别图片放入网络进行特征提取
- 计算待识别图片特征向量与数据库中某人面部图像特征向量距离
- 使用某“threshold”来裁定待识别图片是否匹配数据库中某人图片
1、以上为人脸识别的基本思路与GoogLeNet内容记录
2、具体代码实现:https://github.com/Alnlll/ML/tree/master/several_apps/003-FaceRecognition(参考DeepLearning.ai在线课程)