Facenet 原理介绍

引子[编辑 | 编辑源代码]

   这篇wiki主要介绍facenet人脸相似比较的基本原理,另外两篇wiki主要介绍基于tensorflow实现facenet的准确率测试及源码解读。

  经过在网上的一番搜索,找到了facenet实现人脸聚类的论文和论文解读,以及github上根据facenet论文并结合tensorflow实现的开源代码。相关链接如下:

   facenet github实现   https://github.com/davidsandberg/facenet
   facenet 论文  用A Unified Embedding for Face Recognition and Clustering这个名字在google中搜索既能找到
   facenet论文解读  http://blog.csdn.net/chenriwei2/article/details/45031677

facenet 简介[编辑 | 编辑源代码]

直接学习图像到欧式空间上点的映射,两张图像所对应的特征的欧式空间上的点的距离直接对应着两个图像是否相似。如下图:

Facenet 原理介绍_第1张图片

上图一个简单的示例,其中图中的数字表示这图像特征之间的欧式距离,可以看到,图像的类内距离明显的小于类间距离,阈值大约为1.1左右。针对facenet原理将会在另一篇wiki中介绍。

facenet structure[编辑 | 编辑源代码]

Facenet 原理介绍_第2张图片
如上图所示
batch :是指输入的人脸图像样本,这里的样本是已经经过人脸检测找到人脸并裁剪到固定尺寸(例如160x160)的图片样本。
Deep architecture:指的是采用一种深入学习架构例如imagenet历年冠军网络中的ZF,googlenet等。
L2 :是指特征归一化(使其特征的||f(x)||2=1,这里是2次方的意思。这样所有图像的特征都会被映射到一个超球面上)
Embeddings: 就是前面经过深度学习网络,L2归一化后生成的特征向量(这个特征向量就代表了输入的一张样本图片)
riplet Loss: 就是有三张图片输入的Loss(之前的都是Double Loss或者 是 SingleLoss)。直接学习特征间的可分性:相同身份之间的特征距离要尽可能的小,而不同身份之间的特征距离要尽可能的大。

googlenet 网络介绍

上一节提到的Deep architecture就是指深度网络,而论文中举例的就是googlelet网络。
GoogLeNet, 是google公司在推出的,获得了2014年ILSVRC挑战赛冠军,将Top5 的错误率降低到6.67%. 一个22层的深度网络,论文在http://arxiv.org/pdf/1409.4842v1.pdf

googlenet在基础的CNN卷积、池化、卷积、池化、全连接这样结构基础上做了一些变形处理。

Facenet 原理介绍_第3张图片

下面从前几层举例介绍下:
其输入及卷积层的参数配置在论文中都有,这里主要是根据这些参数计算增加了些自己的理解。注意模型是从下到上看的
a, 第一个卷积层
原始数据,输入为224*224*3
第一层卷积层 conv1 ,pad是3,64个特征,7*7 步长为2,输出特征为 112*112*64,然后进行relu,有padding的,所以输出的计算公式为:
输出长度:Out = in/stride
输出宽度:Out = in/stride

b,线性整流函数(Rectified Linear Unit, ReLU),又称修正线性单元, 是一种人工神经网络中常用的激活函数(activation function),通常指代以斜坡函数及其变种为代表的非线性函数。

Facenet 原理介绍_第4张图片

c,第一个池化层 经过pool1(红色的max pool) 进行pooling 3*3的核,步长为2, [(112 - 3+1)/2]+1 = 56 特征为56*56*64 , 然后进行norm。认为这里的池化层输出尺寸计算与卷积层一样。
其中LocalRespNormal的作用是归一化。其细节是对一个局部的输入区域进行的归一化(激活a被加一个归一化权重(分母部分)生成了新的激活b)。

d, Inception子网络
第三层开始时 inception module ,这个的思想受到使用不同尺度的Gabor过滤器来处理多尺度问题,inception module采用不同尺度的卷积核来处理问题。这里采用的是inception含降维模型。这个模型的作用如下:
1 . 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合; 
2 . 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了; 
3 . 文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了。 
4 . 网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。


你可能感兴趣的:(ML)