人脸数据集WIDER FACE,该数据集仅提供了大量的人脸边框定位数据。
如果使用wider face的 wider_face_train.mat 注解文件需要转换成txt格式的,我这里用h5py写了个 转换脚本. 这里我提供一个已经转换好的wider face注解文件 anno_store/wider_origin_anno.txt, 以下训练过程参数名--anno_file默认就是使用该转换好的注解文件。
在注解文件wider_origin_anno.txt格式如下 :
0--Parade/0_Parade_marchingband_1_849.jpg 448 329 570 478
0--Parade/0_Parade_marchingband_1_117.jpg 68 359 118 394 226 382 282 425 295 304 339 330 353 279 393 315 884 377 947 418 818 390 853 434 727 341 764 372 598 246 631 275 740 308 785 341
每四个数字代表该图片中的一个人脸边框定位数据x1, y1, x2, y2(x_left, y_top, x_right, y_bottom),第一张照片有只一个人脸,第二张照片有9个人脸
输入是12*12*3的图片,以及标签 = 样本类型0/1/-1 + 四个数字为一组的crop_box与真实box之间的偏差,成为回归框(bounding box regressiom)
negative样本:IOU < 0.3,标签为:0 0 0 0 0
positive样本:IOU > =0.65,标签为:1 0.01 0.02 0.01 0.02
part样本:0.4 <= IOU < 0.65,标签为: -1 0.03 0.04 0.03 0.04
P-Net主要用来生成一些候选框(bounding box)以及lable。在训练的时候该网络的顶部有3条支路用来分别做人脸分类、人脸框的回归和人脸关键点定位;在测试的时候这一步的输出只有N个bounding box的4个坐标信息和score,score可以看做是分类的输出(是人脸的概率),源代码中输出就是sigmoid函数值。
1、遍历数据集,在每一张照片的基础上:
具体方法:在一张照片的基础上随机生成crop_box,计算crop_box与boxes的Iou,然后按照crop_box的尺寸剪切原图片并缩放成12*12大小的图片,转换成12*12*3的结构,根据Iou对新生成的照片归类
2、遍历第一步中的那张照片的boxes,在每个box的基础上:
# compute bbox reg label,其中x1,x2,y1,y2为真实的人脸坐标,x_left,x_right,y_top,y_bottom,width,height为预测的人脸坐标,
# 如果是在准备人脸和非人脸样本的时候,x_left,x_right,y_top,y_bottom,width,height就是你的滑动窗与真实人脸的IOU>0.65(根据你的定义)的滑动窗坐标。
# dface代码中box用的是正方形,即size=width=height代表box窗口的边长
offset_x1 = (x1 - x_left) / float(width)
offset_y1 = (y1 - y_top) / float(height)
offset_x2 = (x2 - x_right) / float(width)
offset_y2 = (y2 - y_bottom ) / float(height)
3、最后的输出
negative样本:IOU < 0.3,标签为:0 0 0 0 0
positive样本:IOU > =0.65,标签为:1 0.01 0.02 0.01 0.02
part样本:0.4 <= IOU < 0.65,标签为: -1 0.03 0.04 0.03 0.04
将三个样本文件合并到一个文件 PNET_TRAIN_IMGLIST_FILENAME = "imglist_anno_12.txt"
训练PNet的训练数据就是上面提到的PNET_TRAIN_IMGLIST_FILENAME
加载pnet模型,预测图片的bounding box信息
读取WIDER FACE数据集的标注信息