人脸检测与美颜技术介绍(OpenCV)

人脸检测与美颜技术介绍

目录

  • 人脸检测与美颜技术介绍
    • 人工智能(AI)
    • 人工智能、机器学习与深度学习的关系
    • 机器学习与深度学习的区别
    • 深度学习简介
    • 深度学习模型
    • 深度学习的历史
    • 深度学习的工具
    • 神经网络的几个概念
  • OpenCV
    • OpenCV与其它视觉函数库性能对比
    • OpenCV应用领域
    • OpenCV Windows版本
    • OpenCV MAC版本
    • OpenCV Android版本
    • OpenCV模块
    • Core-核心功能模块
    • Imgproc-图像处理模块
    • features2D-2D功能模块
    • Highgui-高层gui图形用户界面(high GUI)
    • Ml-机器学习模块(Machine Learning)
    • Stitching-图像拼接模块(images stitching)
    • DNN-深度学习模块
      • Tiny-dnn模块:支持深度学习框架
      • OpenCV中DNN模块已经支持与测试过这些常见的网络模块
      • DNN运用
    • 其它模块
    • OpenCV主要结构
      • 神经网络-Net类:
      • cv::Rect
    • OpenCV主要结构—Mat
      • Mat类用来保存矩阵类型的数据信息,包括向量、矩阵、灰度或彩色图像等数据。Mat类分为矩阵头和指向存储数据的矩阵指针两部分。矩阵头中包含矩阵的尺寸、存储方法、地址和引用次数等。矩阵头的大小是一个常数,不会随着矩阵尺寸大小而改变。
        • flags:int类型,共32位。
        • dims:矩阵的维数。
        • channels:图像的通道数。
        • cols,rows:图像的列数,行数。
        • data:指向数据单元的指针。
        • refcount:记录了这个矩阵的数据被其他变量引用了多少次。
    • OpenCV应用:人脸检测
    • 人脸检测历史
      • 人脸检测也可分为两个时期:一个是深度学习之前的时期,在深度学习之前,人们做人脸检测,主要使用人工设计好的特征,根据人工特征来训练检测器检测人脸。
      • 另一个是深度学习时期。当深度学习在计算机视觉领域占据绝对主导地位之后,人们开始尝试用深度神经网络来做人脸检测。
    • 深度学习的人脸检测算法比较
    • OpenCV基于DNN+caffe的人脸检测
      • 使用caffe框架的resnetface做人脸检测。
      • 模型文件res10_300x300_ssd_iter_140000.caffemodel,模型定义deploy.prototxt.txt。
      • 主要步骤如下:
    • blobFormImage
    • setInput
    • forword
    • rectangle
    • OpenCV应用:“美颜”
    • 磨皮效果
    • 美白效果
    • OpenCV实现“美颜”
      • 皮肤检测:
      • 双边滤波:cv::bilateralFilter()。
      • 亮度增强:
    • 人脸识别
    • 人脸识别算法演化史
    • 人脸识别工作原理
    • 人脸识别算法
      • 人脸识别算法主要包含三个模块:
    • 什么是caffe?
      • Caffe,全称Convolutional Architecture for Fast Feature Embedding,中文名:卷积神经网络框架。
      • 基本概念:
    • 如何训练caffe模型
    • solver.prototxt
      • sovler的主要作用就是交替调用前向传导和反向传导 (forward & backward) 来更新神经网络的连接权值,从而达到最小化loss,实际上就是迭代优化算法中的参数。
      • Solver.prototxt流程:
    • 训练用残差网络:ResNet-50-train-val.prototxt
    • 残差网络:ResNet-50.prototxt
    • ResNet 152:ILSVRC 竞赛2015年冠军网络
  • END

