前言

最近研读了孙剑团队的Face Alignment at 3000fps via Regressing Local Binary Features这篇paper,基于matlab进行实现。

实现原理:

包含训练和测试两个阶段;

1.基于标准随机森林回归算法独立地学习每个特征点的局部二值特征,连接形成每张图像的特征;

2.基于双坐标下降法学习全局线性回归;

论文下载:

http://www.jiansun.org/papers/CVPR14_FaceAlignment.pdf

matlab实现步骤:

1.源代码地址(含有实现方法的英文说明):

https://github.com/jwyang/face-alignment

2.环境:

官方:win64 + matlab2014a;

个人:win64 + matlab2014b;

3.下载数据库:

数据库下载网址:http://ibug.doc.ic.ac.uk/resources/facial-point-annotations

可以下载需要的样本库,不过发现300W四个文件夹中的数据完全一样;

4.配置训练样本函数的依赖库liblinear.

从网址http://www.csie.ntu.edu.tw/~cjlin/liblinear/可以直接下载liblinear库文件.

如果系统是windows64可以直接将里边windows文件夹中的文件全部拷贝到创建的matlab工程目录下;

5.准备数据.

将数据库解压到工程目录新建的datasets文件夹中,细节可参见train_model.m文件.

6.train_model.m文件中代码表示读入的训练样本数据的文件是Path_Image.txt,所以进入cmd控制台change目录到datasets文件夹中的一个数据库中,比如.\afw,然后输入命令dir /b/s/p/w *.jpg>Path_Images.txt,这是将所有jpg格式的文件名都输入到Path_Images.txt文件中,其他数据库文件的获取类似,注意图片格式和路径即可.

7.训练样本库.

1)在matlab工程目录下创建一个m文件,命名为train_3000fps.m;

filepath_ranf = './ranf.mat';
filepath_ws = './ws.mat';
lbfmodel = train_model_func({ 'afw' });
ranf = lbfmodel.ranf;
ws = lbfmodel.Ws;
save(filepath_ranf, 'ranf');
save(filepath_ws, 'ws');

2)基于train_model.m重新生成train_model_func.m的函数形式;

二者的主体内容完全一样,train_model_func.m只需要在函数开始部分添加一行函数头即可;

function LBFRegModel = train_model_func( dbnames )

然后执行train_3000fps.m文件开始进行训练,训练时间可能会比较长,训练完成之后会得到ranf.mat和ws.mat两个文件.

8.测试结果.

按照步骤6的方法生成要进行测试的数据库的Path_Image.txt文件,然后在matlab工程目录下创建test_3000fps.m文件,

filepath_ranf='./ranf.mat';
filepath_ws='./ws.mat'; r=load(filepath_ranf);
w=load(filepath_ws);
ranf=r.ranf;
ws=w.ws;
t.ranf=ranf;
t.Ws=ws; test_model_func({'ibug'},t);

  

同时基于test_model.m重新生成test_model_func.m文件,参考步骤7所示,

function test_model_func( dbnames, LBFRegModel )

执行test_3000fps.m文件即可完成测试过程.

9.测试结果的显示;

将测试文件改写为如下,其中文件路径和名称可按照自己的想法进行设置;

filepath_ranf='./ranf.mat';
filepath_ws='./ws.mat'; r=load(filepath_ranf);
w=load(filepath_ws);
ranf=r.ranf;
ws=w.ws;
t.ranf=ranf;
t.Ws=ws; % test_model_func({'ibug'},t);
% %查看结果
[predshapes, Data] = test_model_func({'ibug'}, t);
[X, Y, N] = size( predshapes );
for i=1:N
shapes=predshapes(:,:,i);
img=Data{i}.img_gray;
%drawshapes(img, [shapes,Data{i}.shape_gt]);
drawshapes(img, Data{i}.shape_gt);
rectangle('Position', Data{i}.bbox_facedet, 'EdgeColor', 'b');
name = ['.\ibug\', int2str(i),'_1'];
print(gcf, '-dpng', name);
hold off;
% pause;
end

  

需要改写以下几处:

1)测试文件的test_model_func.m文件;

function [predshapes, Data] = test_model_func( dbnames, LBFRegModel )

2)test_model_func.m文件中调用globalprediction函数部分的输出格式作出一些修改;

  [Data, predshapes] = globalprediction(binfeatures, Ws{min(s,  params.max_numstage)}, Data, Param, min(s,  params.max_numstage));

3)修改globalprediction.m文件的函数头;

%function Te_Data = globalprediction(binaryfeatures, W, Te_Data, params, stage)
function [Te_Data, predshapes] = globalprediction(binaryfeatures, W, Te_Data, params, stage)

另外,可以更改drawshapes.m文件,得到你想要的显示类型。

实现结果

基于matlab按照以上步骤实现,速度没有论文中的3000fps那么快,当然也可能是系统优化等方面的问题,精度相比sdm稍逊一些;

另外,针对红外图像的landmarks,与一般图像相比,SDM的效果没差,但是LBF的效果就差一些;

接下来也会实现c++版本,测试一下效果;

参考

1.http://blog.csdn.net/wangjian8006/article/details/42004717

