赞
踩
MTCNN 全称为“Multi-task Cascaded Convolutional Networks”,是多任务级联 CNN 的人脸检测深度学习模型,用于人脸边框回归和面部关键点检测。它由三个CNN子模型构成 - PNet, RNet 和 ONet。其推理原理如下:
PNet (proposal network): Pnet 的主要目的是用来生成候选窗和边框回归向量。首先照片会按照不同的缩放比例,缩放成不同大小的图片,形成图片的特征金字塔。不同缩放比例的图片输入PNet,所生成的候选框通过边框回归向量来校正,然后使用非极大值抑制(NMS)合并重叠的候选框。
RNet (refine network): 由PNet生成的候选框将输入到RNet中,RNet将过滤掉大部分非人脸的候选框,并继续通过边框回归向量校正和NMS合并。
ONet (output network): ONet与RNet类似,利用 NMS 去除重叠窗体后将输出最终的人脸框,并生成人脸特征点位置。
整个模型框架如下图所示。值得留意的是PNet为全卷积网络,可以接受任何尺寸的图片。这里的模型框架显示的只是在做模型训练的时候需要输入12x12大小的图像。在某种意义上来说,PNet类似与一个12x12大小的窗口以stride 2在输入图片上滑动。PNet输出为两个特征图:第一个是人脸非人脸的分类,大小为 grid_size x grid_size x 2。 第二个是边框回归向量,大小为grid_size x grid_size x 4。在特征图上每个cell的坐标位置(index) 将被转换为输入图片的边框位置,并通过边框回归向量校正。RNet 和 ONet 都有全连接层,因此只接受24x24和48x48固定大小图片。
PNet 和 RNet 仅仅预测人脸非人脸的分类以及边框回归向量校正,只有ONet会生成人脸特征点位置。模型输出的边框回归向量以及人脸特征点位置的值都为0到1,类似于真实坐标做了归一化处理。例如如果候选框的坐标为(x1, y1, x2, y2),长宽w = x2 - x1, h = y2 - y1。模型输出的边框回归向量为(tx1, ty1, tx2, ty2)。 那么校正的坐标将为(x1+tw1*w, y1+ty1*h, x2+tx2*w, y2+ty2*h)。而人脸特征点位置为 (x1+w*x_landmarks, y1+h*y_landmarks), 其中x_landmarks和y_landmarks是onet模型输出值。
了解了MTCNN原理之后,让我们进入代码详解!所有的代码都可以在我的github 上找到: https://github.com/AIrocker/MTCNN_Tutorial
01导入库和模型from PIL import Imageimport torchfrom MTCNN_nets import PNet, RNet, ONetimport math import numpy as npfrom utils.util import*import cv2device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
在这里MTCNN的网络架构是用Pytorch实现的,具体代码请参见我的github - "MTCNN.py" 。由于篇幅关系,我们直接导入模型和测试图片如下:
pnet = PNet().to(device)rnet = RNet().to(device)onet = ONet().to(device)pnet.load_state_dict(torch.load('weights/pnet_Weights'))rnet.load_state_dict(torch.load('weights/rnet_Weights'))onet.load_state_dict(torch.load('weights/onet_Weights'))pnet.eval()rnet.eval()onet.eval()image = Image.open('images/s_l.jpg')
02参数&函数设定
1. min_face_size 是模型缩放的最小尺寸。这个尺寸越小,模型能够检测到的更小的人脸,但同时模型的计算时
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。