(学习笔记)第六章 非刚性人脸跟踪——Face tracking(人脸跟踪)

来源:互联网 发布:网络运营岗位的测试题 编辑:程序博客网 时间:2024/06/10 05:30

(学习笔记)第六章 非刚性人脸跟踪——Face tracking(人脸跟踪)


转载请注明:http://blog.csdn.net/raby_gyl/article/details/14452471



人脸跟踪


人脸跟踪问题可以被认为是,寻找一个有效和鲁棒性的方式,采用面部特征所表现的几何依赖性来组合得到各种面部特征的独立的人脸检测器,进而得到视频序列中每一个图像面部特征位置的精确估计。带有这种想法,几何依赖性是否总是必须的值得考虑。在接下来的图形中,展示了带有几何约束和不带几何约束检测到的人脸面部特征结果。这些结果清晰地表明捕获面部特征之间的空间交互依赖性是有好处的。这两种方法的相对性能是典型的,凭借严格的依赖检测将导致过度地噪声。产生这种情况的原因是每一个面部特征的响应图并不能总是在正确的位置达到峰值。无论是由于图像噪声,光线变化或者表情变化,克服面部特征检测器的局限性的唯一方法是平衡几何关系,面部特征之间相互分享。



用来组合面部几何到人脸跟踪过程的一个特别简单,但又惊人的有效的方式是将特征检测的输出投影到线性形状模型的子空间。这相当于最小化原始点集和位于子空间的与它最接近的形状之间的距离。因此,当特征检测中的空间噪声接近于高斯分布时,投影产生最大可能的解决。在实践中,检测误差的分布并不遵循高斯分布并且需要引进额外的机制来说明这个。


人脸跟踪器的实现


人脸跟踪算法的一个实现可以在face_tracker类中找到(参见face_tracker.cppface_tracker.hpp)。下面的代码是该类的一个片段头用来强调它的基本功能:

