从0到1实现基于Tornado和Tensorflow的人脸、年龄、性别识别(1)

本文介绍了从第三方方案转向自研算法,详细讲解了openCV的人脸检测原理,包括Haar特征、积分图和AdaBoost算法。接着探讨了深度学习中的前馈神经网络和卷积神经网络,以及它们在图像处理中的差异。还分享了使用Tensorflow实现的年龄段和性别识别算法的训练和预测过程,并提供了源码和模型下载链接。最后讨论了Centos7环境下安装Tensorflow和OpenCV的步骤,以及使用Tornado搭建web服务的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Prerequisites

TensorFlow 0.12
Python2.7
OpenCV3.0
Centos7

从第三方Face++系统方案到第三方的算法方案

因为要快速实现一个Demo,所以刚开始没想到要做算法方案,业内听说Face++这家创业公司做的算法还可以,阿里巴巴似乎也用了他们的方案。
以下是他们官网的产品介绍,似乎做的不做的样子
Face++实现的功能
他们已经实现了人脸检测(这个比较容易,openCV实现起来很快),人脸比对(这个也比较容易,有不少开源方案),人脸搜索(似乎有点难,关键是这个集合有多大,例如咱们南京以前的银行门口杀人案,据说全南京的警察都在看监控,人肉搜索),人脸关键点(嗯,有点难度了),人脸属性(似乎也是深度学习实现的,具体怎么实现呢没时间思考啦)
那么我们来感受一下,这个公司的官网提供了网页版本的服务演示(很自信啊),找个美女试一试,相信都知道是谁吧,来自南京的美女
人脸测试

openCV人脸识别算法的实现原理

人脸识别算法综述

可以将人脸检测的方法分为四类:
1. 基于知识的方法( Knowledge-based)
例如人脸的轮廓可近似地被看成一个椭圆, 则人脸检测可以通过检测椭圆来完成。 对任意一幅图像, 首先进行边缘检测, 并对细化后的边缘提取曲线特征, 然后计算各曲线组合成人脸的评估函数来检测人脸。
虽然人脸因人而异,但都遵循一些普遍适用的规则,即五官分布的几何规则。检测图像中是否有人脸, 即是否存在满足这些规则的图像块。 这种方法一般是先对人脸的器官或器官的组合建立模板, 然后检测图像中几个器官可能分布的位置, 对这些位置点分别组合, 用器官分布的知识规则进行筛选, 从而找到可能存在的人脸。
这里写图片描述
基于知识的方法是一种自上而下的方式。它其中一个困难是如何将人类知识转化成为有效的规则: 如果规则制定得太细, 那么可能有许多人脸无法通过规则的验证; 如果规则制定得太宽泛, 那么可能许多非人脸会被误判为人脸。
2. 特征不变量方法( Feature invariant)
这个方法的目标是寻找那些即使当姿势、视角和光线条件变化时仍然存在的结构特征, 并利用这些特征来定位人脸。 由于人类能够毫不费劲地“ 看到” 在不同光线和姿态下的人脸和物体, 因此研究人员认为有一个潜在的假设: 存在一些关于人脸的不依赖于外在条件的属性或者特征。有许多方法就是按照这个潜在假设, 首先去寻找这种脸部特征( 通过大量样本学习的方法), 然后用寻找到的特征去检测人脸。 对比基于知识的自上而下的方法, 这种基于特征的方法是自下而上的。
基于Haar特征的AdaBoost算法就是这一类的。
3. 模板匹配的方法( Template matching)
模板匹配法是一种经典的模式识别方法。 其处理过程如下:
- 进行预处理手动地预定义或者参数化一个标准人脸图案。 预处理要做尺度归一化和灰度归一化的工作。 最简单的模板将人脸看成椭圆, 更复杂的人脸模板参见下图;
这里写图片描述
- 计算输入图像与标准人脸图案的相关值, 这个相关值大都是独立计算脸部轮廓、 眼镜、 鼻子和嘴各自的匹配程度后得出的综合描述。 对于图中的模板, 则是按照划分的 16 个区域和这些区域间的 23 种关系来计算这
个相关值;
- 根据相关值和预先设定的阈值来确定图像中是否有人脸。
4. 基于表象的方法( Appearance-based)
一般而言,基于表象的方法利用统计分析和机器学习的技术来寻找人脸和非人脸图像的有关特性。 学习而来的特性总结成分布模型或者判别函数, 再利用这些分布模型或者判别函数来检测人脸。 一般, 为了计算的效率和检测的效益, 都会先降低图像的维数。
许多基于表象的方法都可以在概率论的框架中理解。特征向量可以看成是随机变量 x,这个随机变量被分类条件密度函数 p(x | faces) 和 p(x | nonfaces ) 分别描述成人脸和非人脸。
图 像 中 备 选 的 人 脸 或 者 非 人 脸 位 置 可 以 用 贝 叶 斯 判 决 规 则 (Bayesian classification)或者最大概似法(maximum likelihood)来判别。 不幸地, 简单地应用贝叶斯判决是不可行的, 这是因为:
- x 是高维的;
- p(x | faces) 和 p(x | nonfaces ) 是多态的(multimodal);
- p(x | faces) 和 p(x | nonfaces ) 的自然参数化形式(natural parameterized
forms)还没有弄清楚。
因此, 基于表象的方法中的许多工作都涉及到用经验来验证 p(x | faces) 和p(x | nonfaces ) 参数和非参数的近似的问题。
另一种方法利用了人脸和非人脸类的判别函数( 比如决策面、 分离超平面、阈函数等): 图像图案先被投射到低维或者高维空间, 之后使用判别函数来进行分类。例如PCA+SVM处理。

