在实现人脸检测mtcnn和人脸识别facenet时,遇到很多坑,记录解决方法,给其他人一点启发。

一、人脸检测mtcnn和人脸识别facenet的具体介绍

参考博客https://www.cnblogs.com/zyly/p/9703614.html

二、facenet具体实现

1.创建环境

在anaconda prompt上输入

conda create -n tf18 Python=3.6

 2.激活环境

conda activate tf18

3.装依赖包

tensorflow == 1.7
numpy == 1.16.2
scipy == 1.2.1
scikit-learn
opencv-python
h5py
matplotlib
Pillow
requests
psutil

其中,tensorflow,numpy和scipy需要指定版本,不然会出错。

4.先去GitHub下载facenet源码:https://github.com/davidsandberg/facenet,解压后得到facenet文件夹,将其移至新建环境tf的包库中,在我的电脑路径如下:D:\program\Anaconda\envs\tf18\Lib\site-packages\facenet

 接着删除facenet文件夹里除src和data以外的文件夹,防止引用出错。

另外,需要把facenet\src\路径下的align文件夹复制到D:\program\Anaconda\envs\tf18\Lib\site-packages\路径下,不然会报错。

5.在lfw验证集验证模型的性能

5.1下载lfw验证集

数据集下载网站为:http://vis-www.cs.umass.edu/lfw/lfw.tgz,在site-packages文件夹下建立datasets文件夹,将数据集解压放在datasets文件夹下,在我的电脑路径如下:D:\program\Anaconda\envs\tf18\Lib\site-packages\datasets\

 raw里面含5749个人的照片。

5.2对齐人脸对齐人脸使用的是脚本align_dataset_mtcnn.py。需要修改文件align_dataset_mtcnn.py,将import facenet改为下图所示:

 使用anaconda prompt,来到facenet路径下,运行如下代码:

python  facenet/src/align/align_dataset_mtcnn.py   datasets/lfw/raw  datasets/lfw/lfw_mtcnnpy_160 --image_size 160 --margin 32 --random_order

脚本会对raw的人脸进行识别,裁剪为160*160大小的图片,放在datasets/lfw/lfw_mtcnnpy_160路径下。

5.3下载模型

facenet的原作者提供了两个预训练的模型,分别是基于CASIA-WebFace和VGGFace2人脸库训练的,下载地址:https://github.com/davidsandberg/facenet

 将其下载解压到facenet/models文件夹下

 models下有两个模型

5.4验证

在anaconda prompt下,输入

conda activate tf18
d:
cd program\Anaconda\envs\tf18\Lib\site-packages\facenet

来到facenet路径下,运行

python src/validate_on_lfw.py  ../datasets/lfw/lfw_mtcnnpy_160 models/20180408-102900

最终得到验证集结果

6.在新的训练集下微调模型

6.1 新的训练集获取

因为原作者的模型是在外国人的数据集上进行训练的,我们想将其应用于亚洲人脸的识别中,一个好的方法是用原模型在亚洲数据集的基础上进行微调,以达到适应亚洲人脸识别的目的。

亚洲人脸数据集的获取方式之一是通过爬取获得。

爬取了5000个亚洲明星的数据,并进行清洗。数据集通过百度网盘获取(7条消息) 亚洲人脸数据集百度网盘链接.txt-深度学习文档类资源-CSDN下载,由于超过4G,只能分开压缩了

爬虫代码参考博客 : (5条消息) 人脸数据集——亚洲人脸数据集_Alvin_FZW的博客-CSDN博客_亚洲人脸数据集

 6.2 照lfw数据对齐方式进行对齐

python  src/align/align_dataset_mtcnn.py   D:/file/spyder/BingImage3344  D:/file/spyder/BingImage180 --image_size 180 --margin 44 --random_order

在这,先将训练集放在D:/file/spyder/BingImage3344路径下,运行代码后会将对齐后的180*180的人脸放在D:/file/spyder/BingImage180路径下。

6.3 微调

python src/train_softmax.py --logs_base_dir ./logs  --models_base_dir  ./models --data_dir D:/file/spyder/BingImage180  --model_def models.inception_resnet_v1 --image_size 160 --pretrained_model ./models/20210706-135836 --lfw_dir ../datasets/lfw/lfw_mtcnnpy_160 --optimizer RMSPROP --learning_rate 0.01 --max_nrof_epochs 30 --batch_size 64 --keep_probability 0.8  --random_crop --random_rotate --random_flip --weight_decay 5e-5 --center_loss_factor 1e-2 --center_loss_alfa 0.9

参数解释:

python src/train_softmax.py     
--logs_base_dir ./logs        #训练日志保存路径
--models_base_dir  ./models   #模型保存路径
--data_dir D:/file/spyder/BingImage180   #训练集路径
--model_def models.inception_resnet_v1   #指定了训练所使用的卷积网络是inception_resnet_v1网络
--image_size 160 --pretrained_model ./models/20210706-135836  #指定预训练模型
--lfw_dir ../datasets/lfw/lfw_mtcnnpy_160   #验证集lfw路径
--optimizer RMSPROP    #优化方式
--learning_rate 0.01    #学习率
--max_nrof_epochs 30    #epoch次数
--batch_size 64         #batch大小
--keep_probability 0.8   #dropout
--random_crop    #表明在数据增强时使用随机裁切
--random_rotate  #表明在数据增强时使用随机随机翻转
--random_flip     #表明在数据增强时使用随机旋转
--weight_decay 5e-5   #正则化系数
--center_loss_factor 1e-2  #中心损失和Softmax损失的平衡系数
--center_loss_alfa 0.9     #中心损失的内部参数

训练好的模型会保存在models路径下

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