使用OpenFace进行人脸识别(1)
http://www.chinacloud.cn/show.aspx?id=25992&cid=12
本文中,笔者将介绍OpenFace中实现人脸识别的pipeline,这个pipeline可以看做是使用深度卷积网络处理人脸问题的一个基本框架,很有学习价值,它的结构如下图所示:
![图片描述](http://www.chinacloud.cn/upload/2017-06/170615150996621.png)
Input Image -> Detect
输入:原始的可能含有人脸的图像。
输出:人脸位置的bounding box。
这一步一般我们称之为“人脸检测”(Face Detection),在OpenFace中,使用的是dlib、OpenCV现有的人脸检测方法。此方法与深度学习无关,使用的特征是传统计算机视觉中的方法(一般是Hog、Haar等特征)。
对人脸检测这一步感兴趣的可以参考下列资料:
dlib的实现:http://blog.dlib.net/2014/02/dlib-186-released-make-your-own-object.html
openCV的实现:Face Detection using Haar Cascades
Detect -> Transform -> Crop
输入:原始图像 + 人脸位置bounding box
输出:“校准”过的只含有人脸的图像
对于输入的原始图像 + bounding box,这一步要做的事情就是要检测人脸中的关键点,然后根据这些关键点对人脸做对齐校准。所谓关键点,就是下图所示的绿色的点,通常是眼角的位置、鼻子的位置、脸的轮廓点等等。有了这些关键点后,我们就可以把人脸“校准”,或者说是“对齐”。解释就是原先人脸可能比较歪,这里根据关键点,使用仿射变换将人脸统一“摆正”,尽量去消除姿势不同带来的误差。这一步我们一般叫Face Alignment。
![图片描述](http://www.chinacloud.cn/upload/2017-06/170615150996622.png)
在OpenFace中,这一步同样使用的是传统方法,特点是比较快,对应的论文是:
One Millisecond Face Alignment with an Ensemble of Regression Trees
Crop -> Representation
输入:校准后的单张人脸图像
输出:一个向量表示。
这一步就是使用深度卷积网络,将输入的人脸图像,转换成一个向量的表示。在OpenFace中使用的向量是128x1的,也就是一个128维的向量。
我们可以先看一下VGG16的模型:
![图片描述](http://www.chinacloud.cn/upload/2017-06/170615150996623.png)
VGG16是深度学习中一个比较简单的基本模型。输入神经网络的是图像,经过一系列卷积后,全连接分类得到类别概率。
![图片描述](http://www.chinacloud.cn/upload/2017-06/170615150996624.png)
在通常的图像应用中,我们可以去掉全连接层,用计算的特征(一般就是卷积层的最后一层,e.g. 图中的conv5_3)来当作提取的特征进行计算。但如果对人脸识别问题同样采用这样的方法,即,使用卷积层最后一层做为人脸的“向量表示”,效果其实是不好的。如何改进?我们之后再谈,这里先谈谈我们希望这种人脸的“向量表示”应该具有哪些性质。
在理想的状况下,我们希望“向量表示”之间的距离就可以直接反映人脸的相似度:
对于同一个人的人脸图像,对应的向量的欧几里得距离应该比较小。
对于不同人的人脸图像,对应的向量之间的欧几里得距离应该比较大。
这种表示实际上就可以看做某种“embedding”。在原始的VGG16模型中,我们使用的是softmax损失,没有对每一类的向量表示之间的距离做出要求。所以不能直接用作人脸表示。
举个例子,使用CNN对MNIST进行分类,我们设计一个特殊的卷积网络,让最后一层的向量变为2维,此时可以画出每一类对应的2维向量表示的图(图中一种颜色对应一种类别):
![图片描述](http://www.chinacloud.cn/upload/2017-06/170615150996625.png)
上图是我们直接使用softmax训练得到的结果,它就不符合我们希望特征具有的特点:
我们希望同一类对应的向量表示尽可能接近。但这里同一类(如紫色),可能具有很大的类间距离。
我们希望不同类对应的向量应该尽可能远。但在图中靠中心的位置,各个类别的距离都很近。
那么训练人脸特征表示的正确姿势是什么?其实有很多种方法。一种方法就是使用“center loss”。centor loss实际上是在softmax的loss上再加入一个损失,这个损失对每一类规定了一个“中心”点,每一类的特征应该离这个中心点比较近,而不同类的中心点离的比较远。加入center loss后,训练出的特征大致长这样:
![图片描述](http://www.chinacloud.cn/upload/2017-06/170615150996626.png)
这样的特征表示就比较符合我们的要求了。center loss的原始论文在这里:http://ydwen.github.io/papers/WenECCV16.pdf 。上面这两幅图同样是从这篇论文中截下来的。
顺带一提,除了center loss外。学习人脸特征表示的方法还有很多,如triplet loss(论文地址:A Unified Embedding for Face Recognition and Clustering)。triplet loss直接这样的用三元组(A的图像1,A的图像2,B的图像)来训练网络。去掉了最后的分类层,强迫神经网络对相同的人脸图像(三元组中的同一人A)建立统一的表达。
实际应用
输入:人脸的向量表示。
有了人脸的向量表示后,剩下的问题就非常简单了。因为这种表示具有相同人对应的向量的距离小,不同人对应的向量距离大的特点。接下来一般的应用有以下几类:
人脸验证(Face Identification)。就是检测A、B是否是属于同一个人。只需要计算向量之间的距离,设定合适的报警阈值(threshold)即可。
人脸识别(Face Recognition)。这个应用是最多的,给定一张图片,检测数据库中与之最相似的人脸。显然可以被转换为一个求距离的最近邻问题。
人脸聚类(Face Clustering)。在数据库中对人脸进行聚类,直接K-Means即可。
后记
以上给大家介绍了OpenFace中处理人脸问题的pipeline。需要特别指出的是,人脸相关的问题是一个比较大的方向,一篇文章显然是说不清楚的,这里只是基于OpenFace,对比较重要的方法还有名词做了一个解释。在OpenFace中,为了速度的考虑,提取人脸特征之前的Face Detection和Face Alignment就是使用的传统方法。实际上也可以换用精度更高的深度学习相关方法,比如在中科院山世光老师开源的人脸识别引擎seetaface/SeetaFaceEngine中,Face Alignment使用就是一个基于autoencoder网络的方法。另外,学习人脸特征同样有适合不同场景的不同方法,这些都是要进一步学习的。
使用OpenFace进行人脸识别(1)相关推荐
- 如何通过OpenFace实现人脸识别框架
本文中,笔者将介绍OpenFace中实现人脸识别的pipeline,这个pipeline可以看做是使用深度卷积网络处理人脸问题的一个基本框架,很有学习价值,它的结构如下图所示: Input Image ...
- docker + openface进行人脸识别(初探)
前记 因为最近需要用到人脸识别技术,所以对openface的使用做了一个简单的测试,使用的是docker+openface+ubuntu环境,docker下安装openface比较简单,不会因为环境安 ...
- OpenFace使用OpenFace进行人脸识别
1.OpenFace简介 http://cmusatyalab.github.io/openface/ 安装就按照官方教程来就好了 装完各种依赖之后运行一下命令 https://github.com/ ...
- 看OpenFace如何做到精准人脸识别
原文:https://blog.algorithmia.com/understanding-facial-recognition-openface/ 作者:Stephanie Kim 翻译:不二 欢迎 ...
- 人脸检测MTCNN和人脸识别Facenet(附源码)
原文链接:人脸检测MTCNN和人脸识别Facenet(附源码) 在说到人脸检测我们首先会想到利用Harr特征提取和Adaboost分类器进行人脸检测(有兴趣的可以去一看这篇博客第九节.人脸检测之Haa ...
- (转)第三十七节、人脸检测MTCNN和人脸识别Facenet(附源码)
http://www.cnblogs.com/zyly/p/9703614.html 在说到人脸检测我们首先会想到利用Harr特征提取和Adaboost分类器进行人脸检测(有兴趣的可以去一看这篇博客第 ...
- Openface人脸识别的原理与过程
Openface人脸识别的原理与过程: https://zhuanlan.zhihu.com/p/24567586 原理可参考如下论文: <OpenFace: A general-purpose ...
- 【TensorFlow】人脸识别OpenFace、Face-recognition、Insightface和FaceNet源码运行
比较人脸识别OpenFace.Face-recognition.Insightface: FaceNet源码运行 https://github.com/davidsandberg/facenet 1. ...
- 人脸识别项目openface
原文出处: https://xugaoxiang.com/2019/12/10/openface/ 软硬件环境 openface ubuntu 16.04 64bit python2 openface ...
最新文章
- 算法er的尽头会是To B吗?
- python写入中文、用utf-16编码得出二进制字节串_在python中将unicode UTF16数据写入文件时出现问题...
- Hadoop 之Pig的安装的与配置之遇到的问题---待解决
- python2与python3性能对比_对Python2与Python3中__bool__方法的差异详解
- ubuntu 12.10 笔记
- 【模板】最新空web.xml模板
- InVEST model中生境质量
- 哈夫曼算法(huffman algorithm C)
- 为什么说 Julia 更优于 Python?
- 我妈给我介绍对象了,我大学还没毕业呢,先在婚介市场也这么卷了的吗?【Python爬虫实战:甜蜜蜜婚介数据采集】
- git add 所有修改文件_工作中Git的使用实践
- (附源码)计算机毕业设计SSM教务排课管理系统
- 在线超市系统-PythonGUI Tkinter 图片界面设计案例
- 什么样的会员管理才叫有效果的会员运营方案?
- win10下载CAD之后任务栏卡死
- 看视频用这个太爽了!自动实时翻译英语视频
- ppm/℃是什么单位?什么意思?
- 激光雷达+imu_激光雷达slam-激光点云畸变补偿
- win10彻底关闭windows defender的两种方法
- HashMap原理以及TreeMap和Collections工具类(2022.6.10)
热门文章
- How Distance Transform Maps Boost Segmentation CNNs: An Empirical Study
- Windows下一键搭建MBP系统,支持多种版本任意选择,免费永久使用,多系统使用新方案
- 中北大学计算机学院校长,韩燮
- Serv-U FTP Server 错误代码详解
- Vue —— 购买产品个数与加入购物车
- 零基础教程:戴尔服务器raid10配置教程
- Android的进度条(ProgressBar)、拖动条(SeekBar)
- 2021 ICCV : Instance-level Image Retrieval using Reranking Transformers
- ENVI中TIF格式文件打不开
- 花300天深度体验20款任务管理软件,我最后选了飞项