显示形状回归算法(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实现各种排序算法的代码示 ...
随机推荐
- 相对路径与绝对路径构造file对象
package file; import java.io.File; public class FileTest1 { public static void main(String[] args) { ...
- ant—学习记录一
<?xml version="1.0"?> <project name="helloWorld"> <target name=&q ...
- Orleans is a framework
Introduction Orleans is a framework that provides a straightforward approach to building distributed ...
- js获取地址栏url以及获取url参数
js原生态写法 代码如下 复制代码 function getUrlParam(name) { var reg = new RegExp("(^|&)"+ name ...
- OGR 官方文档
OGR 官方文档 http://www.gdal.org/ogr/index.html The OGR Simple Features Library is a C++ open source lib ...
- POJ 2455 网络流 基础题 二分+网络流 dicnic 以及 sap算法
Secret Milking Machine Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8189 Accepted: ...
- HDU4544 湫湫系列故事――消灭兔子
HDU 4544 Tags: 数据结构,贪心 Analysis: 将兔子的血量从大到小排序,将箭的杀伤力从大到小排序,对于每一个兔子血量, 将比他大的杀伤力大的剑压入优先队列,优先队列自己重写,让它每 ...
- easyUI相关知识
$("#sportGroupInfoDialog").dialog("open");//打开一个对话框,设置这个对话框的的布局方式 $('#sportGroup ...
- Python 获取时间戳
Python 获取时间通过 time 模块 如下代码,是通过获取当前的时间,按照格式输出 Python默认获取当前的时间返回的都是时间的元组,下面是元组的,字符串时间的一个转换输出 # -*- cod ...
- 终于懂了:FWinControls子控件的显示是由Windows来管理,而不是由Delphi来管理(显示透明会导致计算无效区域的方式有所不同——透明的话应减少剪裁区域,所以要进行仔细计算)
在研究TCustomControl的显示过程中,怎么样都找不到刷新FWinControls并重新显示的代码: procedure TWinControl.PaintHandler(var Messag ...