小猪学AI—迁移学习之人脸识别

概述

想给家里的小八爪机器人加上人脸识别功能,比如瞄准的是我时就不能发射炮弹,这样儿子就没法拿这个怪物打我了。。。(也可以在工位上加个摄像头,领导来了提前报警。。。)

人脸识别跟普通的图像识别还是有相似的地方,比如都是图像cnn卷积池化;但也有很多不同,比如标注数据太少,全国的身份证人脸识别,每个人只有一张照片你怎么训练。。。这就需要用到一个新的迁移学习的思路:将一个问题上训练好的模型通过简单的调整使其快速适用于一个新的问题。

例如利用ImageNet数据集上训练好的Inception-V3模型来解决一个新的图像分类问题,可以保留训练好的Inception-v3模型中所有卷积层的参数,只是替换最后一层全连接层,在最后这一层全连接层之前的网络层称为瓶颈层。而将新的图像通过训练好的卷积神经网络直到瓶颈层的过程可以看成是对图像进行特征提取的过程,瓶颈层输出再通过一个单层的全连接层神经网络可以很好的区分类别,所以有理由相信将瓶颈层的输出的节点向量可以被称为任何图像的更加精简且表达能力更强的特征向量。所以可以直接利用这个训练好的神经网络对图像进行特征提取,然后再将提取得到特征向量作为输入来训练一个新的单层全连接网络来处理分类问题。

需要注意的是,在数据量足够的情况下,迁移学习的效果不如完全重新训练,但是迁移学习所需要的训练时间和训练样本要远远小于训练完整的模型。

FaceNet

FaceNet由谷歌研究人员于2015年推出。主要思想是把人脸图像映射到一个多维空间,通过空间距离表示人脸的相似度。同个人脸图像的空间距离比较小,不同人脸图像的空间距离比较大。这样通过人脸图像的空间映射就可以实现人脸识别,FaceNet 中采用基于深度神经网络的图像映射方法和基于 triplets(三联子)的 loss 函数训练神经网络,网络直接输出为 128 维度的向量空间。在某种程度上,对于相似的面部,距离将更近,而对于非相似的面部,距离将更远。

  • Download this pretrained Facenet model and copy to model folder.
  • Download this pretrained MTCNN models and copy to mtcnn_model.

欧几里德距离

欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。

三维欧几里德空间中的每个点都由三个坐标确定

 

实现

实现思路

1.建立人脸FACEID特征库:

身份证照片->人脸检测->FaceNet计算Embedding特征->保存FACEID及对应人脸特征到FACEDB

2.摄像头人脸识别:

摄像头->人脸检测->FaceNet计算Embedding特征->获得摄像头人脸特征

3.人脸相似度比对:

比较摄像头人脸特征向量与FACEDB人脸特征向量间的欧式距离并倒排,根据距离判断是否为同一人(距离越小越接近, <0.6可以确信是同一个人, >1不可信)。

实现代码详见:https://github.com/yanjingang/piglab/tree/master/machinelearning/image/face

*注:model/facenet/20180402-114759/目录的模型下载方式详见model/facenet/readme.txt

测试

python face.py face_embedding   #face_embedding方式创建facedb+faceid特征对比示例
python infer.py                 #识别摄像头的人是谁

1.使用face_embedding方式识别效果:(每个user只用一张照片提取特征;后边小数是欧几里得距离,距离越小越像,<0.6可以确信是同一个人, >1时不可信 )

2.使用cnn图像分类模型训练的识别效果:(每个user使用了330张照片用于训练;后边小数是准确率;这种方式训练的模型遇到相似的人时经常会认错人,比如我和儿子就经常识别错,特征明显的人没事;另外这种方式需要每个user提供大量照片用于训练,实际应用场景不太现实,所以最终选择上边的1.face_embedding方式)

惯例加到微信小程序里方便测试:

TODO

1.视频的识别face_embedding速度稍慢,需要看下能否优化

2.功能移植到pi3+摄像头上,用于人脸检测和相应处理

 

yan 19.2.25 23:47

 

参考:

https://medium.com/intro-to-artificial-intelligence/one-shot-learning-explained-using-facenet-dff5ad52bd38

https://github.com/dkarunakaran/facenet_mtcnn_tensorflow_inference_engine

https://www.infoq.cn/article/how-to-achieve-face-recognition-using-mtcnn-and-facenet

https://github.com/davidsandberg/facenet

 

发表评论

电子邮件地址不会被公开。