一、摘要
最近,想要做一个口罩识别的项目。主要用到mtcnn人脸检测算法和MobileNet算法。因此向这两种算法发起进攻。
二、Mtcnn
1、简介
Mtcnn,英文全称是Multi-task convolutional neural network,中文全称是多任务卷积神经网络。该神经网络的任务就是人脸检测和人脸关键点定位。相比与其他人脸检测,他的优势是训练成本低,速度快且训练效果好。非常适用于工业上。它总体可分为P-Net、R-Net、和O-Net三层网络结构。
2、论文
(1)构建图像金字塔
因为每张人脸图片中的人脸大小都不一样,所以为了更好的适应不同大小的人脸检测,先将图片以缩放系数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进行初步特征提取与标定边框。