face_recognation的确简单易用,可是实现原理究竟是什么?还需要追本溯源,看看作者怎么说的:
整个模块工作可以分为四个步骤:
一、找出所有人脸
首先对图像做简化处理:
1、将图像转变为黑白图像。
2、然后将人脸图像转变为如下梯度直方图(HOG)。
为什么要转换为梯度直方图呢?
因为生成直方图的过程其实关注的是局部细节的相对特征,两张人脸图像在不同的光照亮度和色彩模式下肯定有显著的差异,但是局部细节的相对特征基本是一样的,这就是为何要做这样的转换。
另外还有一个原因是转换之后,图像就会变得简单,也就更容易从中挑选出所有的人脸图像。
二、脸部仿射变换
仿射变换,是用来解决人脸图像姿势的问题,比如侧脸、扭头等各种不同的姿态。通过仿射变换,力求把人脸尽可能摆端正。
具体实现方法是,首先找出68个人脸特征点:
然后通过仿射变换,将人脸尽可能调整端正,这样便于下一步的编码识别。从而提高准确率。
三、脸部编码
编码这是最为关键的一步,这一步就把图像数据转换为一组128维的向量数据。
编码具体实现是基于深度CNN网络。
1、为何使用深度学习技术?因为采用深度学习技术经过大量的人脸数据训练,训练好的模型可以自动采集人脸样本特征编码。而且这个编码的过程是非常鲁棒的,能够应对各种条件下的人脸图像。相比于传统的由人工定义特征的方式具有非常明显的性能优势,这也就是为何如今深度学习这么热门的原因。
2、本模型中采用的这个CNN模型是什么?作者说了,这个模型是使用的openface上面训练好的模型,具体原理可以参看https://cmusatyalab.github.io/openface/
四、分类识别
编码完成之后,接下来就是识别了。这一步可以采用任意一种分类模型来实现,比如SVM、余弦相似度、knn等分类器。
分类的过程就是用未知图像的编码与已知图像编码进行比较,相似度在一定范围的就认为是同一个人。
face_recognation模块采用的分类识别方法,是计算未知图片与已知图片编码之后的向量之间的欧几里得距离。
如果要采用其他的分类方法,比如SVM则需要自己根据第三步提取出来的编码值训练分类器,然后再用来进行识别。