MTCNN训练代码的相关问题

本文记录了在训练MTCNN过程中遇到的错误和解决方案,包括数据下载、目录结构、Python环境问题以及训练脚本的错误处理。通过解决显卡显存、模块导入、版本兼容、CUDA配置等问题,逐步进行数据准备和模型训练。

最近在整MTCNN相关的东西,于是从github大佬处clone了一份,无奈本人手残,跑起来处处是报错。帖子上的询问均是石沉大海,只有边搞边记录了,希望能坚持到跑通的那一天吧= =。

博文优快云:https://blog.youkuaiyun.com/weixin_36474809/article/details/82752199
博文代码: https://github.com/AITTSMD/MTCNN-Tensorflow

README

  1. Download Wider Face Training part only from Official Website , unzip to replace WIDER_train and put it into prepare_data folder.
  2. Download landmark training data from [here]((http://mmlab.ie.cuhk.edu.hk/archive/CNN_FacePoint.htm )),unzip and put them into prepare_data folder.
  3. Run prepare_data/gen_12net_data.py to generate training data(Face Detection Part) for PNet.
  4. Run gen_landmark_aug_12.py to generate training data(Face Landmark Detection Part) for PNet.
  5. Run gen_imglist_pnet.py to merge two parts of training data.
  6. Run gen_PNet_tfrecords.py to generate tfrecord for PNet.
  7. After training PNet, run gen_hard_example to generate training data(Face Detection Part) for RNet.
  8. Run gen_landmark_aug_24.py to generate training data(Face Landmark Detection Part) for RNet.
  9. Run gen_imglist_rnet.py to merge two parts of training data.
  10. Run gen_RNet_tfrecords.py to generate tfrecords for RNet.(you should run this script four times to generate tfrecords of neg,pos,part and landmark respectively)
  11. After training RNet, run gen_hard_example to generate training data(Face Detection Part) for ONet.
  12. Run gen_landmark_aug_48.py to generate training data(Face Landmark Detection Part) for ONet.
  13. Run gen_imglist_onet.py to merge two parts of training data.

 

开始受苦

我们根据文章先去下有关数据集(官网就有,觉得慢就用迅雷之类的下,注意这里要下载的文件数量),然后放到对应文件夹位置(prepare_data)。

有需要可以去下阉割版的:https://pan.baidu.com/s/1mf0hM5VqtpdMfTpf2VRELA  提取码:kuqw   (感谢网上大佬的资源)(不过我还是推荐下原版文件,虽然很大)

又或者(更新):链接: https://pan.baidu.com/s/1LIYlK5sVx4qsK9tvEuJ4cw 提取码: 2yvx

在遇见具体的代码问题之前,有几个常规报错需要了解:

 

1.

这里是显卡的显存的问题,手动调整显卡的占用率:

import tensorflow as tf
gpu_options = tf.compat.v1.GPUOptions(per_process_gpu_memory_fraction=0.333)
sess = tf.compat.v1.S
<think>好的,我现在需要帮助用户了解如何使用Keras实现MTCNN进行人脸检测或对齐的训练。首先,我得回忆一下MTCNN的结构和相关技术细节。根据用户提供的引用内容,MTCNN由P-Net、R-Net和O-Net三个网络组成,分阶段处理人脸检测和对齐。每个网络有不同的作用,比如P-Net生成候选框,R-Net进一步筛选,O-Net进行关键点检测。 用户的问题训练MTCNN,所以我需要先明确训练流程。首先,数据准备是关键。用户需要收集带有人脸标注的数据集,比如WIDER FACE和CelebA。数据预处理部分可能需要生成图像金字塔,并为每个网络准备训练数据,包括人脸区域、边界框回归和关键点坐标。这里可能需要用到数据增强技术,比如随机裁剪、旋转等,以提高模型的泛化能力。 接下来是模型构建。根据引用中的信息,MTCNN的三个子网络都是CNN结构。我需要用Keras来定义这三个网络的架构。例如,P-Net可能是一个较浅的CNN,用于快速生成候选框。每个网络的输出应包括分类(是否为人脸)、边界框偏移和关键点位置。损失函数方面,分类任务可以用交叉熵,回归任务用均方误差或平滑L1损失。需要注意多任务学习的损失权重平衡。 然后是训练过程。每个网络需要分阶段训练,先训练P-Net,然后用P-Net生成的数据训练R-Net,最后用R-Net的输出训练O-Net。训练参数如优化器选择Adam,学习率调整,批量大小等都需要考虑。可能需要使用预训练模型或从头开始训练,这取决于用户的数据量和资源。 在训练完成后,还需要进行推理流程的构建,将三个网络级联起来,处理输入图像并逐步优化检测结果。同时,用户可能需要调整非极大值抑制(NMS)的参数,以平衡检测精度和速度。 不过,用户可能遇到的问题包括数据标注的准确性、训练时间过长、模型收敛困难等。需要建议用户使用GPU加速训练,并确保数据预处理正确。此外,参考项目中的代码示例,比如detect.py,可能对理解整个流程有帮助。 最后,根据用户提供的引用,项目源码已经存在,用户可以基于现有实现进行修改和训练,这可能比从零开始更高效。需要提醒用户注意依赖版本,如TensorFlow-gpu 1.13.1和Keras 2.1.5,避免版本兼容性问题。</think>以下是使用Keras实现MTCNN进行人脸检测/对齐训练的完整流程指南: ### 一、MTCNN训练流程 1. **数据准备阶段** - 使用WIDER FACE数据集(标注格式:图像路径、人脸坐标、关键点) - 数据增强方法: - 随机裁剪(生成正/负/部分样本) - 图像旋转(±30°范围) - 色彩扰动(亮度、对比度调整±20%) - 镜像翻转(概率50%) 2. **网络架构搭建** ```python # P-Net示例(Proposal Network) def build_PNet(input_shape=(None, None, 3)): inputs = Input(shape=input_shape) x = Conv2D(10, (3,3), activation='relu', name='conv1')(inputs) x = MaxPool2D((2,2), strides=2, name='pool1')(x) x = Conv2D(16, (3,3), activation='relu', name='conv2')(x) x = Conv2D(32, (3,3), activation='relu', name='conv3')(x) # 多任务输出 classifier = Conv2D(2, (1,1), activation='softmax', name='classifier')(x) bbox_reg = Conv2D(4, (1,1), name='bbox_reg')(x) landmarks_reg = Conv2D(10, (1,1), name='landmarks_reg')(x) return Model(inputs, [classifier, bbox_reg, landmarks_reg]) ``` ### 二、关键训练技术 1. **多任务损失函数设计**: $$L = \alpha \cdot L_{cls} + \beta \cdot L_{box} + \gamma \cdot L_{landmark}$$ - 分类损失:交叉熵(权重$\alpha=1$) - 框回归损失:欧式距离($\beta=0.5$) - 关键点损失:欧式距离($\gamma=0.5$) 2. **分阶段训练策略**: 1. 先训练P-Net(生成候选框) 2. 冻结P-Net参数后训练R-Net(精炼候选框) 3. 最后训练O-Net(关键点精确定位) 3. **在线硬样本挖掘**: - 每批次保留分类误差最大的30%样本 - 正负样本比例保持1:3 ### 三、训练参数设置 | 参数 | P-Net | R-Net | O-Net | |-------------|---------|---------|---------| | 输入尺寸 | 12×12 | 24×24 | 48×48 | | 批大小 | 512 | 256 | 128 | | 初始学习率 | 0.001 | 0.0005 | 0.0002 | | 训练轮数 | 20 | 30 | 40 | ### 四、训练验证技巧 1. **验证集构建**: - 使用FDDB数据集进行召回率验证 - 计算平均IOU(Intersection over Union) ```python def calculate_iou(boxA, boxB): xA = max(boxA[0], boxB[0]) yA = max(boxA[1], boxB[1]) xB = min(boxA[2], boxB[2]) yB = min(boxA[3], boxB[3]) interArea = max(0, xB - xA) * max(0, yB - yA) boxAArea = (boxA[2] - boxA[0]) * (boxA[3] - boxA[1]) boxBArea = (boxB[2] - boxB[0]) * (boxB[3] - boxB[1]) return interArea / float(boxAArea + boxBArea - interArea) ``` 2. **模型保存策略**: - 每5个epoch保存检查点 - 保留验证集表现最佳的3个模型 ### 五、注意事项 1. **硬件要求**: - GPU显存 ≥8GB(推荐RTX 3080以上) - 内存 ≥32GB(处理大规模数据集时) 2. **常见问题处理**: - **梯度爆炸**:添加梯度裁剪`clipvalue=0.5` - **过拟合**:使用Dropout(概率0.3-0.5) - **训练停滞**:检查数据标注准确性
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值