2.GitHub:https://github.com/jwyang/face-alignment

3.http://blog.csdn.net/xiamentingtao/article/details/50821972

4.大牛博客

人脸对齐matlab实现-FaceAlignment 3000fps的更多相关文章

  1. 机器学习--详解人脸对齐算法SDM-LBF

    引自:http://blog.csdn.net/taily_duan/article/details/54584040 人脸对齐之SDM(Supervised Descent Method) 人脸对齐 ...

  2. MTCNN算法与代码理解—人脸检测和人脸对齐联合学习

    目录 写在前面 算法Pipeline详解 如何训练 损失函数 训练数据准备 多任务学习与在线困难样本挖掘 预测过程 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 主 ...

  3. 机器学习----人脸对齐的算法-ASM.AAM..CLM.SDM

    引自:http://blog.csdn.net/linolzhang/article/details/55271815 人脸检测 早已比较成熟,传统的基于HOG+线性分类器 的方案检测效果已经相当不错 ...

  4. 人脸对齐SDM原理----Supervised Descent Method and its Applications to Face Alignment

    最近组里研究了SDM算法在人脸对齐中的应用,是CMU的论文<Supervised Descent Method and its Applications to Face Alignment> ...

  5. MTCNN(Multi-task convolutional neural networks)人脸对齐

    MTCNN(Multi-task convolutional neural networks)人脸对齐 .

  6. 基于Landmark的人脸对齐以及裁剪方法

    利用Landmarks进行人脸对齐裁剪是人脸检测中重要的一个步骤.效果如下图所示: 基本思路为: a.人脸检测 人脸的检测不必多说了,基本Cascade的方式已经很不错了,或者用基于HOG/FHOG的 ...

  7. 揭秘人脸对齐之3D变换-Java版(文末赋开源地址)

    一.人脸对齐基本概念 人脸对齐通过人脸关键点检测得到人脸的关键点坐标,然后根据人脸的关键点坐标调整人脸的角度,使人脸对齐,由于输入图像的尺寸是大小不一的,人脸区域大小也不相同,角度不一样,所以要通过坐 ...

  8. 人脸对齐ASM-AAM-CLM的一些总结

    源地址:http://blog.csdn.net/piaomiaoju/article/details/8918107 ASM算法相对容易,其中STASM是目前正面脸当中比较好的算法,原作者和CLM比 ...

  9. python AI换脸 用普氏分析法(Procrustes Analysis)实现人脸对齐

    1.图片效果 2.原代码 # !/usr/bin/python # -*- coding: utf-8 -*- # Copyright (c) 2015 Matthew Earl # # Permis ...

随机推荐

  1. STL_std::iterator

    1. VC6里面 看到,std::iterator 就是一个指针,但是 vs2010中貌似不是这样(感觉像是一个类...具体是啥还不太确定...)... 2.

  2. Android仿QQ微信开场导航以及登陆界面

    相信大家对于微信等社交应用的UI界面已经都很熟悉了,该UI最值得借鉴的莫过于第一次使用的时候一些列产品介绍的图片,可以左右滑动浏览,最后 进入应用,这一效果适用于多种项目中,相信今后开发应用一定会用得 ...

  3. Codeforces 919D - Substring

    919D - Substring 思路: 拓扑排序判环+DAG上dp+记忆化搜索 状态:dp[i][j]表示以i为起点的路径中j的最大出现次数 初始状态:dp[i][j]=1(i have no so ...

  4. HDU 6098 Inversion

    Inversion 思路:从大到小排序后,每次找到第一个下标不整出i的输出. 代码: #include<bits/stdc++.h> using namespace std; #defin ...

  5. threejs和3d各种效果的学习

    写给即将开始threejs学习的自己,各种尝试,各种记忆.不要怕,灰色的年华终会过去. 一个技术学习的快慢,以及你的深刻程度,还有你的以后遇到这个东西的时候的反应速度,很大程度上,取决于你的博客的深刻 ...

  6. unity自义定摇杆

    写在前面,摇杆控制人物的移动,摄像机跟随人物移动,且滑动屏幕可以控制摄像机观察人物的角度. 需要考虑的问题 1.摇杆滑动角度的计算. 2.摇杆控制效果程度的计算(即:摇杆距离中心位置越远人物的移动速度 ...

  7. ubuntu10.04 交叉编译 aria2 总结

    1) google之后,找到 这个 https://github.com/z24/pitv/tree/master/cross 的脚本, 觉得非常好. 于是准备用来进行编译 2) 安装交叉编译器 su ...

  8. Greengenes Database(16S)

    The Greengenes Database Release 13_5 这是16S的一个非常重要的数据库 The Greengenes Database, a public resource sin ...

  9. 56. Merge Intervals 57. Insert Interval *HARD*

    1. Merge Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[ ...

  10. Oracle12cr1新特性之容器数据库(CDB)和可插拔数据库(PDB) 的启动和关闭

    Oracle12c中引入的多宿主选项(multitenant option)允许一个容器数据库容纳多个独立的可插拔数据库(PDB).本文将说明如何启动和关闭容器数据库(CDB)和可插拔数据库(PDB) ...