MTCNN训练全程

参考链接:
Mxnet 训练代码
Tensorflow 训练代码
论文数据集
WiderFace数据集
在这里插入图片描述
在这里插入图片描述
数据集打包方法:
本文设计的网络包含三个不同的网络结构,Second Network的训练数据需要用到First Network训练好的模型生成,Third Network的训练数据由Second Network训练好的模型生成。 所以在模型训练阶段,需要面向多个任务,在网络训练的不同阶段,运行相应的脚本文件按,打包不同的数据。

  1. First Network数据打包
    (1) 运行gen_12net_data.py生成目标检测所用到的数据,原始数据为Widerface数据集,生成了部分代码如下。
im_dir = "/home/yuyang/dataset/MTCNN_DATA/WIDER_train/images"
pos_save_dir = "/home/yuyang/dataset/MTCNN_DATA/12/positive"
part_save_dir = "/home/yuyang/dataset/MTCNN_DATA/12/part"
neg_save_dir = '/home/yuyang/dataset/MTCNN_DATA/12/negative'
save_dir = "/home/yuyang/dataset/MTCNN_DATA/12"

将相对路径中…/DATA 改为绝对路径/home/yuyang/dataset/MTCNN_DATA。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2) 运行gen_landmark_aug_12.py生成关键点定位所用到的数据。
在这里插入图片描述
(3) 运行gen_imglist_pnet.py将前两部分的数据合二为一,生成图像列表。
在这里插入图片描述
(4) 根据第三步获取的图像列表,运行gen_PNet_tfrecords.py生成tensorflow框架所需的训练数据格式tfrecords。
在这里插入图片描述
2. Second Network数据打包
(1) 在完成First Network 训练后,运行gen_hard_example 生成Second Network的训练数据,此部分的训练数据用于人脸检测。

from sklearn.externals import joblib #将pickel去掉,这个会有缓存要求,内存不够,导致运行几小时的结果无法保存
def parse_args():
    parser = argparse.ArgumentParser(description='Test mtcnn',
    def parse_args():
    parser.add_argument('--test_mode', dest='test_mode', help='test net type, can be pnet, rnet or onet',
                        default='PNet', type=str)
    parser.add_argument('--prefix', dest='prefix', help='prefix of model name', nargs="+",
                        default=['../data/MTCNN_model/PNet_Landmark/PNet', '../data/MTCNN_model/RNet_Landmark/RNet', '../data/MTCNN_model/ONetLandmark/ONet'],
                        type=str)
    parser.add_argument('--epoch', dest='epoch', help='epoch number of model to load', nargs="+",
                        default=[30, 14, 16], type=int)  #此处为30,与逊
    return args

if __name__ == '__main__':

    net = 'PNet'

    if net == "PNet":
        image_size = 24
    if net == "RNet":
        image_size = 48

    base_dir = '/home/yuyang/dataset/MTCNN_DATA/WIDER_train'
    data_dir = '/home/yuyang/dataset/MTCNN_DATA/%s' % str(image_size)
    
    neg_dir = get_path(data_dir, 'negative')
    pos_dir = get_path(data_dir, 'positive')
    part_dir = get_path(data_dir, 'part')

结果:

1.083285 seconds for each image
12700 out of 12880 images done
1.773485 seconds for each image
12800 out of 12880 images done
1.591134 seconds for each image
num of images 12880
time cost in average1.261  pnet 1.261  rnet 0.000  onet 0.000
boxes length: 12880
finish detecting 
save_path is :
../MTCNN_DATA/no_LM24/RNet

(2) 运行gen_landmark_aug_24.py生成关键点定位所用到的数据。

#将data_path写上
def GenerateData(ftxt, data_path,net,argument=False):
    if net == "PNet":
        size = 12
    elif net == "RNet":
        size = 24
    elif net == "ONet":
        size = 48
    else:
        print('Net type error')
        return
    image_id = 0
    f = open(join(OUTPUT,"landmark_%s_aug.txt" %(size)),'w')
    data = getDataFromTxt(ftxt,data_path)
if __name__ == '__main__':
    # train data
    net = "RNet"
    data_path = "/home/yuyang/dataset/MTCNN_DATA/lfpw"
    #train_txt = "train.txt"
    train_txt = "trainImageList.txt"
    imgs,landmarks = GenerateData(train_txt, data_path,net,argument=True)

在这里插入图片描述
(3) 运行gen_imglist_pnet.py将前两部分的数据合二为一,生成图像列表。
在这里插入图片描述

(4) 根据第三步获取的图像列表,运行gen_RNet_tfrecords.py生成tensorflow框架所需的训练数据格式tfrecords,此脚本运行4次,分别生成Positive faces、Negative faces、Part faces、Landmark face的数据集。

if __name__ == '__main__':
    dir = '/home/yuyang/dataset/MTCNN_DATA'
    net = '24'
    output_directory = '/home/yuyang/dataset/MTCNN_DATA/imglists/RNet'
    if not os.path.exists(output_directory):
        os.makedirs(output_directory)
    name = 'pos' #更该name=neg,pos当name =landmark时,需要将 net = “/imglist/Rnet”,因为,生成的难例landmark.txt在Imaglists/RNet下。
    run(dir, net, output_directory,name, shuffling=True)
  1. Third Network 数据打包

(1) 在完成Sirst Network 训练后,运行gen_hard_example 生成Second Network的训练数据,此部分的训练数据用于人脸检测。

def parse_args():
    parser = argparse.ArgumentParser(description='Test mtcnn',
                                     formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('--test_mode', dest='test_mode', help='test net type, can be pnet, rnet or onet',
                        default='RNet', type=str)

在这里插入图片描述
(2) 运行gen_landmark_aug_48.py生成关键点定位所用到的数据。
生成了landmark_48_aug.txt和train_ONet_landmark_aug文件夹(图片)。
在这里插入图片描述
(3) 运行gen_imglist_pnet.py将前两部分的数据合二为一,生成图像列表。
(4) 根据第三步获取的图像列表,运行gen_ONet_tfrecords.py生成tensorflow框架所需的训练数据格式tfrecords,此脚本运行4次,分别生成Positive faces、Negative faces、Part faces、Landmark face的数据集。

简介:

core: 核心例程 for MTCNN training and testing.
tools: 工具 for training and testing
data: Refer to Data Folder Structure for dataset reference. Usually dataset contains images and imglists
model: Folder to save training symbol and model
prepare_data: scripts for generating training data for pnet, rnet and onet

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<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) - **训练停滞**:检查数据标注准确性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值