Haar人脸检测算法

说是人脸检测,其实这种方法广泛用于各种目标检测算法中
最早的Haar特征由Papageorgiou C.等提出(《A general framework for object detection》),后来Paul Viola和Michal Jones提出利用积分图像法快速计算Haar特征的方法(《Rapid object detection using a boosted cascade of simple features》)。之后,Rainer Lienhart 和 Jochen Maydt用对角特征对Haar特征库进行了扩展(《An extended set of Haar-like features for rapid object detection》)。OpenCV的Haar分类器就是基于扩展后的特征库实现的。
Haar特征本身并不复杂,就是用图中黑色矩形所有像素值的和减去白色矩形所有像素值的和。
这里写图片描述
脸部的一些特征可以由矩形特征简单地描绘
这里写图片描述
上图中两个矩形特征,表示出人脸的某些特征。比如中间一幅表示眼睛区域的颜色比脸颊区域的颜色深,右边一幅表示鼻梁两侧比鼻梁的颜色要深。同样,其他目标,如眼睛等,也可以用一些矩形特征来表示。使用特征比单纯地使用像素点具有很大的优越性,并且速度更快。
在给定有限的数据情况下,基于特征的检测能够编码特定区域的状态,而且基于特征的系统比基于象素的系统要快得多。
矩形特征对一些简单的图形结构,比如边缘、线段,比较敏感,但是其只能描述特定走向(水平、垂直、对角)的结构,因此比较粗略。如上图,脸部一些特征能够由矩形特征简单地描绘,例如,通常,眼睛要比脸颊颜色更深;鼻梁两侧要比鼻梁颜色要深;嘴巴要比周围颜色更深。
对于一个 24×24 检测器,其内的矩形特征数量超过160,000 个,必须通过特定算法甄选合适的矩形特征,并将其组合成强分类器才能检测人脸。
那么如何计算160000+个特征,也就是像素值的和,也成了个问题

积分图

由于Haar特征是矩形中黑色区域所有像素值的和减去白色区域所有像素值的和。,24*24的图片中,有160000+个特征,远远大于其像素个数。如果计算每个特征的像素和,计算量会非常大,而且很多次运算是重复的。
Paul Viola提出一种利用积分图像法快速计算Haar特征的方法(《Rapid object detection using a boosted cascade of simple features》)。简单说来,就是先构造一张“积分图”(Integral image),也叫Summed Area Table,之后任何一个Haar矩形特征都可以通过查表的方法(Look Up Table)和有限次简单运算得到,大大减少了运算次数。
这个其实很好理解。

AdaBoost算法

AdaBoost,是英文”Adaptive Boosting”(自适应增强)的缩写,由Yoav Freund和Robert Schapire在1995年提出。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在 每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。
具体说来,整个Adaboost 迭代算法就3步:
- 初始化训练数据的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N;
- 训练弱分类器。具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去;
- 将 各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用, 而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
可参考 《Adaboost 算法的原理与推导》http://blog.youkuaiyun.com/v_july_v/article/details/40718799

openCV的相关函数

这里直接上检测人脸的代码,可以通过pycharm在ubuntu或MAC系统中查看源码

def detectface(filename):
    files = []
    print('Using face detector %s' % FLAGS.face_detection_model)
    face_detect = FaceDetector('haarcascade_frontalface_default.xml')
    face_files, rectangles = face_detect.run(filename)
    files += face_files
    if (len(files)>0) :
        
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值