最近小编给大家分享了一篇简单易懂的mtcnn的pycaffe实现,有热心网友私信小编,从特征图(featureMap)中的每一个像素点是如何映射到原图的。要知道特征图到原图的映射关系,首先要搞懂 特征图是如何生成的。假定待检测图像如下图所示:
待检测图像的尺寸为 460 * 460,我们知道mtcnn Pnet的网络结构为:
我们可以逐层打印caffe中每层Blob的尺寸
逐层打印Blob尺寸的代码为:
for k,v in PNet.blobs.items(): print (k, v.data.shape)
打印结果如下所示:
data (1, 3, 460, 460) conv1 (1, 10, 458, 458) pool1 (1, 10, 229, 229) conv2 (1, 16, 227, 227) conv3 (1, 32, 225, 225) conv3_PReLU3_0_split_0 (1, 32, 225, 225) conv3_PReLU3_0_split_1 (1, 32, 225, 225) conv4-1 (1, 2, 225, 225) conv4-2 (1, 4, 225, 225) prob1 (1, 2, 225, 225)
这里我们忽略 con4v-2这一人脸关键点检测这一层
可以看到conv4-1 -->prob1这一层是人脸检测的输出层prob1是conv4-1 经过softmax的结果,softmax不改变输入数据的尺寸.经过softmax后得到的prob1层,即为 特征图(featureMap),featureMap的尺寸为 (1,2,255,255) 表示 通道数为 2,高和宽为 255.
也可以理解为获得了两张 "特征图",高和宽为 255,编号为1的特征图为 是人脸的概率,编号为0的特征图为 是背景的概率.这也是为啥ncnn版本的mtcnn需要获取 第二个通道数据的原因了。下图为ncnn版的mtcnn检测算法
"特征图(即卷积的输出)上的每一点表示原图上 12 X 12 大小图像为人脸的概率"
事实上 FCN(全卷积神经网络)就是对像素进行分类。
前面讲了好多铺垫的内容,那么到底如何根据特征图上的像素点 映射到 原图进行人脸检测呢?
- 先确定从原图到特征图的缩放倍数,以pnet为例,原图大小为 460 * 460 ,特征图为 255 * 255,则从 特征图映射回原图需要乘以2,
2.假设 特征图上某一点 为A(x,y) = p, 其中 x,y为图像的横坐标和纵坐标, p为该点的值(是否为人脸的概率),则 人脸框的 左上角的坐标为 (x * stride, y*stride),stride为缩放的倍数,人脸框的 右下角的坐标为 (x * stride + 12, y*stride + 12), 12为Pnet训练图像的大小。如果待 检测图做了图像金字塔缩放的话,需要除以缩放倍数。
本文暂时没有评论,来添加一个吧(●'◡'●)