【图像识别】人脸识别原理及CNN讲解

一、 基本原理

人脸检测解决核心问题:

  • 人脸存在任何一个位置
  • 人脸有不同大小
  • 人脸有不同视角、姿态
  • 人脸有遮挡
  1. 由于人脸可能出现在图像的任何位置,在检测图像的时候需要用固定大小的窗口框从上到下、从左到右地进行扫描,判断窗口内是否为人脸(滑动窗口技术)。
  2. 为了检测到大小不同的脸,需要对图像进行反复放大、缩小构造图像金字塔,对每张缩放后的图像都采用滑动窗口技术进行扫描。
    在这里插入图片描述
  3. 由于一张人脸可能会检测出多个框,需将检测结果合并去重(非极大值抑制(NMS))
    在这里插入图片描述
    • 非极大值抑制(NMS):抑制不是最大值的元素
    如此定位一辆汽车,假设有6个矩阵框,根据分类器的类别分类概率做排序,假设属于车辆的概率从小到大排序为:A、B、C、D、E、F
    (1) 从最大概率矩形框F开始,分别判断A~ E与F的重叠度IOU是否大于某个设定的阈值(常用阈值:0.3~0.5)
    (2) 假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
    (3) 从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
    就这样一直重复,找到所有被保留下来的矩形框。

二、 算法

人脸检测算法分为3个阶段:早期、中期(viola-jonesVJ框架(加入级联
AdaBoost分类器)、DMP模型)、深度学习时代(cnn算法)

  1. 早期:模板匹配技术,即用一个人脸模板与被检测图像中各个位置进行匹配。
    · 成就:Rowley等人利用神经网络训练出对人脸-非人脸的多层感知器;也利用两个神经网络解决多角度人脸问题,第一个神经网络估计人脸角度并旋转,第二个则进行判断人脸-非人脸。但采用密集滑动窗口进行采样并且分类器的设计相对复杂,导致速度太慢。

  2. 中期:voila-jonesVJ框架(加入级联AdaBoost分类器(boost算法的改进):基于PAC学习理论建立的集成学习算法,其根本思想为通过多个简单的弱分类器,构建出准确率高的强分类器。)
    ·成就:Viola和Jones用简单的Haar-like特征和级联AdaBoost分类器构造出一个检测器(VJ框架),速度和精度有所提高。

级联AdaBoost分类器:用多个AdaBoost分类器完成候选框的分类(其 中这些分类器组成流水线,级级对滑动窗口中的候选框进行判定人脸-非人脸)。
在这些分类器中,前面的强分类器设计简单,包含较少弱分类器,主要快速排掉大量非人脸窗口,(但也可能把非人脸判定为人脸,对此会在强分类器增加一个调节阈值)然后通过逐级分类器判定。

  • 阈值:它通过训练得到。根据当前强分类器计算正样本置信度,根据传入参数minhitrate来取得强分类器阈值;用下一强分类器与上步计算得到的阈值,分类负样本,如果分类的最大检率小于maxfalsealarm,跳出循环。

改进:VJ框架中采用的离散型的AdaBoost,还有实数型、Logit型和Gentle型AdaBoost算法能输出分类标签值、更高置信度、精度。
 
 
Haar-like特征(另:特征提取除Haar特征外,还有HOG特征、LBP特征。):源于小波分析中的Haar小波变换,Haar小波是最简单的小波函数。用于对信号进行均值、细节分解。其定义为图像中相邻矩阵区域像素之和的差值,如下Haar-like特征值为
左白像素和 减 右黑像素和。为达到快速计算,使用积分图的计算机制。
在这里插入图片描述
通过AdaBoost算法自动筛选出来的对区分人脸-非人脸有用的Haar-like特征
在这里插入图片描述
缺点:Haar-like相对简单特征,稳定性低

