使用的人脸数据集
训练mtcnn的数据集论文里使用的是WIDER FACE 和CelebA,其中WIDER FACE用作回归人脸分类和box,CelebA用来回归关键点(landmark)
人脸数据集特点
训练数据集里面分为 negatives, positives, part face。
- negatives:可以认为是图片的背景的非人脸部分,使用和真实标注框的iou<0.3
- positives:人脸部分,使用和真实标注框的iou>0.65
- part face:部分人脸,使用和真实标注框的iou>0.4
negatives 和 positives 用于分类任务
positives 和 part face 用于box回归
landmark 用于计算 landmark 回归
这里我们是使用tfrecord打包训练数据集和,这样可以加快训练速度,其中tfrecord的内容为
feature = {
"image": tf.train.Feature(bytes_list=tf.train.BytesList(value=[image.tobytes()])),
"label": tf.train.Feature(float_list=tf.train.FloatList(value=label))
}
image是图片数据,其中图片是回归到了0-1之间
label包含分类标签(0/1),标注方框offset(x1, y1, x2, y2),5个landmark关键点坐标的offset ,因此label的长度为15
image | label | bboxs | landmark point | |
---|---|---|---|---|
positives | tensor | 1 | [x1, y1, x2,y2] | [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1] |
negatives | tensor | 0 | [-1, -1, -1,-1] | [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1] |
part face | tensor | -1 | [x1, y1, x2,y2] | [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1] |
landmark | tensor | -2 | [-1, -1, -1,-1] | [x1,y1,x2,y2,x3,y3,x4,y4,x5,y5] |
现在知道了数据集的内容,但是bbos和landmark point怎么进行做offset呢
bbos的的标注如下方式
offset_x1 = (x1 - nx1) / float(size)
offset_y1 = (y1 - ny1) / float(size)
offset_x2 = (x2 - nx2) / float(size)
offset_y2 = (y2 - ny2) / float(size)
这里 size 为截图的宽高,一般截图采取正方形
landmark point 的offset
训练数据的比例分配
negatives:positives:part face:landmark
数据集划分 PNet:3:1:1:0 RNet:3:1:1:0 ONet:3:1:1:2
每个模型的训练数据集怎么获取
P-Net的训练数据是从WIDER FACE获取。
R-Net的训练数据是P-Net生成
O-Net的训练数据是R-Net生成,landmark数据由CelebA得到
怎么获取训练数据集
代码之后放到github