人工智能(AI)

  • 人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。
  • 人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。
  • 人工智能是研究使计算机来模拟人的某些思维过程和智能行为(如学习、推理、思考、规划等)的学科,主要包括计算机实现智能的原理、制造类似于人脑智能的计算机,使计算机能实现更高层次的应用。人工智能将涉及到计算机科学、心理学、哲学和语言学等学科。可以说几乎是自然科学和社会科学的所有学科,其范围已远远超出了计算机科学的范畴,人工智能与思维科学的关系是实践和理论的关系,人工智能是处于思维科学的技术应用层次,是它的一个应用分支。
  • 人工智能在计算机上实现时有2种不同的方式。一种是采用传统的编程技术,使系统呈现智能的效果,而不考虑所用方法是否与人或动物机体所用的方法相同。这种方法叫工程学方法(ENGINEERING APPROACH),它已在一些领域内作出了成果,如文字识别、电脑下棋等。另一种是模拟法(MODELING APPROACH),它不仅要看效果,还要求实现方法也和人类或生物机体所用的方法相同或相类似。遗传算法(GENERIC ALGORITHM,简称GA)和人工神经网络(ARTIFICIAL NEURAL NETWORK,简称ANN)均属后一类型。

人工智能、机器学习与深度学习的关系

人脸检测与美颜技术介绍(OpenCV)_第1张图片

机器学习与深度学习的区别

  • 机器学习(Machine Learning,ML)是人工智能的子领域,也是人工智能的核心。它囊括了几乎所有对世界影响最大的方法(包括深度学习)。机器学习理论主要是设计和分析一些让计算机可以自动学习的算法。
  • 深度学习(Deep Learning,DL)属于机器学习的子类。它的灵感来源于人类大脑的工作方式,是利用深度神经网络来解决特征表达的一种学习过程。深度神经网络本身并非是一个全新的概念,可理解为包含多个隐含层的神经网络结构。为了提高深层神经网络的训练效果,人们对神经元的连接方法以及激活函数等方面做出了调整。其目的在于建立、模拟人脑进行分析学习的神经网络,模仿人脑的机制来解释数据,如文本、图像、声音。
  • 机器学习在指纹识别、特征物体检测等领域的应用基本达到了商业化的要求。
  • 深度学习主要应用于文字识别、人脸技术、语义分析、智能监控等领域。目前在智能硬件、教育、医疗等行业也在快速布局。
  • 机器学习能够适应各种数据量,特别是数据量较小的场景。如果数据量迅速增加,那么深度学习的效果将更加突出,这是因为深度学习算法需要大量数据才能完美理解。
  • 深度学习算法需要大量时间进行训练。这是因为该算法包含有很多参数,因此训练它们需要比平时更长的时间。相对而言,机器学习算法的执行时间更少。
  • 机器学习算法遵循标准程序以解决问题。它将问题拆分成数个部分,对其进行分别解决,而后再将结果结合起来以获得所需的答案。深度学习则以集中方式解决问题,而不必进行问题拆分。人脸检测与美颜技术介绍(OpenCV)_第2张图片

深度学习简介

  • 深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向。
  • 最初的目标——人工智能(AI, Artificial Intelligence)。
  • 学习样本数据的内在规律和表示层次,最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。
  • 深度学习是一类模式分析方法的统称,就具体研究内容而言,主要涉及三类方法:
  1. 基于卷积运算的神经网络系统,即卷积神经网络(CNN)。
  2. 基于多层神经元的自编码神经网络。
  3. 以多层自编码神经网络的方式进行预训练,进而结合鉴别信息进一步优化神经网络权值的深度置信网络(DBN)。

深度学习模型

人脸检测与美颜技术介绍(OpenCV)_第3张图片

深度学习的历史

  • 第一代神经网络:起源于1943年的MCP人工神经元模型。
  • 第二代神经网络:现代DL大牛Hinton在1986年发明了适用于多层感知器(MLP)的BP算法,并采用Sigmoid进行非线性映射,有效解决了非线性分类和学习的问题。
  • 第三代神经网络:2006年,DL元年。是年,Hinton提出了深层网络训练中梯度消失问题的解决方案:无监督预训练对权值进行初始化+有监督训练微调。2013,2014,2015年,通过ImageNet图像识别比赛,DL的网络结构,训练方法,GPU硬件的不断进步,促使神经网络发展爆发期的到来。
    人脸检测与美颜技术介绍(OpenCV)_第4张图片

