项目地址:GitHberChen/MTCNN_Pytorch
接上篇:Uno Whoiam:MTCNN人脸检测:三个臭皮匠,顶个诸葛亮 || 5分钟看懂CV顶刊论文
项目目录介绍:
- test_demo:存放测试结果的图片
- test_images:用于测试的图片
- weights:训练保存的模型权重文件
- create_dataset.py:用于解析CNN_FacePoint、WIDER_Face的.txt文件和制作三个模型的数据集
- detector.py:用于对图片进行检测,即效果展示
- dataset.py:mtcnn_dataset 用于读取生成好的图片库数据集,InplaceDataset 用于按照论文的方式即时生成三类模型的训练数据
- model.py:模型和损失函数
- train.py:训练三个模型
- util.py:一些工具
其它的文件用途不大,.sh 用来训练和制作数据集,可以不用管,想用的话得自己配置路径。
生成数据集:
关于数据集,必须得讲讲其标注的格式:
CNN_FacePoint :
lfw_5590Abbas_Kiarostami_0001.jpg 75 165 87 177 106.750000 108.250000 143.750000 108.750000 131.250000 127.250000 106.250000 155.250000 142.750000 155.250000
- 第一个是文件保存的相对路径
- 随后4个数字分别表示人脸框的
,没想到吧!
- 最后10个数字分别是左眼、右眼、鼻子、左嘴角、右嘴角的
坐标
WILDER_Face:
0--Parade/0_Parade_marchingband_1_799.jpg
21
78 221 7 8 2 0 0 0 0 0
78 238 14 17 2 0 0 0 0 0
113 212 11 15 2 0 0 0 0 0
134 260 15 15 2 0 0 0 0 0
163 250 14 17 2 0 0 0 0 0
201 218 10 12 2 0 0 0 0 0
182 266 15 17 2 0 0 0 0 0
245 279 18 15 2 0 0 0 0 0
304 265 16 17 2 0 0 0 2 1
328 295 16 20 2 0 0 0 0 0
389 281 17 19 2 0 0 0 2 0
406 293 21 21 2 0 1 0 0 0
436 290 22 17 2 0 0 0 0 0
522 328 21 18 2 0 1 0 0 0
643 320 23 22 2 0 0 0 0 0
653 224 17 25 2 0 0 0 0 0
793 337 23 30 2 0 0 0 0 0
535 311 16 17 2 0 0 0 1 0
29 220 11 15 2 0 0 0 0 0
3 232 11 15 2 0 0 0 2 0
20 215 12 16 2 0 0 0 2 0
- 第一行是图片文件保存的相对路径
- 第二行是该图所标注人脸的数量N
- 后面N行都是人脸框的位置
真是让人回忆起了刷算法题的美好时光呢。
这个项目里我实现了三种生成数据的思路:
- 读取CNN_FacePoint、WILDER_Face里的图片通过随机截取按比例生成
、、的四类数据集保存在硬盘,图片标签信息用txt文件保存,简而言之,三个模型的数据集都按照论文中生成数据集的方式生成。
-
数据生成的方式同1;通过训练好的检测CNN_FacePoint、WILDER_Face的图片生成四类数据、则包含两者,一是通过训练好的检测CNN_FacePoint、WILDER_Face生成(同,只不过最后缩放的尺寸为),二是和将生成数据集的再通过训练好的筛选修正后生成。同样也是保存在硬盘,图片标签信息用txt文件保存。
- 方法同2。不过是通过dataset.py中的
类即时生成训练数据,而不保存。
第一个方法训练出来的模型无法很好找出人脸,后两者则可以训练出不错的效果。方法二生成的图片都很小,数量很大,而且txt文件也很巨大,管理起来很麻烦。方法三的话给CPU的负担比较大,训练速度不如二,毕竟是一边生成数据一边训练,可以采用DataLoader里多个线程(num_workers)生成数据弥补。
具体使用:
下载好CNN_FacePoint、WILDER_Face的数据集,将其路径和其它参数在create_dataset.py里配置好。
- 在create_dataset.py中实现,已被注释掉,弃用。
- 在create_dataset.py中实现,通过设置dataset_config或者编写.sh生成三类模型的训练数据。
- 在dataset.py中的InplaceDataset类实现,需设置好create_dataset.py的dataset_config
训练模型:
在train.py中设置好训练参数以及训练数据的文件夹路径、txt文档路径(用命令行传入也可)后在项目文件夹中运行:
python train.py --trainnet *net_name*
,默认使用
类实时生成数据训练三种模型,也可在train函数中禁用,即设置
,那么就可以用上文方法二生成好保存在硬盘里的数据集进行训练。
测试:
在detector.py中测试:
python detector.py
可以看到测试图片上的检测效果:
目前没有训练得很好,还待优化。
目前发现有两个坑待填:
- 如何按论文中说的一样,选取前70%的loss进行反向传播?
- benchmark
欢迎关注个人微信公众号: