非刚性人脸跟踪

2019-09-01 18:37

第六章:非刚性人脸跟踪

非刚性人脸跟踪,是视频流的每一帧的面部特征的准密度的估计,也是一个困难的问题,因为现代方法从很多相关领域借鉴了思想,相关领域包括:计算机视觉,计算几何学,机器学习,和图像处理。这里的非刚性涉及到面部特征在面部表情交叉式的变化的相关距离。并且区别于人脸检测和跟踪,人机检测和跟踪的目的仅是在每一帧图像中找到人脸的位置,而不是面部特征的结构。非刚性人脸跟踪是一个流行的研究热点,已经进行了20年之久,但是仅在不久之前,各种各样的方法开始变的足够的鲁棒性,并且处理足够快,这奠定了可能商业化应用的基础。

尽管商业级人脸跟踪可能高度复杂并且甚至对经验丰富的计算机视觉科学家提出了一个挑战。在这一章我们将看到一个人脸跟踪器,在约束的环境下运行的相当的好,该环境的设计使用了适中的数学工具和OpenCV大量的功能,例如线性代数,图像处理和可视化。这是特征的情况下,当被跟踪的人事先已知并且用图像作为训练数据,标记注释是可用的。今后描述的技术将作为一个有用的起点和进一步追求更复杂人脸跟踪系统的向导。

本章概要如下:

1、复习:这个部分涉及到简短的人脸跟踪历史。

2、有用的东西:这部分概述了本章使用的普通结构和规矩。它包括面向对象设计,数据存储和表示以及数据收集和注释的工具。

3、几何限制:这一部分描述表面几何和它的变化是如何从学习训练数据和在跟踪中如何利用来限制解决的。这涉及到把人脸模型作为一个线性形状模型和全面的转换是如何统一到它的表现的。

4、人脸特征检测器:这部分描述怎样学习面部特征的外观,以用来在将要跟踪的人脸图像中检测他们。

5、人脸检测和初始化:这一步讲述如何使用人脸建仓期来初始化跟踪过程。

6、人脸跟踪:这一部分通过图像队列的处理来组合先前描述的所有成分到一个跟踪系统。讨论了一个好的系统能够运行的环境。

下面的块状图表阐述了系统不同成分之间的关系:

注释:

注意本章使用的方法遵循一个数据驱动的范例,所用使用的模型都是从数据学得,而不是基于一定的规则环境而手工设计的。本身,系统的每个成分将要包含两个要素:训练和测试。训练是从数据中建立模型,测试将这些模型应用到未知的数据。

回顾:

非刚性人脸跟踪首先流行于的90年代中期,伴随着 Cootes 和 Taylor的ASM的出现。从那时起,大量的研究投身于解决基于ASM提出的原始方法的改进的类人脸跟踪的困难问题。 第一个里程碑是在2001年,Coote和Taylor将ASM扩展到AAM。这个方法后来被正式化了,虽然在世纪中叶Baker和学院进行了图像扭曲的原则性处理。沿着这些方向的另外一向工作是Blanz和Vetter进行的3DMM。不光模拟图像纹理,反对像ASM中的沿着轮廓的边缘,而且进一步通过使用从激光扫描人脸学习的高密度3D数据来表示模型。从中期到20世纪末,人脸跟踪研究的焦点从如何人脸参数化转向了如何跟踪算法任务的提出和最优化。 来至机器学习社区的各种各种的技术以不同的成功程度被应用到。自从世纪交替时,焦点再一次转移,这次转向了联合参数和目标设计策略,即保证全局的解决。

尽管不断的强烈的研究进入到人脸跟踪,然而相比较有很少的商业应用使用到它。尽管对于许多一般方法有许多可以免费利用源代码包,对嗜好者和热情者举起(发扬)仍然是一个滞后。尽管如此,在过去的两年,在公众领域的人脸跟踪的潜在使用兴趣的复兴,并且商业级的产品也开始出现。

有用的东西

在投入人脸跟踪这个复杂的事物之前,许多标记任务和约定通常所有的人脸跟踪方法必须首先被介绍。这部分剩下的是处理这些问题。一个感兴趣的读者可能希望首先跳过这个部分的

阅读并且直接到几何限制部分。

面向对象设计

正如人脸检测和人脸识别,计划性地,人脸跟踪有两个要素组成:数据和算法。算法通常通过参考存储数据(即离线)作向导来对输入的数据(即在线)执行某中操作。例如,一个将算法和他们依靠的数据连接在一起的面向对象设计是一个方便的设计选择。

在OpenCV v2.x,一个方便的XML/YAML文件存储类被引进,极大的简化了为算法使用组织离线数据的任务。为了利用特征,本章描述的所有类将实现读、写序列化功能。用一个假象的类foo作为一个例子,如下: #include using namesapce cv; class foo {

public: Mat a; type_b b;

void write(FileStorgae &fs) const {assert(fs.isOpened()); fs<<”{“<<”a”<

assert(node.type()==FileNode::MAP); node[“a”]>>a,node[“b”]>>b; } };

