显示形状回归算法(ESR)代码介绍
源地址:http://www.thinkface.cn/thread-3704-1-6.html
人脸对齐包括两个部分,分别为训练部分和测试部分。所有的代码基于opencv2.0.
(一)训练阶段
Step1:样本的准备:
本文采用了IMM人脸数据库作为训练集,样本大小为640x480大小的彩色人脸图片,并手工对每个样本进行手工特征点标注。
Step2:样本预处理:(包括光照、尺度归一化等)
先进行尺度归一化操作,步骤如下:
1)从训练样本中选取一个比较正的人脸最为参考人脸。
2)将所有的训练样本对齐参考人脸,采用opencv中的 函数进行仿射变换(包括人脸图片和人脸形状的变换),最终扣取人脸区域并保存为100x100的灰度人脸图像。
然后进行光照处理:
对训练样本进行直方图均衡化操作,减少光照对人脸图片的影响。
计算平均人脸形状:
对所有训练样本的人类形状进行累加,计算平均人脸形状。
Step3:进行二级形状回归训练
ESR算法封装在CESRMethod类中,提供了训练接口void ESRMethod::train(****),如下。
void ESRMethod::train(****){
1> 一些基础的变量赋值与处理。
2> 赋值多个初始人脸形状。(用于正确算法的稳定性。例如现在有10个样本,对每个样本赋值10个初始人脸形状,则变成了100个样本)。 对每个训练样本赋值50个初始人脸形状。初始形状是通过平均人脸进行旋转、收缩、平移的方式的到的。
3> 进行一级形状回归,一级形状回归包含在FernCasade类中train函数中。
}
void FernCascade::train(****){
1>特征索引的建立
在人脸区域随机参数P个点,以平均人脸作为参考,将全局坐标转换成局部坐标,形成特征索引。
2>根据训练样本当前形状还原人脸形状的真实坐标(即68个特征点的坐标),通过remap函数获取68个特征点的像素值。
3>进行二级形状回归,封装在Fern类的train函数中。
4>更新每个训练样本的人脸形状。
}
void Fern::train(****){
1> 采用随机特征选择方法,从P个坐标点中选择出F对坐标点。根据选出的F对特征点,计算所有训练样本的F对特征点的像素差值,并将其作为一个特征。
2> 然后计算平均特征。
3> 根据平均特征,对样本进行归类,总共分为2^F类,计算没类中所有样本的平均人脸调整量,
4> 循环1>-3> N次,选择收敛最快的那一次保存其人脸调整量。
}
通过二级形状回归后,得到T个弱回归量 ,并将其保存在文件中。
(二)测试阶段
Step1:加载模型文件。
Step2:图片预处理阶段
打开目标人脸图像,将其转换成灰度图片。采用opencv自带的人脸检测函数找出图片中的人脸区域,并将其扣取出来,然后进行直方图均衡化操作,减少光照的影响。同时,将平均人脸形状作为目标图片的初始人脸形状。
Step3:人脸对齐阶段
采用如下三个函数进行人脸对齐
ESRMethod::test(const cv::Mat1b &image,const cv::Mat1f &shape,int t);
FernCascade::test(const cv::Mat1b &image,const cv::Mat1f &shape);
包括如下功能:
根据当前的人脸形状和形状特征索引,获取人脸特征。
更新人脸形状。
Fern::test(const cv::Mat1b &image,const cv::Mat1f &shape,const cv::Mat1f &xyloc,cv::Mat1f &dshape);
包括如下功能:
根据当前的特征,将其进行归类,并提前类中的形状调整量。
进行多次迭代后,输出对齐的人脸形状。
显示形状回归算法(ESR)代码介绍的更多相关文章
- 机器学习之logistic回归算法与代码实现原理
Logistic回归算法原理与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10033567.html ...
- 第2-2-4章 常见组件与中台化-常用组件服务介绍-分布式ID-附Snowflake雪花算法的代码实现
目录 2.3 分布式ID 2.3.1 功能概述 2.3.2 应用场景 2.3.3 使用说明 2.3.4 项目截图 2.3.5 Snowflake雪花算法的代码实现 2.3 分布式ID 2.3.1 功能 ...
- SparkMLlib回归算法之决策树
SparkMLlib回归算法之决策树 (一),决策树概念 1,决策树算法(ID3,C4.5 ,CART)之间的比较: 1,ID3算法在选择根节点和各内部节点中的分支属性时,采用信息增益作为评价标准.信 ...
- 机器学习之Logistic 回归算法
1 Logistic 回归算法的原理 1.1 需要的数学基础 我在看机器学习实战时对其中的代码非常费解,说好的利用偏导数求最值怎么代码中没有体现啊,就一个简单的式子:θ= θ - α Σ [( hθ( ...
- Spark MLlib回归算法------线性回归、逻辑回归、SVM和ALS
Spark MLlib回归算法------线性回归.逻辑回归.SVM和ALS 1.线性回归: (1)模型的建立: 回归正则化方法(Lasso,Ridge和ElasticNet)在高维和数据集变量之间多 ...
- 【笔记】衡量线性回归法的指标 MSE,RMS,MAE以及评价回归算法 R Square
衡量线性回归法的指标 MSE,RMS,MAE以及评价回归算法 R Square 衡量线性回归法的指标 对于分类问题来说,我们将原始数据分成了训练数据集和测试数据集两部分,我们使用训练数据集得到模型以后 ...
- Lasso回归算法: 坐标轴下降法与最小角回归法小结
前面的文章对线性回归做了一个小结,文章在这: 线性回归原理小结.里面对线程回归的正则化也做了一个初步的介绍.提到了线程回归的L2正则化-Ridge回归,以及线程回归的L1正则化-Lasso回归.但是对 ...
- 基于Python的函数回归算法验证
看机器学习看到了回归函数,看了一半看不下去了,看到能用方差进行函数回归,又手痒痒了,自己推公式写代码验证: 常见的最小二乘法是一阶函数回归回归方法就是寻找方差的最小值y = kx + bxi, yiy ...
- Python实现各种排序算法的代码示例总结
Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...
随机推荐
- vim添加删除多行注释
CTRL+V进入可视化模式 移动光标上移或者下移,选中多行的开头 选择完毕后,按大写的的I键,此时下方会提示进入“insert”模式,输入你要插入的注释符 最后按ESC键,你就会发现多行代码已经被注释 ...
- Android ListView 常见问题与使用总结
一.机制 ListView机制 - 先运行getCount.然后运行getView. 假设getCount返回0,不运行getView Gallery convertView不会复用.每次都返回NUL ...
- Route@书写规则的总结
路由书写规则的总结 概念:Routing System由一组路由组成,每一个路由规则可以匹配一种类型的URL,在请求过来的时候,Ruting ystem 就用它来处理这个URL,路由的任务就是匹配UR ...
- C#面向对象1 类 以及 类的继承(new、ovverride)
类 的典型代码============================== 包括 属性及其判断赋值 方法 构造函数及其重载 ) { ...
- WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
原文:WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用 [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经> ...
- 减少可执行程序size的三个常用软件
减少可执行程序size的三个常用软件 linux下面,直接用strip 这个命令 #:strip xxx 可以去掉编译调试信息和各种符号表,能够大大减小可执行程序size windows下面这种exe ...
- 高焕堂《android从程序员到架构师之路》 YY讲坛直面大师学习架构设计
<android从程序员到架构师之路>YY讲坛活动: sundy携手高焕堂老师全程YY答疑 与大师一起,分享android技术 时间:7月21日下午2:00 报名联系QQ:22243 ...
- C语言中的enum(枚举)使用方法
近期在写数据结构的广义表时候用到了这个概念,在学习C语言的时候没有太注意们这里学一下. 我在网上结合了非常多资料,这里自己总结一下. 首先说.JAVA和C++中都有枚举类型. 假设一个变量你须要几种可 ...
- Ural1109_Conference(二分图最大匹配/匈牙利算法/网络最大流)
解题报告 二分图第一题. 题目描写叙述: 为了參加即将召开的会议,A国派出M位代表,B国派出N位代表,(N,M<=1000) 会议召开前,选出K队代表,每对代表必须一个是A国的,一个是B国的; ...
- EasyUI - DataGrid 组建 - [ 组件加载和分页 ]
效果: 原理:通过POST传递到数据后台字段. 此时上传的参数,page:当前页数,rows:每页显示的页数. 有此两项参数,计算取出数据条数. 通过后台接受参数,进行处理并返回抽取的数据. html ...