深度学习的工具

  • TensorFlow:Google基于DistBelief研发的第二代人工智能学习系统。
  • Caffe:清晰而高效的深度学习框架,作者是毕业于UC Berkeley的贾扬清。开源,核心语言是C++,支持命令行、Python和MATLAB接口。
  • Torch:是一个广泛支持机器学习算法的科学计算框架,具有简单和快速的脚本语言LuaJIT和底层C/CUDA实现。
  • Keras:Keras是一个简约的、高度模块化的神经网络库,Python语言编写,支持GPU和CPU。
  • MXNet:轻量化分布式可移植的深度学习计算平台,使用C++实现,并提供C风格的头文件。支持Python、R、Julia、Go和JavaScript
  • CNTK:微软用于搭建深度神经网络的计算网络工具包。
  • Theano:Theano是BSD许可证下发布的一个开源项目,是由LISA(现MILA)在加拿大魁北克的蒙特利尔大学,开发的基于Python的深度学习框架。

神经网络的几个概念

  • ANN- Artificial Neural Networks,人工神经网络。人工神经网络是由大量处理单元互联组成的非线性、自适应信息处理系统。
  • FNN- Full Connected Neural Networks,全连接神经网络。神经网络的层与层之间是全连接的,也就是说,第i层的任意一个神经元一定与第i+1层的任意一个神经元相连。
  • DNN- Deep Neural Networks,深度神经网络。是深度学习的基础。有两个以上隐含层的网络就可被称为深度神经网络。 DNN内部的神经网络层可以分为三类,输入层,隐藏层和输出层,如下图示例,一般来说第一层是输出层,最后一层是输出层,而中间的层数都是隐藏层。DNN是全连接的。
  • CNN- Convolutional Neural Networks,卷积神经网络。是一类包含卷积计算且具有深度结构的前向神经网络(Feedforward Neural Networks),是深度学习的代表算法之一。由于卷积神经网络能够进行平移不变分类,也被称为“平移不变人工神经网络“。CNN是通过卷积核将上下层进行链接,同一个卷积核在所有图像中是共享的,图像通过卷积操作后仍然保留原先的位置关系。
  • RNN- Recurrent Neural Network,循环神经网络。 DNN无法对时间序列上的变化进行建模。然而,样本出现的时间顺序对于自然语言处理、语音识别、手写体识别等应用非常重要。为了适应这种需求,就出现了大家所说的另一种神经网络结构——循环神经网络RNN。循环神经网络特别用于顺序数据,其中先前的输出用于预测下一个输出。在这种情况下,网络中有循环。在普通的全连接网络或CNN中,每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立,因此又被成为前向神经网络(Feed-forward Neural Networks)。而在RNN中,神经元的输出可以在下一个时间段直接作用到自身,即第i层神经元在m时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(m-1)时刻的输出。

OpenCV

  • OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,用于图像处理、分析、机器视觉方面。
  • 可以运行在Linux、Windows、Android和Mac OS操作系统上。
  • 轻量级而且高效——由一系列 C 函数和少量 C++ 类构成。
  • 提供了C,C++,Python、Ruby,Java、MATLAB等语言的接口。
  • 实现了图像处理和计算机视觉方面的很多通用算法。
  1. 图像处理(Image Processing)是用计算机对图像进行分析,以达到所需结果的技术。图像处理技术一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。数字图像处理(Digital Image Processing)是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。
  2. 计算机视觉(Computer Vision)是指用摄像机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使之成为更适合人眼观察或仪器检测图像的一门学科。
  • OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升。
  • 使用类BSDlicense,所以对非商业应用和商业应用都是免费的。

OpenCV与其它视觉函数库性能对比

人脸检测与美颜技术介绍(OpenCV)_第5张图片

OpenCV应用领域

  • 人机互动
  • 物体识别
  • 图像分割
  • 人脸识别
  • 动作识别
  • 运动跟踪
  • 机器人
  • 运动分析
  • 机器视觉
  • 结构分析
  • 汽车安全驾驶

OpenCV Windows版本

  • 如果使用Python,可以直接下载安装编译好的OpenCV。
  • 也可以从GitHub下载源代码自己编译,https://github.com/opencv,下载opencv和opencv_contrib。
  • CMake编译(选择VS版本,动态或静态库,编译为多个库或一个库等),生成opencv库。
  • 应用:添加头文件,添加库文件。
  • OpenCV应用。

OpenCV MAC版本

  • 从GitHub下载源代码(opencv + opencv_contrib)。
  • CMake编译,生成opencv库。
  • 应用:添加头文件,添加库文件。
  • OpenCV应用。

