训练 - SiYue0211/mtcnn_tf GitHub Wiki

从tfrecord中读取数据,数据包括图片信息,label信息,bbox信息,landmark信息。如果没有landmark默认为0

损失函数为三个损失函数叠加:分类损失,盒子损失,关键点损失,分别占比2:1: 1

图片尺寸为12*12

网路结构为: 这里写图片描述

其中左上为Pnet,详细解释一下:

con1= 输入图片为(12123),经过一层卷积(卷积核(3*3),filter为10, stride为1)

经过一个max—pooling(核(2*2),步长为2)

conv2=经过一个卷积(卷积核(3*3),filter为16, stride=1)

conv3=经过一个卷积(卷积核为(3*3),filter为32,stride=1)

在conv3下面接了3个分支,分别是三个卷积

conv4_1 = 经过一个卷积(卷积核为1*1,stride=1,filter为2,激活函数为softmax)

conv4_2 = 经过一个卷积(卷积核为1*1, stride=1, filter为4,无激活函数)盒子左上右下预测

conv4_3 = 经过一个卷积(卷积核为1*1, stride=1, filter为10,无激活函数)关键点预测

con4_1 计算这个图片是正例子的概率,进行在线困难样例,损失函数交叉熵损失函数.最终达到准确率94%左右

conv4_2 计算这个图片四个角位置,损失函数为:预测值(左上高和宽四个值)和真实框的距离的平方,也进行了在线困难样例

conv4_3 计算这个图片关键点位置,损失函数为:预测值(5个点,十个值)和真实landmark的距离的平方,进行了在线困难样例

多任务的训练:

因为我们在每个CNN使用了多个任务,所以在训练过程中有不同种类的图片,像人脸,非人脸,部分人脸。事实上,对于某些图可能这三个损失函数没有全都用上,像对于背景图,就只用了con—1 的交叉熵损失函数计算是正例子还是负例子的概率。

在线困难样例的原理:

在每个batch里,我们将前向传播得到的结果计算损失并选出前百分之70作为困难样例,然后我们在反向传播中只计算这些困难样例的梯度