转自:https://blog.csdn.net/ygd11/article/details/80724621
FaceNet使用简介
Google工程师Florian Schroff,Dmitry Kalenichenko,James Philbin提出了人脸识别FaceNet模型,该模型没有用传统的softmax的方式去进行分类学习,而是抽取其中某一层作为特征,学习一个从图像到欧式空间的编码方法,然后基于这个编码再做人脸识别、人脸验证和人脸聚类等。所以FacceNet模型学习并输出的是脸部的特征表示,不同人的面部特征表示是不同的,通过计算两个面部特征的距离,来达到不同面部分类的目的。当人脸特征距离小于1.06可看作是同一个人[1]。
使用FaceNet可以使用已经训练好的模型,也可以自己训练模型。Facenet模型是一个通用的系统,采用CNN神经网络将人脸图像映射到128维的欧几里得空间,我们可以根据两幅人像的欧几里得距离去判断两个人像的相似程度[2]。两个人像之间的欧几里得距离越近,说明它们越相似。从初级应用的角度来看,已经训练好的模型已经足够强大,你只需将一个基准图片与待分类图片通过FaceNet模型比较欧几里得距离,即可完成头像分类任务。
值得一提的是,FaceNet提供训练数据的对齐(align)功能,它能自动完成待训练或者待测试图片的人脸检测并缩放为指定大小尺寸的JPEG数据以供训练或测试。
对齐的实现采用基于深度学习方法的mtcnn人脸检测系统。2016年Kaipeng Zhang, Zhanpeng Zhang, Zhifeng Li, Yu Qiao提出了人脸检测MTCNN(Multi-task Cascaded Convolutional Net works )模型。该模式是一种Multi-task的人脸检测框架,使用3个CNN级联算法结构,将人脸检测和人脸特征点检测同时进行[1]。
了解到这里,如果你觉得FaceNet的确是满足需求的项目,就可以着手安装了。
安装步骤可参考FaceNet在GitHub上的wiki,这里简要说一下步骤:
1. 下载源码:git clone
2. 进入facenet目录,执行
pip install -r requirements.txt
下载并安装所有需要的安装包,包括tensorflow 1.7版本等, 因为requirement.txt文件规定了安装包项目,其内容如下:
tensorflow==1.7
scipy
scikit-learn
opencv-python
h5py
matplotlib
Pillow
requests
psutil
3.为了正常执行FaceNet,还要设置好环境变量
export PYTHONPATH=[…]/facenet/src
也就是,PYTHONPATH实际指向你的facenet存储位置中的src目录。
安装完成之后,就可以行动起来看看效果啦。你可能想使用已经训练好的模型进行人脸对比,或者你想先训练一个自己的模型,都没有问题,官方文档都给了说明。
你想要训练自己的FaceNet模型,参考这里“Classifier training of inception resnet v1”, 这里我简解释一下主要步骤:
1.准备数据。自己要训练模型,肯定要找一些自己准备的图片啦。你准备的图片只是为了训练面部特征的表示,和你要识别的对象没有关系。你可以从你的相册中准备一些图片,或者下载标准的的训练样本,比如下载LFW数据集。自己准备的数据要满足一定的格式哦,如下所示:
Aaron_Eckhart
Aaron_Eckhart_0001.jpg
Aaron_Guiel
Aaron_Guiel_0001.jpg
Aaron_Patterson
Aaron_Patterson_0001.jpg
Aaron_Peirsol
Aaron_Peirsol_0001.jpg
Aaron_Peirsol_0002.jpg
Aaron_Peirsol_0003.jpg
Aaron_Peirsol_0004.jpg
即以人名为文件夹,文件夹内,以人名加编号来存储图像文件。
- 2. 对齐数据。你准备的图像可能是比较随意,比如在郊外的一个全身照。这里需要运行 MTCNN算法来检测头像,并缩放到合适的尺寸,以供FaceNet模型进行训练,比如160*160 pixel。官方给了方法,我写成了align.sh脚本如下:
export PYTHONPATH=PYTHONPATH:$(pwd)/src
python src/align/align_dataset_mtcnn.py data/my/raw/ data/my/lfw_160/ –image_size 182 –margin 44
这里data/my/raw/目录就是你准备的原始数据的位置,data/my/lfw_160就是对齐后的数据目录。
-3. 开始训练数据。我把官方的方法也写成脚本training.sh,内容如下:
export PYTHONPATH=PYTHONPATH:$(pwd)/src
python src/train_softmax.py \
–logs_base_dir ./data/my/logs/facenet/ \
–models_base_dir ./data/my/models/facenet/ \
–data_dir ./data/my/lfw_182/ \
–image_size 160 \
–model_def models.inception_resnet_v1 \
–lfw_dir ./data/lfw/lfw_160/ \
–optimizer ADAM \
–learning_rate -1 \
–max_nrof_epochs 150 \
–keep_probability 0.8 \
–random_crop \
–random_flip \
–use_fixed_image_standardization \
–learning_rate_schedule_file data/learning_rate_schedule_classifier_casia.txt \
–weight_decay 5e-4 \
–embedding_size 512 \
–lfw_distance_metric 1 \
–lfw_use_flipped_images \
–lfw_subtract_mean \
–validation_set_split_ratio 0.05 \
–validate_every_n_epochs 5 \
–prelogits_norm_loss_factor 5e-4
其中–lfw_dir ./data/lfw/lfw_160/ 参数指定的对齐后的训练数据的位置。
–models_base_dir ./data/my/models/facenet/参数指定了生成的模型的位置。训练的过程还是很漫长的,慢慢等吧!
当然啦,使用生成好的模型直接使用,效果就立竿见影。最直接的应用就是Facenet可以直接对比2个人脸经过它的网络映射之后的欧式距离[3]。可是哪里可以获取模型呢?Google的官网你上不去:(。 我是从这里获取的:TensorFlow 实现人脸识别。
有了模型,就可以执行人脸对比[3]:
python src/compare.py models/20170511-185253/20170511-185253 Cate_Blanchett_0001.png Cate_Blanchett_0002.png
其中models/20170511-185253/20170511-185253指向你下载的facenet训练好的模型,Cate_Blanchett_0001.png 和 Cate_Blanchett_0002.png 是你要对比的图像。
好了,说完了。如有谬误,敬请指出!
参考文章
1.如何应用MTCNN和FaceNet模型实现人脸检测及识别
2.facenet使用记录
3.人脸识别FaceNet
---------------------
作者:ygd11
来源:CSDN
原文:https://blog.csdn.net/ygd11/article/details/80724621
版权声明:本文为博主原创文章,转载请附上博文链接!
阅读(2692) | 评论(0) | 转发(0) |