OpenCV Android版本

  • 下载Android版本Opencv sdk。
  • 或者使用OpenCV源码交叉编译Android库。
  • Sdk中包含不用硬件版本的动态库,静态库,java接口以及头文件等。
  • 选择硬件版本(arm64-v8a/armeabi-v7a/x86/x86_64)。
  • 导入头文件,导入对应版本的库文件。
  • OpenCV应用。

OpenCV模块

人脸检测与美颜技术介绍(OpenCV)_第6张图片
人脸检测与美颜技术介绍(OpenCV)_第7张图片

Core-核心功能模块

  • OpenCV基本数据结构
  • 动态数据结构
  • 绘图函数
  • 数组操作相关函数
  • 辅助功能与系统函数和宏
  • 与OpenGL的互操作

Imgproc-图像处理模块

  • 线性和非线性的图像滤波
  • 图像的几何变换
  • 其它(Miscellaneous)图像转换
  • 直方图相关
  • 结构分析和形状描述
  • 运动分析和对象跟踪
  • 特征检测
  • 目标检测等内容

features2D-2D功能模块

  • 特征检测和描述
  • 特征检测器(Feature Detectors)
  • 通用接口描述符提取器(Descriptor Extractors)
  • 通用接口描述符匹配器(Descriptor Matchers)
  • 通用接口通用描述符(Generic Descriptor)
  • 匹配器通用接口关键点绘制函数和匹配功能绘制函数

Highgui-高层gui图形用户界面(high GUI)

  • 媒体的I / O输入输出
  • 视频捕捉
  • 图像和视频的编码解码
  • 图形交互界面的接口等内容
  • 关键点绘制函数和匹配功能绘制函数
  • 关键点绘制函数和匹配功能绘制函数

Ml-机器学习模块(Machine Learning)

  • 统计模型 (Statistical Models)
  • 一般贝叶斯分类器 (Normal Bayes Classifier)
  • K-近邻 (K-NearestNeighbors)
  • 支持向量机 (Support Vector Machines)
  • 决策树 (Decision Trees)
  • 提升(Boosting)
  • 梯度提高树(Gradient Boosted Trees)
  • 随机树 (Random Trees)
  • 超随机树 (Extremely randomized trees)
  • 期望最大化 (Expectation Maximization)
  • 神经网络 (Neural Networks)
  • MLData

Stitching-图像拼接模块(images stitching)

  • 拼接流水线
  • 特点寻找和匹配图像
  • 估计旋转
  • 自动校准
  • 图片歪斜
  • 接缝估测
  • 曝光补偿
  • 图片混合

DNN-深度学习模块

Tiny-dnn模块:支持深度学习框架

  • Caffe
  • TensorFlow
  • Torch/PyTorch

OpenCV中DNN模块已经支持与测试过这些常见的网络模块

  • AlexNet
  • GoogLeNet v1 (also referred to as Inception-5h)
  • ResNet-34/50/…
  • SqueezeNet v1.1
  • VGG-based FCN (semantical segmentation network)
  • ENet (lightweight semantical segmentation network)
  • VGG-based SSD (object detection network)
  • MobileNet-based SSD (light-weight object detection network)

DNN运用

  • 图像分类
  • 对象检测
  • 实时对象检测
  • 图像分割
  • 预测
  • 视频对象跟踪

其它模块

  • Photo-也就是Computational Photography,包含图像修复和图像去噪两部分
  • Flann-Fast Library for Approximate Nearest Neighbors,高维的近似近邻快速搜索算法库

OpenCV主要结构

神经网络-Net类:

  • 这个类中定义了创建和操作网络的方法;所谓神经网络其实是一个有向无环图(DAG),图的顶点是层的实例,边表示输入输出关系。每一个层,在网络中都有唯一的整数ID和字符串名称作为标识;同时,这个类支持副本的引用计数,也就是说副本指向同一个实例。

cv::Rect

  • Opencv Rect_模板类是一个比较重要的类,可以设置图像ROI区域,截取图像等。
  • Rect_类的成员变量有x,y,width,height,分别为左上角座标和矩形宽高。

OpenCV主要结构—Mat

