人脸对齐matlab实现-FaceAlignment 3000fps
前言
最近研读了孙剑团队的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;
1 2 3 4 5 6 7 | 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只需要在函数开始部分添加一行函数头即可;
1 | function LBFRegModel = train_model_func( dbnames ) |
然后执行train_3000fps.m文件开始进行训练,训练时间可能会比较长,训练完成之后会得到ranf.mat和ws.mat两个文件.
8.测试结果.
按照步骤6的方法生成要进行测试的数据库的Path_Image.txt文件,然后在matlab工程目录下创建test_3000fps.m文件,
1 2 3 4 5 6 7 8 9 10 11 | 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所示,
1 | function test_model_func( dbnames, LBFRegModel ) |
执行test_3000fps.m文件即可完成测试过程.
9.测试结果的显示;
将测试文件改写为如下,其中文件路径和名称可按照自己的想法进行设置;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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文件;
1 | function [predshapes, Data] = test_model_func( dbnames, LBFRegModel ) |
2)test_model_func.m文件中调用globalprediction函数部分的输出格式作出一些修改;
1 | [Data, predshapes] = globalprediction(binfeatures, Ws{ min (s, params.max_numstage)}, Data, Param, min (s, params.max_numstage)); |
3)修改globalprediction.m文件的函数头;
1 2 | %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.大牛博客
完
心正意诚,做自己该做的事情,做自己喜欢做的事情,安静做一枚有思想的技术媛。
版权声明,转载请注明出处:https://www.cnblogs.com/happyamyhope/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】