PNet,RNet.Onet输出的都是BoundingBox的集合,每个BoundingBox包括当前左上角与右下角坐标,坐标的预测偏移量(比例),是否人脸的二分类置信度,5个landmarks的10个坐标。
BoundingBox的定义
PNet
1. 每输入一张图像,会以一个设定的放缩因子p,以{1,p,p^2,p^3,p^4...}的比例逐渐缩小,生成一个图像金字塔,最后得到的最小的图像最短边要恰大于等于12,原图尺寸越大当然金字塔层数也就越多
2. PNet是一个全卷积网络,在最后一层有两个分支,分别输出两个特征谱。
1) 特征谱1用于前后景分类,是一个(1,2,w,h)的blob,w和h的与输入图像有关,越大的图像当然w和h就越大,金字塔顶的图像是12*12,那么最后的输出特征谱恰为(1,2,1,1)。特征谱的两个通道分别对应每个特征点区域对应的感受野不是人脸和是人脸的概率
2)特征谱2用于边界框回归,是一个(1,4,w,h)的blob,w和h与特征谱1一致。4个通道的值代表每个特征点对应感受野区域的左上角右下角坐标相对人脸所在位置的偏移量
3. 利用输出的两个特征谱生成一些列可能的proposal人脸框:
1)特征谱的每个location点对应感受野即为最原始的proposal,越大的输入图像每个点的感受野反而越小,所以金字塔塔底的大尺寸输入用于检测小人脸,塔顶的小尺寸输入用于检测大人脸。
2)通过一个置信度阈值筛去低于阈值的原始proposal,通过筛选的每个location生成一个BoundingBox对象(坐标成员来自感受野的计算,偏移成员和置信度成员来自网络输出特征谱),将所有BoundingBox对象放到totalBox向量中
4. 通过非极大值抑制过滤重叠的预测人脸框
图像金字塔每张图像前传完生成边界框后都进行一次同尺寸人脸框的NMS,整个金字塔都前传完后再对所有人脸框进行一次各个尺度的总体的NMS
思考:为什么在前传过程中约88%时间都花在第一步?
PNet的输入是图像金字塔,每张尺寸的图片输入前都要根据输入对网络将进行Reshape,所以必需跑多次前传(480*480的原始图像用0.6的缩放因子需要前传8次)。而RNet和ONet的输入尺寸固定在24*24和48*48,虽然输入图像很多,但是可以放在一起成批输入,均只用跑一次前传。
RNet
1. 将第一步得到的所有proposal从原图中抠出来,全部resize到24*24的尺寸,逐通道放入一个vector中,全部送入Rnet中前传
2. RNet不是全卷积网络,最后一层是两个全连接层分支,一个输出二维人脸概率预测向量,是对proposal的再次筛选,另一个输出4维offset预测向量,是对输入人脸框坐标的再次调整
ONet
1. 输入是经过第二步筛选和refine过的人脸框,同样从原图抠出后统一resize到48*48,成批输入ONet
2. ONet和RNet的结构类似,只是最后有3个全连接层分支,分别输出4维、2维、10维向量,前两者对人脸框再次筛选与调整,第3个为检测出的每个人脸框的5个landmarks的10个坐标
3. 最后的输出:BoundingBox的集合