Mat类用来保存矩阵类型的数据信息,包括向量、矩阵、灰度或彩色图像等数据。Mat类分为矩阵头和指向存储数据的矩阵指针两部分。矩阵头中包含矩阵的尺寸、存储方法、地址和引用次数等。矩阵头的大小是一个常数,不会随着矩阵尺寸大小而改变。

flags:int类型,共32位。

  • 0-2位代表depth即数据类型(如CV_8U),OpenCV的数据类型共7类;
  • 3-11位代表通道数channels;0-11位共同代表type即通道数和数据类型(如CV_8UC3);
  • 14位代表Mat的内存是否连续,一般由creat创建的mat均是连续的;
  • 15位代表该Mat是否为某一个Mat的submatrix,一般通过ROI以及row()、col()、rowRange()、colRange()等得到的mat均为submatrix。

dims:矩阵的维数。

channels:图像的通道数。

cols,rows:图像的列数,行数。

data:指向数据单元的指针。

refcount:记录了这个矩阵的数据被其他变量引用了多少次。

OpenCV应用:人脸检测

  • 人脸检测(Face Detection),就是给一幅图像,找出图像中的所有人脸位置,通常用一个矩形框框起来,输入是一幅图像img,输出是若干个包含人脸的矩形框位置(x,y,w,h)。
  • 自动人脸检测是围绕自动人脸图像分析的所有应用的基础,包括但不限于:人脸识别和验证,监控场合的人脸跟踪,面部表情分析,面部属性识别(性别/年龄识别,颜值评估),面部光照调整和变形,面部形状重建,图像视频检索,数字相册的组织和演示。
  • 人脸检测是所有现代基于视觉的人与电脑,和人与机器人,交互系统的初始步骤。
  • 主流商业数码相机都内嵌人脸检测,辅助自动对焦。
  • 很多社交网络如FaceBook,用人脸检测机制实现图像/人物标记。
    人脸检测与美颜技术介绍(OpenCV)_第8张图片

人脸检测历史

人脸检测也可分为两个时期:一个是深度学习之前的时期,在深度学习之前,人们做人脸检测,主要使用人工设计好的特征,根据人工特征来训练检测器检测人脸。

另一个是深度学习时期。当深度学习在计算机视觉领域占据绝对主导地位之后,人们开始尝试用深度神经网络来做人脸检测。

  • 级联CNN系列,有CNN Cascade, FaceCraft, MTNN, ICC-CNN,这一系列是深度学习方法中速度最快的,CPU都在10 FPS以上,级联CNN系列优化后轻松可以在CPU上实时,全面优化后的fastMTCNN甚至可以在ARM上跑起来;
  • Faster-RCNN系列:这类方法的优点是性能高,缺点是速度慢,在GPU上都无法实时,无法满足人脸检测对速度的极高要求,既然性能不是问题,这类方法的研究重点是提高效率。
  • SSD系列:这类方法的优势是速度快,在GPU上能实时,缺点是对密集小目标的检测比较差,而人脸刚好是密集小目标,这类方法的研究重点是提高密集小目标的检测性能,同时速度也需要尽可能快,GPU实时算法在应用中依然受限。

深度学习的人脸检测算法比较

人脸检测与美颜技术介绍(OpenCV)_第9张图片

OpenCV基于DNN+caffe的人脸检测

使用caffe框架的resnetface做人脸检测。

模型文件res10_300x300_ssd_iter_140000.caffemodel,模型定义deploy.prototxt.txt。

主要步骤如下:

  • 导入模型文件到网络:readNetFromCaffe()
  • 图片预处理:blobFormImage()
  • 将经过预处理的图片输入神经网络:setInput()
  • 前向运行计算输出层:forword()
  • 提取人脸信息(x,y,w,h)并画矩形框:rectangle()

blobFormImage

人脸检测与美颜技术介绍(OpenCV)_第10张图片

  1. image:输入图像。
  2. scalefactor: multiplier for image values。
  3. size:指的不是输入图像的尺寸,是指所需要的尺寸,也就是返回的Mat中数据的尺寸。
  4. swapRB:是否交换R和B分量,这在之前的色彩空间转换的文章中介绍过。
  5. crop:输入图像大小与size不符的时候,是否需要裁剪。
  6. ddepth:图像的数据类型,目前仅支持32F8U
  7. crop:裁剪标志,指示是否在调整大小后裁剪图像。
  8. 函数返回一个 ( [N,C,H,W] dimensions)。

