当前位置:   article > 正文

mtcnn人脸检测_人脸检测之MTCNN 你想知道的都在这儿!

检测并定位图片中的人脸,返回高精度的人脸框坐标

7e91fb43ed4aaea7c5da55d1278123ed.png

0569621b4ca68f2f490295fed920fb5c.png 导读: 随着电子商务等应用的发展,人脸识别成为最有潜力的生物身份验证手段。其中人脸检测是自动人脸识别系统的重要环节,主要用于检测并定位图片中的人脸,返回高精度的人脸框坐标及人脸特征点坐标。目前人脸检测 / 识别的应用场景逐渐从室内演变到室外,从单一限定场景发展到广场、车站、地铁口等场景,人脸检测 / 识别面临的要求也越来越高。MTCNN 针对人脸检测这一专门任务,在速度和精度方面取得了巨大的成功,在工业界的应用也非常广泛,本文将为您详细介绍人脸检测的深度学习模型 - MTCNN。 0569621b4ca68f2f490295fed920fb5c.png

2563d45c6fa002f70820e12a9ca6d856.gif

MTCNN 全称为“Multi-task Cascaded Convolutional Networks”,是多任务级联 CNN 的人脸检测深度学习模型,用于人脸边框回归和面部关键点检测。它由三个CNN子模型构成 - PNet, RNet 和 ONet。其推理原理如下:

7ee35eba4f55ed79737463ccf1768c66.png

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模型输出值。

2b22b313e4e5ddeb2e48058090358771.png

Code

了解了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 是模型缩放的最小尺寸。这个尺寸越小,模型能够检测到的更小的人脸,但同时模型的计算时

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/914352
推荐阅读
相关标签
  

闽ICP备14008679号