## 介绍
本项目的来源是我选修的北航与华为合作的《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系统中新开的虚拟内存没办法挂载上根�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
<项目介绍> 本项目的来源是我选修的北航与华为合作的《AI开源计算系统前沿技术》课程大作业。课程请到华为的各位专家介绍了华为目前的AI软硬件体系,并讲解了许多人工智能领域的知识。 我的大作业选题是用轻量级的网络模型backbone,实现手机端人脸检测算法,并使用MindSpore Lite在端侧推理部署。比较遗憾的是整体项目开发进度慢于预期,加上移动端目标检测A - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
资源推荐
资源详情
资源评论
收起资源包目录
mtcnn-mindspore-master.zip (53个子文件)
mtcnn-mindspore-master
train_ONet
generate_ONet_data.py 8KB
train_ONet.py 4KB
modelToMNDIR.py 1KB
test.jpg 73KB
rnet.mindir 409KB
result.jpg 151KB
train_PNet
train_PNet.py 4KB
generate_PNet_data.py 9KB
LICENSE 11KB
utils
utils.py 27KB
data_format_converter.py 3KB
data.py 3KB
__pycache__
data_format_converter.cpython-38.pyc 3KB
utils.cpython-38.pyc 19KB
data.cpython-38.pyc 3KB
dataset
testImageList.txt 504KB
trainImageList.txt 1.42MB
wider_face_train_bbx_gt.txt 4.72MB
wider_face_train.txt 4.84MB
.idea
mtcnn-mindspore.iml 490B
vcs.xml 180B
misc.xml 201B
inspectionProfiles
Project_Default.xml 1KB
profiles_settings.xml 174B
modules.xml 282B
.gitignore 47B
infer_models
ONet.ckpt 1.48MB
RNet.ckpt 396KB
PNet.ckpt 28KB
load_models
RNet.py 2KB
PNet.py 2KB
__pycache__
PNet.cpython-38.pyc 2KB
ONet.cpython-38.pyc 2KB
RNet.cpython-38.pyc 2KB
ONet.py 2KB
infer_path.py 9KB
pnet.mindir 39KB
infer_camera.py 9KB
train_RNet
generate_RNet_data.py 6KB
train_RNet.py 4KB
models
RNet.py 2KB
Loss.py 6KB
PNet.py 3KB
__pycache__
PNet.cpython-38.pyc 2KB
ONet.cpython-38.pyc 2KB
Loss.cpython-38.pyc 6KB
RNet.cpython-38.pyc 2KB
Loss_2.cpython-38.pyc 5KB
PNet_2.cpython-38.pyc 2KB
ONet.py 2KB
.gitignore 350B
onet.mindir 1.5MB
README.md 9KB
共 53 条
- 1
资源评论
- weixin_520217722024-10-19怎么能有这么好的资源!只能用感激涕零来形容TAT...
机智的程序员zero
- 粉丝: 2420
- 资源: 4923
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功