setInput

  1. blob:一个新的blob。 应该有CV_32FCV_8U深度。就是上文中介绍的blobFromImage的返回值。
  2. name:输入图层的名称(prototxt文件中的inputlayer)。
  3. scalefactor:可选的标准化比例。
  4. mean:一个可选的平均减法值。

forword

人脸检测与美颜技术介绍(OpenCV)_第11张图片

  1. output Name:需要输出的图层的名称。
  2. 返回:指定图层outputName的第一个输出的blob。默认情况下,为整个网络运行正向传递。
  3. 注意:返回Mat类型,这是一个4D数,rows and cols can only hold 2 dimensions, so they are not used here, and set to -1
  4. 转换:cv::Mat detection = net->forward(“detection_out”); cv::Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr())

rectangle

人脸检测与美颜技术介绍(OpenCV)_第12张图片

  • 提取多个人脸位置信息。
  • 画人脸矩形框。

OpenCV应用:“美颜”

  • “美颜”,即对图片里的人脸进行美化。
  • “美颜”是一个深度学习+图像处理+图形学的技术。“美颜”牵涉到这些技术包括:人脸检测、人脸关键点定位、瘦脸、磨皮、美白等。
  • 磨皮:是使皮肤变得更加光滑,其技术原理是:对图片进行肤色检测。只对皮肤区域做磨皮,磨皮一般使用图像处理的一些滤波算法,例如双边滤波,高斯滤波等。
  • 美白:是操作图片上的所有像素点,获得像素点的R、G、B的值然后对获取到的值进行一定数目的增量。

磨皮效果

人脸检测与美颜技术介绍(OpenCV)_第13张图片
人脸检测与美颜技术介绍(OpenCV)_第14张图片

美白效果

人脸检测与美颜技术介绍(OpenCV)_第15张图片
人脸检测与美颜技术介绍(OpenCV)_第16张图片

OpenCV实现“美颜”

皮肤检测:

  • 基于RGB的皮肤检测:根据RGB颜色模型找出定义好的肤色范围内的像素点,但受光线影响,鲁棒性不好。
  • 基于椭圆皮肤模型的皮肤检测:如果将皮肤信息映射到YCrCb空间,则在CrCb二维空间中这些皮肤像素点近似成一个椭圆分布。
  • YCrCb颜色空间Cr分量+Otsu法阈值分割:Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异,对Cr做自二值化阈值分割处理(Otsu法)。
  • YCrCb颜色空间Cr分量+Otsu法阈值分割:Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异,对Cr做自二值化阈值分割处理(Otsu法)。
  • HSV颜色空间H范围筛选法。
  • opencv自带肤色检测类AdaptiveSkinDetector :背景有杂质。

双边滤波:cv::bilateralFilter()。

亮度增强:

  • int tmp= (uchar)image->at(i, j)[k] * contrast + bright; if (tmp > 255) image->at(i, j)[k] = 2 * 255 - tmp; else image->at(i, j)[k] = tmp;

人脸识别

  • 人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。
  • 技术流程:人脸图像采集及检测、人脸图像预处理、人脸图像特征提取以及匹配与识别。
  • 识别算法:
  1. 识别算法:基于人脸特征点的识别算法(Feature-based recognition algorithms)。
  2. 基于整幅人脸图像的识别算法(Appearance-based recognition algorithms)。
  3. 基于模板的识别算法(Template-based recognition algorithms)。
  4. 利用神经网络进行识别的算法(Recognition algorithms using neural network)。
  • 主要用途:主要用于身份识别,例:门禁系统,身份辨识,网络应用,娱乐应用等
  • 应用领域:政府、军队、银行、社会福利保障、电子商务、安全防务、金融、司法、军队、公安、边检、政府、航天、电力、工厂、教育、医疗及企事业单位。