class face_tracker{public:bool tracking; //are we in tracking mode?//是否在跟踪模式?fps_timer timer; //frames/second timer//帧/秒计时器vector<Point2f> points; //current tracked points//当前跟踪的点集face_detector detector; //detector for initialisation//用来初始化的检测器shape_model smodel; //shape model//形状模型patch_models pmodel; //feature detectors//特征检测器face_tracker(){tracking = false;}int //0 = failuretrack(const Mat &im, //image containing face//包含人脸的图像const face_tracker_params &p = //fitting parameters//配置参数face_tracker_params()); //default tracking parameters//默认跟踪参数voidreset(){ //reset tracker//重置跟踪器tracking = false; timer.reset();}...protected:...vector<Point2f> //points for fitted face in image//点集,用来适配图像中的人脸fit(const Mat &image,//image containing face//包含人脸的图像const vector<Point2f> &init, //initial point estimates//初始化点集估计const Size ssize = Size(21,21),//search region size//搜索区域的大小const bool robust = false, //use robust fitting?//是否使用鲁棒性的配置const int itol = 10, //maximum number of iterations//最大的迭代次数const float ftol = 1e-3); //convergence tolerance//收敛公差};


该类含有共有成员:shape_model.patch_models,face_detector类的实例。该类使用这三个类的功能来作用于跟踪。timer变量是fps_timer类的一个实例,该类保持帧率的跟踪(face_tracker::track函数中称之为帧率)并且对于分析块和形状模型参数在算法的计算复杂度上的影响是有用的。tracking成员变量是一个标志,用来指示跟踪过程的当前状态。当这个标志设置为false时,由于它在构造函数和face_tracker::reset函数中,凭借face_detector::detect函数应用到下一个到来的图像,跟踪器进入检测模型以初始化模型。当在人脸跟踪模式时,用来推断下一个到来图像的面部特征位置的初始化估计是简单的前一帧的位置。完整的跟踪算法简单地实现如下:

int face_tracker::track(const Mat &im,const face_tracker_params &p){Mat gray; //convert image to grayscale//转换图像到灰度图像if(im.channels()==1)gray=im;else cvtColor(im,gray,CV_RGB2GRAY);if(!tracking) //initializepoints = detector.detect(gray,p.scaleFactor,p.minNeighbours,p.minSize);if((int)points.size() != smodel.npts())return 0;for(int level = 0; level < int(p.ssize.size()); level++)points = this->fit(gray,points,p.ssize[level],p.robust,p.itol,p.ftol);tracking = true; timer.increment(); return 1;}

不同于统计操作,例如设置合适的跟踪状态和递增跟踪的时间,跟踪算法的核心是多层次的配置过程,这在前面的代码片段中强调了。配置算法的实现在face_tracker::fit函数中,该函数多次应用于存储在face_tracker_params::size的不同的搜索窗口大小,这里先前阶段的输出被用作下一阶段的输入。在最简单的设置中,face_tracker_params::ssize函数在图像中当前形状的估计周围执行面部特征检测。

smodel.calc_params(init);vector<Point2f> pts = smodel.calc_shape();vector<Point2f> peaks = pmodel.calc_peaks(image,pts,ssize);

同样投影结果到面部形状的子空间

smodel.calc_params(peaks); pts = smodel.calc_shape();

为了说明面部特征检测位置中的异常信号,通过设置robust的标志为true,一个鲁棒性的模型的配置过程可以被用来代替简单的投影。然而,在实践中,当用一个逐渐下降的搜索窗口大小(也就是说,随着face_tracker_params::size的设置)。这通常是没有必要的,因为典型地,异常依然远离投影形状中与之相应的点,并且可能位于配置过程的下一个水平的搜索区域的外围。因此,搜索区域大小减少的比例充当递增的异常抑制方案。


训练和可视化


不像本章描述的其他类,训练一个face_tracker跟踪对象不涉及到任何学习过程。它简单地实现于train_face_tracker.cpp,如下:

face_tracker tracker;tracker.smodel = load_ft<shape_model>(argv[1]);tracker.pmodel = load_ft<patch_models>(argv[2]);tracker.detector = load_ft<face_detector>(argv[3]);save_ft<face_tracker>(argv[4],tracker);

这里的argv[1]argv[4]分别是shape_model,patch_modelface_detectorface_trakcer对象的路径。人脸跟踪器的可视化在visualize_face_tracker.cpp中,也同样的简单。通过cv::VideoCapture 类从相机或者视频文件获取输入图像流,程序执行简单的循环直到流结束或者用户按Q键,跟踪每一个输入的帧。同样,用户在任何时候可选地按D键来重置跟踪器。



一般模型VS特定人模型


对于一个给定的应用,可以通过调整训练和跟踪过程的一些变量来最优化性能。然而,跟踪质量的一个基本的决定性因素是跟踪器必须模型化的形状和表现的范围。例如一个相关的例子,考虑一般的和特定人的情况。一般性的模型使用来至多个身份,表情,光照情况,和其他可变性来源来训练。与此相反,特定人模型特别地针对单一的个体进行训练。那么它需要说明的可变性的数量将很少。结果,在很大程度上,特定的跟踪通常比一般的跟踪有更好的精确性。



这方面的阐述在下面的图像展示。这里一般性的模型使用MUCT数据集训练。指定人的模型使用在本章先前描述的标记工具产生的数据来学习。结果清晰地表明特定人模型在捕捉复杂表情和头部姿势的变化的能力的跟踪效果更好。然而,一般性的模型甚至对于一些更简单的表情表现的比较吃力。



需要注意的是:本章描述的人脸跟踪方法是一个基础方法,该方法可用于大多数的非刚性人脸跟踪算法中强调各种成分。许多方法可以补救这个方法的缺点,超出了本章的范围并且需要专门的数学工具,这些数学工具目前OpenCV的功能还不支持。相比较,可利用的少量的商业级人脸跟踪软件包在一般的设置中可以证明这个问题的难度。尽管如此,本章描述的简单的方法在受约束的设置环境下工作的非常好。


 

总结:

在本章,我们仅使用适度的数学工具和大量的OpenCV基本的图像处理功能以及线性代数操作,建立了一个简单的人脸跟踪器,在约束的环境中,可以合理的工作。这个简单的人脸跟踪器可以通过在跟踪器的三个成分中应用更复杂的技术来完成改善,跟踪器的三个成分是:形状模型,特征检测器,和配置算法。在本部分描述的人脸跟踪器的模块化设计应当允许这三个成分的修改,但不能实质性的破坏其他功能。



References


•  Procrustes Problems, Gower, John C. and Dijksterhuis, Garmt B, Oxford University 
Press, 2004.

0 0
原创粉丝点击