这里,Mat是OpenCV的矩阵类,type_b是一个用户定义的类,对它同样定义了序列化的功能。I/O函数read和writer现实序列化。FileStorage类支持两个类型数据结构的序列化。为了简化,本章所有的类将只利用映射,即每一个存储变量创造一个类型为FileNode::Map类型的FileNode对象。这里需要唯一的键分配到每一个元素。尽管这个键的选择是随意的,因为前后一致,我们将使用变量的名字作为标签。像先前阐述的代码小片段,read和write功能呈现一个特别简单的形式,通过使用流操作符(<>)来插入数据到FileStorage对象和从FileStorage对象中提取数据。大部分OpenCV类有read和write功能的实现,允许他们轻松的处理包含的存储的数据。

除定义序列化功能之外,我们还必须在FileStorage类中为序列化定义两个附加的功能来工作,如下:

void writer(FileStorage &fs,const string &,const foo&x) {

x.wirter(fs); }

void read(const FileNode &node,foo& x,const foo&default) {

if(node.empty()) x=d;else x.read(node);

}

同时本部分描述的所有类中,这两个函数的功能是保持一样的,他们模版化和定义在ft.hpp头文件内,可以在附属于本章的源代码中找到。最后,为了简单地保存和导入用户定义的类,利用序列化功能,模版化的函数同样在头文件中实现,如下: template T load_ft(const char *fname) { T x;

FileStorage f(fname,FileStorage::READ); f[“ft object”]>>x,f.release();return x; }

template void save_ft(const char *fname,const T&x) {

FileStorage f(fname,FileStorage::WRITE); f<<”ft object”<

注意和对象一起的标签总是一样的(即,ft object)。采用这些定义的函数,保存和导入对象数据是一个轻松的过程。通过下面的例子展示: #include “opencv_hotshots/ft/ft.hpp” #incldue “foo.hpp” int main() { ..... foo A;

save_ft(“fool.xml”,A); foo B=load_ft(“foo.xml”); .... }

注意.xm扩展名表示采用XML_格式化数据文件,对于任何其他的扩展名默认采用YAML格式。

数据收集:图像和视频的注释

现在的人脸跟踪技术几乎完全是数据驱动的,即,算法通常依靠人脸面部特征外观和从一系列例子得到的他们的相对位置的几何依赖性形成的模型,来检测图像中面部特征的位置。更大的样本集,算法表现更好的鲁棒性,因为他们能够更好的意识到人脸可以表现的变化性的全局性。因此,建立人脸跟踪算法的第一步是创建一个图像/视频注释工具,用户可以通过该工具指定每一个样本图像中希望得到的面部特征的位置。

训练数据类型

用来训练人脸跟踪算法的数据一般由四个成分组成:

1、图像:这个成分是一个包含全部人脸的图像集(静的图像或者视频帧)。为了得到最好的效果,这个集应当详细说明环境的类型(即,统一性,光照,到相机的距离,捕捉设备,以及其他),跟踪器过会在该环境中展开进行。集合中的人脸呈现我们应用所期望的头部姿势和面部表情也是重要的。

2、注释:这个成分调整每一个图像的手动标记,以使相应的每一个人脸特征被跟踪。 更多的人脸特征经常导致更好的鲁棒性的跟踪器,因为跟踪算法可以是使用这些度量来加固彼此。普通的跟踪算法在计算上的花费典型地与人脸特征的数量成线性关系。

3、对称目录:这个成分有每个面部特征点的索引,这个成分定义 了它的双边地对称特征。这可以用来镜像训练图像,有效的双倍训练集大小和使数据沿着y轴对称。

4、连通性目录:这个成分包含一个注释对的索引集,用来定义面部特征的语义的解释。这些连接多可视化跟踪结果是有用的。

下面的图像是四个成分可视化的一个展示,从左到右分别是,原始图像,面部特征注释,彩色编码双边对称点,镜像图像,和注释和人脸特征联通。

为了更方便地使用这些数据,用一个类来实现存储和访问的功能是非常有用的。OpenCV的ml模块中的CvMLData类处理一般数据的功能,通常用于机器学习问题。然而,它缺少访问人脸跟踪数据的功能。同样地,在这章,我们将使用ft_data类,该类声明在ft_data.hpp头文件中,专门为记住人脸跟踪数据的特性而设计的。所有的数据成员定义为类的public成员,如下: class ft_data{ public:

vector symmetry; vector connections; vector imnames;

vector > points; … }

Vec2i和Point2f类型是OpenCV的类,分别为两个整形的容器和2D浮点型坐标。对称的容器拥有和人脸特征点(同样地是用户定义)一样多的成分。每一个connections定义为连通的面部表情的基于0的索引对(以0开始)。因为训练集可能很大,而不是直接的存储图像,这个类通过imnames成员变量来存储每一个图像的文件名(注意为了是文件名有效,我们需要将图像放在同样的相对位置)。最终,对于每一个训练的图像,面部特征位置的集合被作为一个浮点型坐标的容器存储,用points成员变量表示。


非刚性人脸跟踪.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:东北师范大学《算法分析与设计》18秋在线作业1

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: