【已开源】mtcnn_pytorch完美复现

2023-10-29 02:58

本文主要是介绍【已开源】mtcnn_pytorch完美复现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

零 、代码发现

开源QQ群:414475612,名称LazyNet,代码详见群文件

GITHUBhttps://github.com/samylee/mtcnn_pytorch

一、算法介绍

MTCNN,Multi-task convolutional neural network(多任务卷积神经网络),将人脸区域检测与人脸关键点检测放在了一起,它的主题框架类似于cascade。总体可分为P-Net、R-Net、和O-Net三层网络结构。

二、实现结果(完美复现,不是接近!)

2.1. 准确率

2.2. 速度

mtcnnhardwaresoftwareimage_sizemin_sizespeed
zhang'si7-9700K

vs2017-opencv-dnn

640x4802035ms
samyleei7-9700K

vs2017-opencv-dnn

640x4802032ms

2.3. 优势
2.3.1. 大多数复现mtcnn代码并不能完美复现mtcnn的速度,因为他们pnet网络产生了大量负样本,导致整体算法速度减慢,虽然能获得更大的recall,但摒弃了mtcnn算法设计初衷。
2.3.2. 大多数复现mtcnn代码并不能完美复现mtcnn的精度,其ROC曲线并不能重合或稍高。
2.3.3. 大多数复现mtcnn代码编写复杂,逻辑冗长,无法一目了然。
2.3.4. 提供pytorch转caffe工具和c++实现工程,工程部署不在话下。

2.4. 效果展示

三、实现要求

3.1. 系统及硬件要求
ubuntu16.04, nvidia-1080 或者更高,
3.2. 软件要求
anaconda(强烈建议),pycharm(强烈建议)
3.3. 算法依赖
python==3.6
pytorch-gpu==1.4
opencv-python==4.5.4
pickle

四、实现步骤

4.1. pnet实现
4.1.1. 进入'prepare_data/12net_data'下依次运行'gen_12net_data.py'和'gen_12net_imdb.py',用以生成pnet数据结构。
4.1.2. 进入'train', 新建'pnet'文件夹,运行'train_pnet.py'
4.2. rnet实现
4.2.1. 进入'prepare_data/24net_data'下依次运行'gen_24net_data.py', 'gen_24net_data_append.py', 'gen_24net_landmark_data.py'和'gen_24net_imdb.py',用以生成rnet数据结构。
4.2.2. 进入'train', 新建'rnet'文件夹, 运行'train_rnet.py'
4.3. onet实现
4.3.1. 进入'prepare_data/48net_data'下依次运行'gen_48net_data.py', 'gen_48net_data_append.py', 'gen_48net_landmark_data.py'和'gen_48net_imdb.py',用以生成rnet数据结构。
4.2.2. 进入'train', 新建'onet'文件夹, 运行'train_onet.py'

五、测试步骤

5.1. pnet测试
进入'test'文件夹,运行'test_pnet.py'
5.2. rnet测试
进入'test'文件夹,运行'test_rnet.py'
5.3. onet测试
进入'test'文件夹,运行'test_onet.py'

六、验证步骤

6.1. 进入'validate'文件夹下,新建'output'文件夹,运行'gen_fddb_results.py'即可。
6.2. 获得ROC曲线方式网上博客很多,这里就不介绍了。

七. 实现细节

7.1. 关于pnet
7.1.1. 因pnet网络比较小,不利于landmark_regression,因此只采用了classification和bbox_regression。论文虽然写了landmark_regression,但是对标作者实现代码,非也!
7.1.2. 因pnet对classification要求比较高,所以loss_factor采用[1.0, 1.0]。论文虽然写了[1.0, 0.5, 0.5],但是对标作者实现代码,非也!
7.1.3. 数据比例neg:pos:part=3:1:1
7.2. 关于rnet
7.2.1. 因rnet对bbox_regression要求比较高,所以loss_factor采用[1.0, 10.0, 4.0]
7.2.2. 增加了'append'数据,是为了让数据均衡,同时也是让rnet尽可能的提高recall
7.2.3. 数据比例neg:pos:part:ldm=3:1:1:2
7.3. 关于onet
7.3.1. 因onet对landmark_regression要求比较高,所以loss_factor采用[1.0, 10.0, 40.0]
7.3.2. 和rnet类似,增加了'append'数据,是为了让数据均衡,同时也是让onet尽可能的提高recall
7.3.3. 数据比例neg:pos:part:ldm=3:1:1:2
7.4. imdb数据格式
7.4.1. 使用了pickle压缩成imdb格式数据,主要是增加数据读取效率,若直接在pytorch中反复读取数据,会使训练速度慢很多。
7.5. 数据增强
7.5.1. 10%数据灰度化,让网络针对夜间gray图像有一定的鲁棒性
7.5.2. 50%数据水平翻转,让网络更加健壮
7.6. loss设计
7.6.1. 分类loss,采用CrossEntropyLoss,并没有采用ohem,因为算法要求数据稍有不平衡(3:1:1:2),所以并不能使用ohem
7.6.2. 回归loss,采用MSELoss,但是注意reduction='none',并不能平均计算
7.7. wider数据调整
7.7.1. 调整数据格式,(x1, y1, x2, y2)
7.7.2. 调整数据宽高比,因wider有部分人脸数据宽高比为1:2,因此在制作数据时无法获得iou>0.65的正样本,所以将所有数据宽高比都限制在2:3以内
7.8. celebA数据调整
7.8.1. 该数据集人脸边框相较于wider有大不同,所以没有用到
7.8.2. 使用pnet和rnet的人脸检测获得边框更加符合mtcnn算法设计需求

这篇关于【已开源】mtcnn_pytorch完美复现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/297790

相关文章

Pytorch介绍与安装过程

《Pytorch介绍与安装过程》PyTorch因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究和开发的主流工具之一,本文给大家介绍Pyto... 目录1、Pytorch介绍1.1、核心理念1.2、核心组件与功能1.3、适用场景与优势总结1.4、优

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

pytorch之torch.flatten()和torch.nn.Flatten()的用法

《pytorch之torch.flatten()和torch.nn.Flatten()的用法》:本文主要介绍pytorch之torch.flatten()和torch.nn.Flatten()的用... 目录torch.flatten()和torch.nn.Flatten()的用法下面举例说明总结torch

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较