使用MTCNN实现人脸检测

  |   0 评论   |   0 浏览   |   夜雨飘零

前言

前一章我们已经介绍了常见的人脸数据集,在本章将要进行人脸识别的第二步人脸检测。在人脸识别任务中,首先是需要检查一张图片中是包含有人脸,然后把这个人脸裁剪出来,然后使用脸部的关键点进行人脸对齐,最后使用人脸对比方式完成人脸识别。

MTCNN,Multi-task convolutional neural network(多任务卷积神经网络),将人脸区域检测与人脸关键点检测放在了一起,总体可分为 P-Net、R-Net、和 O-Net 三层网络结构。它是 2016 年中国科学院深圳研究院提出的用于人脸检测任务的多任务神经网络模型,该模型主要采用了三个级联的网络,采用候选框加分类器的思想,进行快速高效的人脸检测。这三个级联的网络分别是快速生成候选窗口的 P-Net、进行高精度候选窗口过滤选择的 R-Net 和生成最终边界框与人脸关键点的 O-Net。和很多处理图像问题的卷积神经网络模型,该模型也用到了图像金字塔、边框回归、非最大值抑制等技术。

本项目源码:https://github.com/yeyupiaoling/PaddlePaddle-MTCNN

环境

  • PaddlePaddle 2.0.1
  • Python 3.7

文件介绍

  • models/Loss.py MTCNN 所使用的损失函数,包括分类损失函数、人脸框损失函数、关键点损失函数
  • models/PNet.py PNet 网络结构
  • models/RNet.py RNet 网络结构
  • models/ONet.py ONet 网络结构
  • utils/data_format_converter.py 把大量的图片合并成一个文件
  • utils/data.py 训练数据读取器
  • utils/utils.py 各种工具函数
  • train_PNet/generate_PNet_data.py 生成 PNet 训练的数据
  • train_PNet/train_PNet.py 训练 PNet 网络模型
  • train_RNet/generate_RNet_data.py 生成 RNet 训练的数据
  • train_RNet/train_RNet.py 训练 RNet 网络模型
  • train_ONet/generate_ONet_data.py 生成 ONet 训练的数据
  • train_ONet/train_ONet.py 训练 ONet 网络模型
  • infer_path.py 使用路径预测图像,检测图片上人脸的位置和关键的位置,并显示
  • infer_camera.py 预测图像程序,检测图片上人脸的位置和关键的位置实时显示

数据集下载

  • WIDER Face 下载训练数据 WIDER Face Training Images,解压的 WIDER_train 文件夹放置到 dataset 下。并下载 Face annotations ,解压把里面的 wider_face_train_bbx_gt.txt 文件放在 dataset 目录下,
  • Deep Convolutional Network Cascade for Facial Point Detection 。下载 Training set 并解压,将里面的 lfw_5590 和 net_7876 文件夹放置到 dataset 下
  • 解压数据集之后,dataset 目录下应该有文件夹 lfw_5590net_7876WIDER_train,有标注文件 testImageList.txttrainImageList.txtwider_face_train.txtwider_face_train_bbx_gt.txt

训练模型

训练模型一共分为三步,分别是训练 PNet 模型、训练 RNet 模型、训练 ONet 模型,每一步训练都依赖上一步的结果。

第一步 训练 PNet 模型

PNet 全称为 Proposal Network,其基本的构造是一个全卷积网络,P-Net 是一个人脸区域的区域建议网络,该网络的将特征输入结果三个卷积层之后,通过一个人脸分类器判断该区域是否是人脸,同时使用边框回归。与原论文不一样,笔者去掉了关键回归。
PNet

  • cd train_PNet 切换到 train_PNet 文件夹
  • python3 generate_PNet_data.py 首先需要生成 PNet 模型训练所需要的图像数据
  • python3 train_PNet.py 开始训练 PNet 模型

第二步 训练 RNet 模型

全称为 Refine Network,其基本的构造是一个卷积神经网络,相对于第一层的 P-Net 来说,增加了一个全连接层,因此对于输入数据的筛选会更加严格。在图片经过 P-Net 后,会留下许多预测窗口,我们将所有的预测窗口送入 R-Net,这个网络会滤除大量效果比较差的候选框,最后对选定的候选框进行 Bounding-Box Regression 和 NMS 进一步优化预测结果。与原论文不一样,笔者去掉了关键回归。RNet 模型

  • cd train_RNet 切换到 train_RNet 文件夹
  • python3 generate_RNet_data.py 使用上一步训练好的 PNet 模型生成 RNet 训练所需的图像数据
  • python3 train_RNet.py 开始训练 RNet 模型

第三步 训练 ONet 模型

ONet 全称为 Output Network,基本结构是一个较为复杂的卷积神经网络,相对于 R-Net 来说多了一个卷积层。O-Net 的效果与 R-Net 的区别在于这一层结构会通过更多的监督来识别面部的区域,而且会对人的面部特征点进行回归,最终输出五个人脸面部特征点。
ONet 模型

  • cd train_ONet 切换到 train_ONet 文件夹
  • python3 generate_ONet_data.py 使用上两部步训练好的 PNet 模型和 RNet 模型生成 ONet 训练所需的图像数据
  • python3 train_ONet.py 开始训练 ONet 模型

预测

  • python3 infer_path.py 使用图像路径,识别图片中人脸 box 和关键点,并显示识别结果
  • python3 infer_camera.py 使用相机捕获图像,识别图片中人脸 box 和关键点,并显示识别结果

参考资料

  1. https://github.com/AITTSMD/MTCNN-Tensorflow
  2. https://blog.csdn.net/qq_36782182/article/details/83624357

标题:使用MTCNN实现人脸检测
作者:夜雨飘零
地址:https://blog.doiduoyi.com/articles/1615987760961.html

评论

发表评论