· DMP框架:基于组件的检测算法,采用FHOG特征(在HOG的基础上去掉了block)对扭曲、性别、多姿态、多角度等人脸有非常好的检测效果
缺点:速度慢,工程中很少用。

  1. 深度学习时代: CNN算法:采用卷积网络作为每一级的分类器。
  • 用CNN卷积神经网络识别图片,一般需要的步骤有:
    1、卷积层初步提取特征
    2、池化层提取主要特征
    3、全连接层将各部分特征汇总
    4、产生分类器,进行预测识别

  • 工作原理:
    1、卷积层作用:提取图片每个小部分具有的特征
    假如有一个尺寸为6x6的图像,每个像素点都存储着图像的信息。我们定义一个卷积核(权重),再从图像提取一定特征(数字矩阵)。数字矩阵与卷积核对应位相乘再相加,得到卷积层输出结果。
    在这里插入图片描述
           (转自:http://blog.csdn.net/zzZ_CMing)
    (429 = 18x1+54x0+51x1+55x0+121x1+75x0+35x1+24x0+204x1)
    卷积核的取值:在没有以往学习的经验下,可由函数随机生成,再逐步训练调整。
    当所有的像素点都至少被覆盖一次后,就可以产生一个卷积层的输出(下图的步长为1)
    在这里插入图片描述
    根据该图片的特征(数字矩阵)与不同卷积核产生的卷积层输出值,进行相互比较判断哪一卷积核最能体现该图片的特征。卷积层输出值越高,说明匹配度越高,越能表现该图片的特征。

Eg:我们先设计一个卷积核
在这里插入图片描述
对于一只老鼠
在这里插入图片描述
我们分别用该卷积核来识别老鼠的尾部和耳朵:
尾部输出值:6000
在这里插入图片描述
耳朵输出值:0
在这里插入图片描述
我们就可以认为:现有的这个卷积核保存着曲线的特征,匹配识别出来了老鼠的屁股是曲线的。我们则还需要其他特征的卷积核,来匹配识别出来老鼠的其他部分。

卷积层的作用其实就是通过不断的改变卷积核,来确定能初步表征图片特征的有用的卷积核是哪些,再得到与相应的卷积核相乘后的输出矩阵

2、池化层作用:减少训练参数数量,降低卷积层输出的特征向量维度;减少过拟合现象,只保留最有用图片信息,减少噪声传递。
· 分为最大池化、均值池化

举例说明两种池化方式:(池化步长为2,选取过的区域,下一次就不再选取)
在这里插入图片描述

3、全连接层作用:卷积层和池化层的工作就是提取特征,并减少原始图像带来的参数。然而,为了生成最终的输出,我们需要应用全连接层来生成一个等于我们需要的类的数量(如人脸识别中有5个人,则需等于5个类别数量)的分类器。
全连接层的工作原理:把池化层输出的张量重新切割成一些向量,乘上权重矩阵,加上偏置值,然后对其使用ReLU激活函数,用梯度下降法优化参数既可。

基本步骤:给定一张测试图像。12-net密集扫描整张图像(滑动窗口技术),快速剔除超过90%的检测窗口,剩下窗口传输给12-calibration-net以图像调整尺寸(调整为1212)和位置来接近潜在人脸区域,用NMS去除高度重叠窗口;剩下窗口被重新调整尺寸(调整为2424)传输给24-net、24-calibration-net做同上操作,用NMS去除高度重叠窗口;最后剩下窗口被重新调整尺寸(调整为48*48)传输给48-net并评估这些窗口,用NMS(阈值大于之前)去除高度重叠窗口,剩下窗口用48-calibration-net矫正,作为结果输出
 
CNN结构:3个人脸-非人脸的二分类CNNs,3个边框调整的CNNs(多分类的离散位移模式),使用ReLU在 上采样层和全连接层之后。
在这里插入图片描述
在这里插入图片描述
细分:
· 12-net:首先使用12-net密集扫描W x H图像,步长为4像素,12x12检测窗口。相当于12-net去获得一个增幅图像的置信分(共有([(W-12)/4]+1)x([(W-12)/4]+1)个12x12的框,这些框组成一个置信分,其中每个点对应一个框的评估值)。如实际中获得(用分类器获取得到的,即传入的???)最小人脸尺寸为F,测试图像首先被建成图像金字塔,每级比例为12/F,作为12-net的输入
· 12-calibration-net:通过N(45)个矫正模式(预先设定好的,是3维变量变化的无序向量5x3x3,如下图)进行边框矫正。即输出一个置信分的向量(采用高置信分模式的均值矫正)
在这里插入图片描述
· 24-net:进一步减少检测窗口数量,不同的是24-net采用多分辨率结构(分别为12x12、24x24);全连接层串联12-net的全连接层(128 outputs),带有多分辨率结构,12-net补充了24-net,可帮助检测小脸如下图
在这里插入图片描述
· 24-calibration-net:与12-calibration-net相比,除尺寸不同,都相同
· 48-net:与24-net同样采用多分辨率
· 48-calibration-net:与12-calibration-net相比,只采用一个下采样层,提高矫正精度
· NMS的应用:12-net、24-net无足够区分性,假阳性挑战很大,12-calibration-net、24-calibration-net因为更高的置信分,假阳性挑战更大???因此在…-cal…-…加了NMS避免相同尺寸检测窗口召回率降低。48-net中NMS应用到了不同比例窗口上,为了获得最精确检测位置、图像比例,避免冗余估计。

Faceness-Net算法:
MTCNN算法:
Face R-CNN算法:
SHH算法:
PyramidBox算法:


未完,持续更新…


  • 11
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值