人脸识别算法演化史

  • 早期算法:早期的算法有基于几何特征的算法,基于模板匹配的算法,子空间算法等多种类型
  • 第二阶段的人脸识别算法普遍采用了人工特征 + 分类器的思路。这里的关键是人工特征的设计,它要能有效的区分不同的人。描述图像的很多特征都先后被用于人脸识别问题,包括HOG、SIFT、Gabor、LBP等。
  • 第三个阶段是基于深度学习的方法。卷积神经网络在图像分类中显示出了巨大的威力,通过学习得到的卷积核明显优于人工设计的特征+分类器的方案。在人脸识别的研究者利用卷积神经网络(CNN)对海量的人脸图片进行学习,然后对输入图像提取出对区分不同人的脸有用的特征向量,替代人工设计的特征。在前期,研究人员在网络结构、输入数据的设计等方面尝试了各种方案,然后送入卷积神经网络进行经典的目标分类模型训练;在后期,主要的改进集中在损失函数上,即迫使卷积网络学习得到对分辨不同的人更有效的特征,这时候人脸识别领域彻底被深度学习改造了!

人脸识别工作原理

人脸检测与美颜技术介绍(OpenCV)_第17张图片

人脸识别算法

人脸检测与美颜技术介绍(OpenCV)_第18张图片

人脸识别算法主要包含三个模块:

  • 人脸检测(Face Detection):人脸检测用于确定人脸在图像中的大小和位置,即解决“人脸在哪里”的问题,把真正的人脸区域从图像中裁剪出来,便于后续的人脸特征分析和识别。
  • 人脸对齐(Face Alignment):原理是找到人脸的若干个关键点(基准点,如眼角,鼻尖,嘴角等),然后利用这些对应的关键点通过相似变换(Similarity Transform,旋转、缩放和平移)将人脸尽可能变换到标准人脸。
  • 人脸特征表征(Feature Representation):输入是标准化的人脸图像,通过特征建模得到向量化的人脸特征,最后通过分类器判别得到识别的结果。

什么是caffe?

Caffe,全称Convolutional Architecture for Fast Feature Embedding,中文名:卷积神经网络框架。

基本概念:

  • Blobs: Caffe使用blobs结构来存储,交换和处理网络中正向和反向迭代时的数据和导数信息,有统一的接口类型。
  • Layers: layer是Caffe模型和计算的基本单元。
  • Nets: Net是一系列 layers 和其连接的集合。
  • Forward and Backward: Caffe的两条计算生命线,Forward产生loss和输出结果;BackWard 产生反向梯度。
  • Loss:计算真实值和预测值之间的误差,指导下一步工作,由loss定义待学习的任务。
  • Solver: solver协调模型的优化。
  • Layer Catalogue: 学习Caffe中构建先进模型所需的各种层的功能。
  • Interface:Caffe的命令行、pythonmatlab版接口。
  • 总体印象:Blob包含在Layer里包含在Net里,SolverNet的求解。

如何训练caffe模型

  • 安装caffe
  • 准备数据:下载训练图片,整理归一化。
  • 制作标签文件。
  • 制作caffe格式数据:LMDB格式、H5PY格式等。
  • 计算均值并保存。
  • 创建模型并编写配置文件(或直接下载模型文件)。
  • 开始训练。

solver.prototxt

sovler的主要作用就是交替调用前向传导和反向传导 (forward & backward) 来更新神经网络的连接权值,从而达到最小化loss,实际上就是迭代优化算法中的参数。

Solver.prototxt流程:

  • 首先设计好需要优化的对象,以及用于学习的训练网络和测试网络的prototxt文件(通常是train.prototxttest.prototxt文件)。
  • 定期对网络进行评价。
  • 优化过程中显示模型和solver的状态。
  • 通过forwardbackward迭代进行优化来更新参数。
    人脸检测与美颜技术介绍(OpenCV)_第19张图片

训练用残差网络:ResNet-50-train-val.prototxt

人脸检测与美颜技术介绍(OpenCV)_第20张图片
人脸检测与美颜技术介绍(OpenCV)_第21张图片
人脸检测与美颜技术介绍(OpenCV)_第22张图片

残差网络:ResNet-50.prototxt

人脸检测与美颜技术介绍(OpenCV)_第23张图片
人脸检测与美颜技术介绍(OpenCV)_第24张图片
人脸检测与美颜技术介绍(OpenCV)_第25张图片

ResNet 152:ILSVRC 竞赛2015年冠军网络

人脸检测与美颜技术介绍(OpenCV)_第26张图片

END

你可能感兴趣的:(文档)