MTCNN--P--create_data

总结下做MTCNN时的过程以及关键步骤。
首先说明下MTCNN的损失函数,因为是多任务级联,多任务值得就是多个损失,级联指的是三个网络联合P-R-O
因为是用来检测人脸并识别关键点的,所有有三个损失,人脸交叉熵损失,offset偏差的MSE损失,以及landmark的MSE损失。损失很简单就不说明了。这里先标注下P网络的输出数据的维度

用于人脸的交叉熵损失(batch,height,width,2)
用于offset的MSE损失(batch,height,width,4)
用于关键点landmark的MSE算(batch,height,width,10)

现在开始制作数据集,我们使用的是wider_face和lfw_5590俩个数据集。这里先解释下为什么要用这俩个数据集,因为widerface数据集的格式如下:
0–Parade/0_Parade_Parade_0_904 360.92 97.92 623.91 436.46
image_names (x1,x2,y1,y2),()
这个数据集只有人脸框的坐标,而没有landmarks信息
所有我们又结合了lfw_5590来制作landmarks数据
lfw_5590\Aaron_Eckhart_0001.jpg 84 161 92 169 106.250000107.750000 146.750000 112.250000 125.250000 142.750000 105.250000 157.750000 139.750000 161.750000
这个里面很规范,image_name bboxes 10个landmarks坐标

这里在刚开始看到的时候有个疑问,不同的数据集怎么放到一起来训练?如何对应?先看下面,然后就会明白。
我们先制作数据集。在MTCNN论文中提到,MTCNN可以接受任意维度的图片输入,但是这不意味着训练的时候也可以输入任意维度的图片,之所以可以接受任意维度的图片输入,是因为MTCNN的P-net网络为全卷积网络,即没有使用全连接。这里P-net训练的时候的图片输入维度为(batch,12,12,3)

数据集示例(这里的坐标,都是offet的坐标)
12/positive/78235.jpg 1 -0.04 -0.13 -0.08 0.21
12/part/802370.jpg -1 0.06 -0.46 0.14 0.27
12/negative/554232.jpg 0
12/train_PNet_landmark_aug\179649.jpg -2 0.4 0.2 0.8923076923076924 0.23076923076923078 0.7230769230769231 0.6 0.36923076923076925 0.8153846153846154 0.7384615384615385 0.8307692307692308

其实这个制作数据集过程,可以理解为大豆子揉碎了然后扔到模型进行训练的过程。

  1. 首先制作posiitive,part,negative三个部分
以wider_face中的这条数据为例
Parade/0_Parade_Parade_0_904 360.92 97.92 623.91 436.46 
image_name  x1 y1 x2 y2
1.计算图片中人脸框的width,height
w = x2 - x1 + 1
h = y2 - y1 + 1
2.随机确定裁剪后的宽高
size = npr.randint(int(min(w,h)*0.8),np.ceil(1.25*max(w,h))
3.在bbox上看x,y坐标随机偏移多少
delta_X = npr.randint(-w * 0.2,w * 0.2)
delty_y = npr.randint(-h * 0.2,h * 0.2)
4.求裁剪后坐标
nx1 = max(x + w / 2 + delta_x - size / 2,0)
ny1 = max(y + h / 2 + delta_y - size / 2,0)
nx2 = nx1 + size
ny2 = ny2 + size
(x + w / 2 ,y + h / 2): bbox中心的坐标
+ delta_x,delta_y:偏移
- size / 2 :确保加了偏移后nx2,ny2跑出bbox框,以随机裁剪计算iou
5 计算offset
offset_X1 = (x1 - nx1) / size
offset_y1 = (y1 - ny1) / size
offset_x2 = offset_x1 + size
offset_y2 = offset_y1 + size
6 总结:
首先我们可以根据这个过程来对每张图片进行随机裁剪,然后计算裁剪出来的框与原始bbox的iou,
iou >=0.65           postive 打label 为1
0.64 > iou >= 0.4    part    打label 为-1
因为在这个范围内很少有 iou < 0.3 的用来打负样本的neg签,所有在img中可以随机裁剪计算iou来打neg的label
iou < 0.3					neg  0
offset为我们数据集要用的。
这里思考俩个问题,在decode的时候,offset如何对应回原始图片的坐标????
size 和nx1这些怎么用?

2.制作landmark部分

以这条lfw_5590中数据为例
lfw_5590\Aaron_Eckhart_0001.jpg 84 161 92 169 106.250000 107.750000 146.750000 112.250000 125.250000 142.750000 105.250000 157.750000 139.750000 161.750000
image_name   bbox   landmark
1 
#将ladmark,transpose成(5,2)
landmark_rv = {}
#原文说是normalize,其实这个是要对应offset的,就是offset的过程
for indx,one in eneurmate(landmark):
	rv = ((one[0] - bbox[0]) / bbox[2] - bbox[0], (one[1] - bbox[1]) / bbox[3] - bbox[1])
	landmark_rv[indx] = rv

2.我们需要将这个landmark对应的图片保存下来,用来训练的时候输入
img = cv2.imread(image_name)
#截取img中landmark对应的图片
face= img[bbox[0]:bbox[2]+1:bbox[1]:bbox[3]+1]
#将图片resize成P-net输入大小(12,12),这里cv2.resize是用的插值法,会不会丢掉大多图片信息?
face = cv2.resize(face,(12,12))
cv2.imwrite('id',face)
3.对数据集增强
想一哈,我们使用的是lfw_5590数据集,每张图片中人脸数有限,这样做出来的数据集太小,因此我们需要对数据进行增强。
#对与每一种
  1. IOU
    在这里插入图片描述
    就是这么计算,很简单,就不解释了!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值