人脸检测——Keras搭建mtcnn人脸检测

一、摘要

最近,想要做一个口罩识别的项目。主要用到mtcnn人脸检测算法和MobileNet算法。因此向这两种算法发起进攻。

                                                                     人脸检测——Keras搭建mtcnn人脸检测_第1张图片

二、Mtcnn

1、简介

Mtcnn,英文全称是Multi-task convolutional neural network,中文全称是多任务卷积神经网络。该神经网络的任务就是人脸检测和人脸关键点定位。相比与其他人脸检测,他的优势是训练成本低,速度快且训练效果好。非常适用于工业上。它总体可分为P-Net、R-Net、和O-Net三层网络结构。

                                     人脸检测——Keras搭建mtcnn人脸检测_第2张图片

2、论文

(1)构建图像金字塔

                                   人脸检测——Keras搭建mtcnn人脸检测_第3张图片

因为每张人脸图片中的人脸大小都不一样,所以为了更好的适应不同大小的人脸检测,先将图片以缩放系数factor对图片进行缩放,每次缩小为原来的factor大小,将所有的图片构成一个向量。因为不同大小的图片堆叠起来就像一个金字塔。所以在计算机视觉中称为图像金字塔。(这是一个常用的图像处理技巧,很多图像检测算法前期都会做这么一个工作。)原文作者将factor系数设位为0.709。(为什么要用0.709,而不用黄金比例0.618。我也不知道,希望知道的大牛可以告知下。)

实现代码如下,当一个图片输入的时候,会缩放为不同大小的图片,但是缩小后的长宽最小不可以小于12:

#-----------------------------#
#   计算原始输入图像
#   每一次缩放的比例
#-----------------------------#
def calculateScales(img):
    copy_img = img.copy()
    pr_scale = 1.0
    h,w,_ = copy_img.shape
    if min(w,h)>500:
        pr_scale = 500.0/min(h,w)
        w = int(w*pr_scale)
        h = int(h*pr_scale)
    elif max(w,h)<500:
        pr_scale = 500.0/max(h,w)
        w = int(w*pr_scale)
        h = int(h*pr_scale)

    scales = []
    factor = 0.709    #factor系数
    factor_count = 0
    minl = min(h,w)
    while minl >= 12:
        scales.append(pr_scale*pow(factor, factor_count))
        minl *= factor
        factor_count += 1
    return scales

(2)、Pnet网络层

Pnet的全称为Proposal Network,其基本的构造是一个全卷积网络。对上一步构建完成的图像金字塔,通过一个FCN进行初步特征提取与标定边框。

你可能感兴趣的:(人脸检测——Keras搭建mtcnn人脸检测)