人脸检测之MTCNN(二)——模型的训练尝试

前言

这一篇主要记录模型的训练尝试过程,之所以称为“尝试”,是因为受限于个人能力,这里只做了简单粗浅的训练,无法提供详细的调参/效果提升的相关建议。训练代码包括训练集数据主要参考自链接,原文中代码存在一些错误在这里做了一些修改。另外这里只训练模型输出人脸得分与人脸框位置,并未输出人脸5个关键点信息。

数据准备

训练中需要ground truth数据,这里从人脸数据集(密码:ctvw)下载相关数据。下载后的数据中包括图像数据与包含人脸框的标注xml文件,需要从xml文件中解析得到人脸框数据,并与图像文件对应起来保存到一个文本中,具体见我的工程中的parse_xml.py。
之后我们需要生成训练集,原始版本算法中需要生成4类数据集pos、part、neg、landmark,这里由于没有人脸关键点的数据,不会生成第四项数据集。通过在人脸照片中随机裁剪部分图像数据,并计算该区域与参考人脸框的IOU值。若IOU值大于0.65,将其归为part,若IOU小于0.4,将其归为neg;否则归为part。训练中会使用pos+neg训练网络的人脸得分部分,使用pos+part训练网络中的人脸框位置部分。将裁剪的图像宽高缩放为12X12,这里生成的数据都是为了训练PNET网络。

模型训练

训练PNET:其输入图宽高为12X12,输出为人脸得分与人脸框位置;
训练RNET:将得到的PNET作用于人脸数据集,并将得到的人脸框与参考人脸框计算IOU,再根据其大小分为pos、part、neg三类;将图像尺寸缩放为24X24,作为RNET训练集,训练RNET
训练ONET:将得到的PNET与RNET依次作用于人脸数据集,并将得到的人脸框与参考人脸框计算IOU,再根据其大小分为pos、part、neg三类;将图像尺寸缩放为48X48,作为ONET训练集,训练ONET

测试

使用输入图测试结果如下,可以看到一个人脸区域出现两个相邻的人脸框,这里可以通过调整NMS中的阈值来过滤掉。完整的工程代码见链接:https://pan.baidu.com/s/1UdY_9J8hGfEEZoOv-1CdWg 提取码:inny

在这里插入图片描述

参考

https://blog.csdn.net/weixin_41668848/article/details/107333162

猜你喜欢

转载自blog.csdn.net/lwx309025167/article/details/114594533