训练 - 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作为困难样例,然后我们在反向传播中只计算这些困难样例的梯度