手把手教人脸识别Facenet实现

在实现人脸检测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路径下

  • 10
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
人脸识别是一种非常实用的技术,可以广泛应用于安防、门禁、签到等领域。在Python中,我们可以使用OpenCV库来实现人脸识别。 以下是一个简单的手把手程,帮助您使用Python和OpenCV实现人脸识别: 1. 安装OpenCV库 在命令行中输入以下命令来安装OpenCV库: ``` pip install opencv-python ``` 2. 收集人脸数据 首先,我们需要收集一些人脸数据,用于训练我们的人脸识别模型。可以使用OpenCV中内置的`cv2.face.createFisherFaceRecognizer()`方法来训练模型。以下是一个收集人脸数据的代码示例: ```python import cv2 import os # 创建一个人脸识别器 recognizer = cv2.face.createFisherFaceRecognizer() # 收集人脸数据 def collect_faces(): # 从摄像头中捕捉图像 camera = cv2.VideoCapture(0) # 循环收集人脸数据 count = 0 while True: # 读取一帧图像 ret, image = camera.read() # 转换为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 检测人脸 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5) # 在图像中标记人脸 for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) # 保存人脸数据 count += 1 cv2.imwrite("image%d.jpg" % count, gray[y:y+h,x:x+w]) # 显示图像 cv2.imshow("Collecting Faces", image) # 按下ESC键退出 if cv2.waitKey(1) == 27: break # 清理资源 camera.release() cv2.destroyAllWindows() # 训练人脸识别模型 def train_model(): # 加载人脸数据 images = [] labels = [] for filename in os.listdir("."): if filename.startswith("image"): label = int(filename.split(".")[0].replace("image", "")) image = cv2.imread(filename, cv2.IMREAD_GRAYSCALE) images.append(image) labels.append(label) # 训练人脸识别器 recognizer.train(images, np.array(labels)) # 收集人脸数据 collect_faces() # 训练人脸识别模型 train_model() ``` 3. 进行人脸识别 现在,我们已经训练好了一个人脸识别模型,可以使用它来进行人脸识别了。以下是一个简单的人脸识别代码示例: ```python import cv2 # 加载人脸识别器 recognizer = cv2.face.createFisherFaceRecognizer() recognizer.load("model.xml") # 进行人脸识别 def recognize_face(): # 从摄像头中捕捉图像 camera = cv2.VideoCapture(0) # 循环进行人脸识别 while True: # 读取一帧图像 ret, image = camera.read() # 转换为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 检测人脸 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5) # 对每个人脸进行识别 for (x, y, w, h) in faces: # 标记人脸 cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) # 进行人脸识别 label, confidence = recognizer.predict(gray[y:y+h,x:x+w]) print("Label: %d, Confidence: %.2f" % (label, confidence)) # 显示图像 cv2.imshow("Recognizing Faces", image) # 按下ESC键退出 if cv2.waitKey(1) == 27: break # 清理资源 camera.release() cv2.destroyAllWindows() # 进行人脸识别 recognize_face() ``` 以上代码示例仅仅只是一个简单的例子,实际应用中还需要进行更多的优化和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值