## 介绍
本项目的来源是我选修的北航与华为合作的《AI开源计算系统前沿技术》课程大作业。课程请到华为的各位专家介绍了华为目前的AI软硬件体系,并讲解了许多人工智能领域的知识。
我的大作业选题是用轻量级的网络模型backbone,实现手机端人脸检测算法,并使用MindSpore Lite在端侧推理部署。比较遗憾的是整体项目开发进度慢于预期,加上移动端目标检测APP的源码中使用了JNI等我不熟悉的接口,最后没有实现移动端的部署,仅实现了人脸检测+关键点检测神经网络的搭建、训练和测试。
前期调研之后,我决定基于MindSpore框架实现论文《[Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks](https://kpzhang93.github.io/MTCNN_face_detection_alignment/)》中的**人脸识别和关键点检测网络MTCNN**。该网络的结构并不复杂,包括PNet、RNet、ONet这三个结构相似的网络。由于我对Python和机器学习都是初学者,项目过程中遇到了不少问题。解决过程中有了一些经验心得,斗胆在此做些分享。
本项目中的MTCNN部分代码基于[夜雨飘零1的Github项目](https://github.com/yeyupiaoling/Pytorch-MTCNN)和华为MindSpore官方文档撰写,包括数据集生成、网络结构定义、网络训练、模型测试的代码。
[本项目的Gitee地址](https://gitee.com/shymuel/mtcnn-mindspore)。
## 0 训练环境
笔记本训练环境:
* CPU:i7-11800H
* GPU:RTX 3070
* Windows10:
* CUDA11.6+cudnn8.x
* MindSpore1.7.0-CPU
* Pytorch1.11.0
* Ubuntu22.04:
* CUDA11.1+cudnn8.0.4
* MindSpore1.7.0-GPU
服务器训练环境:
1. minsspore1.7.0-cuda10.1-py3.7-ubuntu18.04, GPU: 2\*V100(64GB), CPU: 16核128GB
2. minsspore1.7.0-cuda10.1-py3.7-ubuntu18.04, GPU: 1\*P100(16GB), CPU: 8核64GB
## 1 数据集下载
[WIDER Face](http://shuoyang1213.me/WIDERFACE/)下载训练数据压缩包WIDER Face Training Images,解压的WIDER\_train文件夹放置到dataset文件夹下。并下载[Face annotations](http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/support/bbx_annotation/wider_face_split.zip),解压把里面的wider\_face\_train\_bbx\_gt.txt文件放在dataset目录下,
在[Deep Convolutional Network Cascade for Facial Point Detection](http://mmlab.ie.cuhk.edu.hk/archive/CNN_FacePoint.htm)下载Training set并解压,将里面的lfw\_5590和net\_7876文件夹放置到dataset下
最终,dataset目录下应该有文件夹lfw\_5590,net\_7876,WIDER\_train,有标注文件testImageList.txt,trainImageList.txt,wider\_face\_train.txt,wider\_face\_train\_bbx\_gt.txt(这四个txt文件已放在dataset文件夹下)。
## 2 文件夹功能说明
dataset:最开始只包含原始数据集,后续会保存用于训练每个网络的数据集。
infer\_models:保存训练出的模型PNet.ckpt,RNet.ckpt,ONet.ckpt,我训练出的模型文件已经放在该文件夹下。
models:
* Loss.py:定义损失函数。
* PNet.py,RNet.py,ONet.py:定义网络。
load\_models:包括PNet.py、RNet.py、ONet.py三个文件,实际上RNet.py和ONet.py与models文件夹中的文件一模一样,只有PNet做了改动。这是因为训练中PNet的输入是12\*12的图片,经过卷积之后最后两维都是1,进行了squeeze操作。但在推理过程中,输入PNet的是图像金字塔,再使用squeeze会产生错误,故load\_models文件夹中的PNet减少了squeeze操作。
train\_PNet:包含生成训练PNet的数据集的文件generate\_PNet\_data.py和训练PNet的文件train\_PNet.py。train\_RNet和train\_ONet文件夹类似。
utils:包含加载图片、处理图片的函数。
infer\_camera.py:调用电脑摄像头,对摄像头得到的图片进行推理,实时显示人脸回归框和五个关键点。
infer\_path.py:处理指定路径的图片,识别图片中的人脸,显示人脸回归框和五个关键点(可处理多人)。
modelToMNDIR.py:将.ckpt格式的模型转换为mindir格式。
## 3 模型训练过程
MTCNN是一个级联网络模型,包含PNet,RNet,ONet三个网络。这三个网络的计算结果一个比一个精确,后两个网络都会起到对其前一个网络的结果进行进一步筛选的作用。生成数据集时会调用之前网络进行推理,将之前网络的推理结果用于生成下一个网络的数据集,网络训练过程比较繁琐。
训练步骤:
1. 进入train\_PNet文件夹,运行generate\_PNet\_data.py生成训练PNet的数据集;运行train\_PNet.py训练PNet。
2. 进入train\_RNet文件夹,运行generate\_RNet\_data.py生成训练RNet的数据集;运行train\_RNet.py训练RNet。
3. 进入train\_ONet文件夹,运行generate\_ONet\_data.py生成训练ONet的数据集;运行train\_ONet.py训练ONet。
训练结束后,如果想验证模型训练结果,可以运行infer\_camera.py,调用电脑的摄像头,模型参数正确则可以显示人脸回归框和关键点。也可以运行infer\_path.py,对指定图片进行推理。
## 4 项目心得
最开始网络训练时loss不下降,我推断出是梯度反向传播的问题,但迟迟没有解决。感谢ms技术交流群的**wgx**老师,帮我修改了loss函数和训练PNet的代码(训练RNet和ONet的代码是类似的),并规范了我的模型定义。
### 4.1 模型训练
MindSpore中数据集的加载方式和Pytorch不同,所以我自定义了数据库加载类GetDatasetGenerator来获取数据。
在Pytorch中,网络模型和损失函数是分开计算的,使用起来比较自由。MindSpore中模型的训练流程相比之下要固定很多,但也确实对代码做出了简化。因为该模型的损失函数对类别、回归框、关键点三部分的损失做加权求和,故需要自定义损失函数。在ms中自定义的损失函数要应用到网络中需要再定义一个类,我定义的这个类名为NetWithLossCell。该类中调用网络backbone得到计算结果,再将结果送到loss函数中计算损失。训练过程中如果想查看损失函数,则应该在model.train中传入callbacks,用LossMonitor来输出损失。
夜雨飘零老师的代码里训练过程中还会输出模型的精度,这在Pytorch中是直接计算的,但ms的Model类想返回两个值非常困难,所以wgx老师帮助我通过在callbacks中传入一个精度计算函数来实现了这个功能。该函数的本质是对数据集做一次eval,因为传入的是整个训练集所以非常耗时,我在训练过程中没有使用。理论上来说如果可以提取训练集的一部分传入精度计算函数就可以节约大量时间并获得精度。
### 4.2 API映射问题
Pytorch版代码中,MaxPool2d的ceil参数设置为True。由于mindspore中的MaxPool2d方法没有ceil这个参数,故直接使用会导致结果的shape与论文中的不同,于是我在进行pool之前先进行了padding,可以保证每层的输出结果与论文中一致。
pytorch版代码中的其他方法都可以在mindspore中找到功能甚至名称一样的方法,写法上注意一下即可。
### 4.3 内存溢出和推理速度过慢问题
生成训练RNet和ONet用的数据集时会采用图像金字塔的思想,这会导致输入到MindSpore中的图像shape不断变化。如果是在GRAPH\_MODE下训练模型,似乎会让框架重复生成网络,导致程序的内存占用量不断上升,最终在Linux系统中导致内存耗尽程序自动退出。如果是PYNATIVE\_MODE,程序的内存占用量会不断上升,但最终占用量不会像在GRAPH\_MODE下那么夸张,生成RNet的数据集用了25G左右,我开了32G的虚拟内存之后就可以应付。不过生成ONet用的数据集时,因为生成数据集的写法问题,导致内存占用量太大,我在linux系统中新开的虚拟内存没办法挂载上根�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
python实现基于华为MindSpore框架实现人脸识别和关键点检测网络MTCNN.zip我的大作业选题是用轻量级的网络模型backbone,实现手机端人脸检测算法,并使用MindSpore Lite在端侧推理部署。比较遗憾的是整体项目开发进度慢于预期,加上移动端目标检测APP的源码中使用了JNI等我不熟悉的接口,最后没有实现移动端的部署,仅实现了人脸检测+关键点检测神经网络的搭建、训练和测试。 python实现基于华为MindSpore框架实现人脸识别和关键点检测网络MTCNN.zip我的大作业选题是用轻量级的网络模型backbone,实现手机端人脸检测算法,并使用MindSpore Lite在端侧推理部署。比较遗憾的是整体项目开发进度慢于预期,加上移动端目标检测APP的源码中使用了JNI等我不熟悉的接口,最后没有实现移动端的部署,仅实现了人脸检测+关键点检测神经网络的搭建、训练和测试。 python实现基于华为MindSpore框架实现人脸识别和关键点检测网络MTCNN.zip我的大作业选题是用轻量级的网络模型backbone,实现手机端人脸检测算法,并使用MindSpore
资源推荐
资源详情
资源评论


























收起资源包目录



































































共 52 条
- 1
资源评论


猰貐的新时代
- 粉丝: 1w+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- Winxp-sp2-360xpse6.3.1.145.exe 版本号:6.3.1.145 内核版本:21.0.1180.89
- C语言实现电力系统优化:MOS替换二极管与50kw充电模块仿真及谐波控制 · MOS管 全面版
- python实现近似圆形端面查找程序.ZIP
- 台达PLC与DT3温控器基于Modbus协议的温度控制与监控系统
- Simulink环境中基于EKF扩展卡尔曼滤波算法的电池SOC高精度估计研究
- 台达DVP EH3系列PLC与DT3温控器基于Modbus协议的通讯及控制程序详解
- 电力电子领域中有源滤波器(APF)的谐波消除技术及控制策略解析
- 光伏发电与储能系统中Boost电路、双向DCDC及并网逆变器控制策略的仿真模型研究
- 台达DVPEH3 PLC与DT3温控器基于Modbus协议的通信及控制程序详解
- 基于Multisim仿真的温度传感器信号放大电路设计:实现0V至5V电压信号转换
- 基于COMSOL的变压器三维声-固耦合仿真模型:高效模拟振动与声场特性
- COMSOL锂枝晶模型五合一技术解析:从单枝晶到雪花枝晶的多物理场耦合仿真
- BMS仿真系统:包含多项功能的高效电池管理模型——State of Charge与状态监控,充放电控制及冷却风机一体化管理
- 三相感应异步电机参数辨识与仿真:C代码移植及S函数硬件仿真方法
- 新能源汽车VCU开发模型及控制策略详解:从控制策略模型到软件设计全解析 - 控制策略
- 单相光伏并网逆变器设计方案:硬件与软件设计、仿真及控制代码详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
