第6章 非剛性人臉跟蹤(共37頁)_第1頁
第6章 非剛性人臉跟蹤(共37頁)_第2頁
第6章 非剛性人臉跟蹤(共37頁)_第3頁
第6章 非剛性人臉跟蹤(共37頁)_第4頁
第6章 非剛性人臉跟蹤(共37頁)_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、:非剛性(n xn)人臉跟蹤非剛性人臉跟蹤,是視頻流的每一幀的面部特征的準(zhǔn)密度的估計,也是一個困難的問題,因為(yn wi)現(xiàn)代方法從很多相關(guān)領(lǐng)域借鑒了思想,相關(guān)領(lǐng)域包括:計算機視覺,計算幾何學(xué),機器學(xué)習(xí),和圖像處理。這里的非剛性涉及到面部特征在面部表情交叉式的變化的相關(guān)距離。并且區(qū)別于人臉檢測和跟蹤,人機檢測和跟蹤的目的僅是在每一幀圖像中找到人臉的位置,而不是面部特征的結(jié)構(gòu)。非剛性人臉跟蹤是一個流行的研究熱點,已經(jīng)進(jìn)行了20年之久,但是僅在不久之前,各種各樣的方法開始變的足夠的魯棒性,并且處理足夠快,這奠定了可能商業(yè)化應(yīng)用的基礎(chǔ)。盡管商業(yè)級人臉跟蹤可能高度復(fù)雜并且甚至對經(jīng)驗豐富的計算機視覺科

2、學(xué)家提出了一個挑戰(zhàn)。在這一章我們將看到一個人臉跟蹤器,在約束(yush)的環(huán)境下運行的相當(dāng)?shù)暮?,該環(huán)境的設(shè)計使用了適中的數(shù)學(xué)工具和OpenCV大量的功能,例如線性代數(shù),圖像處理和可視化。這是特征的情況下,當(dāng)被跟蹤的人事先已知并且用圖像作為訓(xùn)練數(shù)據(jù),標(biāo)記注釋是可用的。今后描述的技術(shù)將作為一個有用的起點和進(jìn)一步追求更復(fù)雜人臉跟蹤系統(tǒng)的向?qū)?。本章概要如下:?fù)習(xí):這個部分涉及到簡短的人臉跟蹤歷史。有用的東西:這部分概述了本章使用的普通結(jié)構(gòu)和規(guī)矩。它包括面向?qū)ο笤O(shè)計,數(shù)據(jù)存儲和表示以及數(shù)據(jù)收集和注釋的工具。幾何限制:這一部分描述表面幾何和它的變化是如何從學(xué)習(xí)訓(xùn)練數(shù)據(jù)和在跟蹤中如何利用來限制解決的。這涉及

3、到把人臉模型作為一個線性形狀模型和全面的轉(zhuǎn)換是如何統(tǒng)一到它的表現(xiàn)的。人臉特征檢測器:這部分描述怎樣學(xué)習(xí)面部特征的外觀,以用來在將要跟蹤的人臉圖像中檢測他們。人臉檢測和初始化:這一步講述如何使用人臉建倉期來初始化跟蹤過程。人臉跟蹤:這一部分通過圖像隊列的處理來組合先前描述的所有成分到一個跟蹤系統(tǒng)。討論了一個好的系統(tǒng)能夠運行的環(huán)境。下面的塊狀圖表闡述了系統(tǒng)不同成分之間的關(guān)系:注釋(zhsh):注意本章使用的方法遵循一個數(shù)據(jù)驅(qū)動的范例,所用使用的模型都是從數(shù)據(jù)學(xué)得,而不是基于一定的規(guī)則環(huán)境而手工設(shè)計的。本身,系統(tǒng)的每個成分將要包含兩個要素:訓(xùn)練(xnlin)和測試。訓(xùn)練是從數(shù)據(jù)中建立模型,測試將這些

4、模型應(yīng)用到未知的數(shù)據(jù)?;仡?hug):非剛性人臉跟蹤首先流行于的90年代中期,伴隨著 Cootes 和 Taylor的ASM的出現(xiàn)。從那時起,大量的研究投身于解決基于ASM提出的原始方法的改進(jìn)的類人臉跟蹤的困難問題。第一個里程碑是在2001年,Coote和Taylor將ASM擴展到AAM。這個方法后來被正式化了,雖然在世紀(jì)中葉Baker和學(xué)院進(jìn)行了圖像扭曲的原則性處理。沿著這些方向的另外一向工作是Blanz和Vetter進(jìn)行的3DMM。不光模擬圖像紋理,反對像ASM中的沿著輪廓的邊緣,而且進(jìn)一步通過使用從激光掃描人臉學(xué)習(xí)的高密度3D數(shù)據(jù)來表示模型。從中期到20世紀(jì)末,人臉跟蹤研究的焦點從如何人

5、臉參數(shù)化轉(zhuǎn)向了如何跟蹤算法任務(wù)的提出和最優(yōu)化。來至機器學(xué)習(xí)社區(qū)的各種各種的技術(shù)以不同的成功程度被應(yīng)用到。自從世紀(jì)交替時,焦點再一次轉(zhuǎn)移,這次轉(zhuǎn)向了聯(lián)合參數(shù)和目標(biāo)設(shè)計策略,即保證全局的解決。盡管不斷的強烈的研究進(jìn)入到人臉跟蹤,然而相比較有很少的商業(yè)應(yīng)用使用到它。盡管對于許多一般方法有許多可以免費利用源代碼包,對嗜好者和熱情者舉起(發(fā)揚)仍然是一個滯后。盡管如此,在過去的兩年,在公眾領(lǐng)域的人臉跟蹤的潛在使用興趣的復(fù)興,并且商業(yè)級的產(chǎn)品也開始出現(xiàn)。有用(yu yn)的東西在投入人臉跟蹤這個復(fù)雜的事物之前,許多標(biāo)記任務(wù)和約定(yudng)通常所有的人臉跟蹤方法必須首先被介紹。這部分剩下的是處理這些問題

6、。一個感興趣的讀者可能希望首先跳過這個部分的閱讀并且直接到幾何限制部分。面向?qū)ο笤O(shè)計(shj)正如人臉檢測和人臉識別,計劃性地,人臉跟蹤有兩個要素組成:數(shù)據(jù)和算法。算法通常通過參考存儲數(shù)據(jù)(即離線)作向?qū)韺斎氲臄?shù)據(jù)(即在線)執(zhí)行某中操作。例如,一個將算法和他們依靠的數(shù)據(jù)連接在一起的面向?qū)ο笤O(shè)計是一個方便的設(shè)計選擇。在OpenCV v2.x,一個方便的XML/YAML文件存儲類被引進(jìn),極大的簡化了為算法使用組織離線數(shù)據(jù)的任務(wù)。為了利用特征,本章描述的所有類將實現(xiàn)讀、寫序列化功能。用一個假象的類foo作為一個例子,如下:#include using namesapce cv;class foo

7、 public: Mat a;type_b b;void write(FileStorgae &fs) const assert(fs.isOpened();fs”“”a”a”b”ba,node“b”b;這里,Mat是OpenCV的矩陣類,type_b是一個用戶定義的類,對它同樣定義了序列化的功能。I/O函數(shù)read和writer現(xiàn)實序列化。FileStorage類支持兩個類型數(shù)據(jù)結(jié)構(gòu)的序列化。為了簡化,本章所有的類將只利用映射,即每一個存儲變量創(chuàng)造一個類型為FileNode:Map類型的FileNode對象。這里需要唯一的鍵分配到每一個元素。盡管這個鍵的選擇是隨意的,因為前后一致,我們將使用

8、變量的名字作為標(biāo)簽。像先前闡述的代碼小片段,read和write功能呈現(xiàn)一個特別簡單的形式,通過使用流操作符()來插入數(shù)據(jù)到FileStorage對象和從FileStorage對象中提取數(shù)據(jù)。大部分OpenCV類有read和write功能的實現(xiàn),允許他們輕松的處理包含的存儲的數(shù)據(jù)。除定義序列化功能之外,我們還必須在FileStorage類中為序列化定義兩個附加的功能來工作,如下:void writer(FileStorage &fs,const string &,const foo&x) x.wirter(fs);void read(const FileNode &node,foo& x,co

9、nst foo&default) if(node.empty() x=d;else x.read(node);同時本部分描述的所有類中,這兩個函數(shù)的功能是保持一樣的,他們模版化和定義在ft.hpp頭文件內(nèi),可以在附屬于本章的源代碼中找到。最后,為了簡單地保存(bocn)和導(dǎo)入用戶定義的類,利用序列化功能,模版化的函數(shù)同樣在頭文件中實現(xiàn),如下:template T load_ft(const char *fname)T x;FileStorage f(fname,FileStorage:READ);f“ft object”x,f.release();return x;template void

10、save_ft(const char *fname,const T&x) FileStorage f(fname,FileStorage:WRITE);f”ft object”x;f.release();注意和對象一起的標(biāo)簽總是一樣的(即,ft object)。采用這些定義(dngy)的函數(shù),保存和導(dǎo)入對象數(shù)據(jù)是一個輕松的過程。通過下面的例子展示:#include “opencv_hotshots/ft/ft.hpp”#incldue “foo.hpp”int main().foo A;save_ft(“fool.xml”,A);foo B=load_ft(“foo.xml”);.注意(zh

11、y).xm擴展名表示采用XML_格式化數(shù)據(jù)文件,對于任何其他的擴展名默認(rèn)采用YAML格式。數(shù)據(jù)收集:圖像(t xin)和視頻的注釋現(xiàn)在的人臉跟蹤技術(shù)幾乎完全是數(shù)據(jù)驅(qū)動的,即,算法通常依靠人臉面部特征外觀和從一系列例子得到的他們的相對位置的幾何依賴性形成的模型,來檢測圖像中面部特征的位置。更大的樣本集,算法表現(xiàn)更好的魯棒性,因為他們能夠更好的意識到人臉可以表現(xiàn)的變化性的全局性。因此,建立人臉跟蹤算法的第一步是創(chuàng)建一個圖像/視頻(shpn)注釋工具,用戶可以通過該工具指定每一個樣本圖像中希望得到的面部特征的位置。訓(xùn)練(xnlin)數(shù)據(jù)類型用來訓(xùn)練人臉跟蹤算法的數(shù)據(jù)一般由四個成分組成:圖像:這個成分

12、是一個包含全部人臉的圖像集(靜的圖像或者視頻幀)。為了得到最好的效果,這個集應(yīng)當(dāng)詳細(xì)說明環(huán)境的類型(即,統(tǒng)一性,光照,到相機的距離,捕捉設(shè)備,以及其他),跟蹤器過會在該環(huán)境中展開進(jìn)行。集合中的人臉呈現(xiàn)我們應(yīng)用所期望的頭部姿勢和面部表情也是重要的。注釋:這個成分調(diào)整每一個圖像的手動標(biāo)記,以使相應(yīng)的每一個人臉特征被跟蹤。更多的人臉特征經(jīng)常導(dǎo)致更好的魯棒性的跟蹤器,因為跟蹤算法可以是使用這些度量來加固彼此。普通的跟蹤算法在計算上的花費典型地與人臉特征的數(shù)量成線性關(guān)系。3、對稱目錄:這個成分有每個面部特征點的索引,這個成分定義 了它的雙邊地對稱特征。這可以用來鏡像訓(xùn)練圖像,有效的雙倍訓(xùn)練集大小和使數(shù)據(jù)

13、沿著y軸對稱。4、連通性目錄:這個成分包含一個注釋對的索引集,用來定義面部特征的語義的解釋。這些連接多可視化跟蹤結(jié)果是有用的。下面的圖像是四個成分可視化的一個展示,從左到右分別是,原始圖像,面部特征注釋,彩色編碼雙邊對稱點,鏡像圖像,和注釋和人臉特征聯(lián)通。為了更方便地使用這些數(shù)據(jù),用一個類來實現(xiàn)存儲和訪問的功能是非常有用的。OpenCV的ml模塊中的CvMLData類處理一般數(shù)據(jù)的功能,通常用于機器學(xué)習(xí)問題。然而,它缺少訪問人臉跟蹤數(shù)據(jù)的功能。同樣地,在這章,我們將使用ft_data類,該類聲明在ft_data.hpp頭文件中,專門為記住人臉跟蹤數(shù)據(jù)的特性而設(shè)計的。所有的數(shù)據(jù)成員定義為類的pu

14、blic成員,如下:class ft_datapublic:vector symmetry;vector connections;vector imnames;vectorvector points;Vec2i和Point2f類型是OpenCV的類,分別為兩個整形的容器和2D浮點型坐標(biāo)。對稱的容器擁有和人臉特征點(同樣地是用戶定義)一樣多的成分。每一個connections定義為連通的面部表情(bioqng)的基于0的索引對(以0開始)。因為訓(xùn)練集可能很大,而不是直接的存儲圖像,這個類通過imnames成員變量來存儲每一個圖像的文件名(注意為了是文件名有效,我們需要將圖像放在同樣的相對位置)。

15、最終,對于每一個訓(xùn)練的圖像,面部特征位置的集合被作為一個浮點型坐標(biāo)的容器存儲,用points成員變量表示。ft_data類實現(xiàn)了很多便利的方法用來訪問(fngwn)數(shù)據(jù)。為了在數(shù)據(jù)集中訪問每一個圖像,get_image函數(shù)通過指定的索引idx導(dǎo)入圖像,并且可選擇地圍繞y軸進(jìn)行鏡像圖像。如下:Mat ft_data:get_image(const int idx,const int flag) /const int idx;/圖像(t xin)的索引用來從文件導(dǎo)入 /const int flag;/0=gray,1=gray+flip,2=rgb,3=rgb+flip;/flip鏡像翻轉(zhuǎn) Mat

16、 img,im;if(flag2) img=imread(imnamesidx,0);esle img=imread(imnamesidx,1);if(flag%2!=0) flip(img,im,1);else im=img;return im;將(0,1)標(biāo)志傳遞給OpenCV的imread函數(shù)用來指按3通道彩色圖像的形式的導(dǎo)入還是按單通道灰色圖像導(dǎo)入。標(biāo)志位傳遞給OpenCV的flip函數(shù)用來指定繞在y軸進(jìn)行鏡像。為了用特殊的索引訪問對應(yīng)與圖像的點集,get_points函數(shù)一個存儲浮點型坐標(biāo)的容器,帶有可選的鏡像索引,如下:ft_data:get_points(cosnt int id

17、x,const bool flipped) /const int idx相應(yīng)點的圖像索引 /const bool flipped;是否將圖像繞在Y軸進(jìn)行旋轉(zhuǎn) if(idx=(int)imnames.size()return vector();/如果訪問的圖像不存在,返回空的容器vector p=pontsidx;if(flipped)Mat im=this-get_image(idx,0);int n=p.size();vector q(n);/初始化N個空的對象for(int i=0;in;i+)qi.x=im.cols-1-psymmertyi.x;/n為點的個數(shù)。qi.y=psymmet

18、ryi.y;return q;return p;注意當(dāng)指定了鏡像標(biāo)記時,這個函數(shù)調(diào)用get_image函數(shù)。這需要判斷圖像的寬度,以用來糾正鏡像人臉特征(tzhng)坐標(biāo)。一個更有效的設(shè)計是傳遞圖像的寬度作為一般變量。最后,在這個函數(shù)中symmerty成員變量的用法被闡述。一個特殊索引的鏡像特征位置僅僅是symmetry變量的索引指定的位置和它的x坐標(biāo)的翻轉(zhuǎn)和偏移。如果指定的索引在數(shù)據(jù)集中不存在,get_image和get_points函數(shù)均返回空的結(jié)構(gòu)體。同樣可能的是,并不是集合中的所有圖像都被注釋。人臉跟蹤算法可以設(shè)計來處理缺失的數(shù)據(jù),然而,這些實現(xiàn)通常相當(dāng)?shù)膹?fù)雜(fz)并且超出了本章的范

19、圍。ft_data函數(shù)實現(xiàn)了從集合中移除哪些沒有相應(yīng)注釋的樣本的功能,如下:void ft_data:rm_incomplete_samples()/rm =rremove int n=ponts0.size(),N=ponts.size();for(int i=0;iN;i+) n=max(n,int (pointsi.size();/n取圖像(t xin)集中點集最大的for(int i=0;iint(points.size();i+) if(int(pointsi.size()!=n) points.erase(points.begin()+i);imnames.erase(imname

20、s.begin()+i);i-;else int j=0;for(;jn;j+) if(pointsij.x=0|(pointsij.y=0) break;if(jn)points.erase(points.begin()+i);imnames.erase(imnames.begin()+i);i-;簡單的例子是,大多數(shù)量的注釋(zhsh)被假定為是權(quán)威的樣本。擁有點集少于許多數(shù)量的點的數(shù)據(jù)實例將采用容器的erase函數(shù)將其從集合中移除。同時也注意到帶有(x,y)坐標(biāo)小于0的點被認(rèn)為在其相應(yīng)的圖像上缺失(可能是由于遮擋,差的可見度,或者模糊性)。ft_data類實現(xiàn)序列化函數(shù)read和writ

21、e,并且因此(ync)可以簡單地存儲和導(dǎo)入。例如,保存一個數(shù)據(jù)集的簡單做法如下:ft_data D;/示例(shl)數(shù)據(jù)結(jié)構(gòu)./填充數(shù)據(jù)save_ft(“mydata.xml”,D);/保存數(shù)據(jù)為了可視化數(shù)據(jù)集,ft_data函數(shù)實現(xiàn)了一些畫圖功能。他們的用法在visualize_annotations.cpp文件中闡述。這個程序?qū)胗妹钚兄付ǖ奈募械淖⑨寯?shù)據(jù),移除不完全的樣本,并且顯示帶有相應(yīng)注釋的、對稱,連接疊加的訓(xùn)練圖像。OpenCv的highgui模塊的一些顯著的特征在這里示范。盡管相當(dāng)基本并且不適合復(fù)雜用戶接口。OpenCV的highgui模塊的功能在計算機視覺應(yīng)用中對于導(dǎo)入和可

22、視化數(shù)據(jù)和算法輸出非常有用。與其他的計算機視覺庫相比,這可能是Opencv的品質(zhì)。注釋工具:為了用本章的代碼產(chǎn)生注釋,一個基本的注釋工具可以在annotate.cpp文件中找到。這工具用視頻流或者文件或者相機作為輸入。使用這個工具的程序的四個步驟如下列出:捕捉圖像:在這第一步中,圖像流顯示在屏幕上,用戶通過按S鍵選擇圖像用來注釋。用來注釋的最好的特征集是哪些最大的跨度面部行為的范圍,這些面部行為是人臉跟蹤系統(tǒng)需要跟蹤的。注釋第一個圖像:在第二步中,將第一階段捕獲,選擇的圖像提供給用戶。然后用戶接著點擊圖像上需要跟蹤的附屬于面部特征的位置。注釋連通性:在第三步,為了更好的可視化一個模型,需要定義

23、點的連通性結(jié)構(gòu)。這里,提供給用戶先前階段同樣的圖像,現(xiàn)在的任務(wù)是點擊一些點對集,一個接一個的,用來為人臉模型建立連通結(jié)構(gòu)。注釋對稱性:在這一步,任然使用同樣的圖像,用戶選擇展現(xiàn)雙邊對稱性的點對。注釋剩下的圖像:在最后一步,這里的過程類似與步驟2,除此之外用戶可以瀏覽圖像集和異步地注釋他們。有興趣的讀者可能想通過改善他們的有用性來改善這些工具,或者甚至整合一個增加的學(xué)習(xí)過程,憑借一個跟蹤模型的更新,該更新通過每個增加的注釋的圖像和隨后的用來初始化的這些點來減少注釋的負(fù)擔(dān)。盡管一些公開地可以利用的數(shù)據(jù)(shj)集可以為本章開發(fā)的代碼利用。(例如接下來的描述)。注釋工具可以被用來建立指定人臉跟蹤模型

24、,通常該模型比一般的,單獨的人,相對應(yīng)的人執(zhí)行更好的結(jié)果。預(yù)注釋(zhsh)數(shù)據(jù)(MUCT數(shù)據(jù)集)開發(fā)人臉跟蹤系統(tǒng)的一個障礙因素是乏味的和易于出錯的手動地注釋大量圖片集的過程,這些圖像帶有大量的點。為了為本章接下來的工作的目的減輕這個過程,公開地可以利用(lyng)的MUCT數(shù)據(jù)集可以通過下面的連接下載: HYPERLINK http:/www/muct. http:/www/muct.數(shù)據(jù)集由3755個注有67個特征點人臉圖像組成。數(shù)據(jù)集的主題在年齡和種族,和許多不同光照環(huán)境和頭的姿勢情況下捕捉中變化。為了用本章的代碼使用MUCT數(shù)據(jù)集,執(zhí)行下面的步驟:下載數(shù)據(jù)集。在這一步,數(shù)據(jù)集中所用的圖

25、像可以通過下載文件muct-a-jpg-v1.tar.gz到muct-e-jpg-v1.tar.ga,并且解壓他們來獲得。這將產(chǎn)生包含所有圖像的新的文件夾。下載注釋:在這一步,下載文件包含注釋muct-landmarks-v1.tar.gz保存。解壓到和先圖片的同樣的文件夾呀。利用注釋工具定義連接和對稱:在這一步,來至命令行,發(fā)布命令 ./annotate -m $mdir -d $odir,這里$mdir指示MUCT數(shù)據(jù)集保存的路徑文件夾,$ofir指示annotaion.yaml文件夾,包含數(shù)據(jù)以ft_data對象的形式被寫入存儲。注釋:MUCT數(shù)據(jù)的使用促進(jìn)在本章對人臉跟蹤代碼功能描述有

26、一個快速的入門。幾何約束在人臉跟蹤,幾何引用了預(yù)定義點集的空間配置,這些點集對應(yīng)于人臉上物理連續(xù)位置。(例如眼角,鼻尖和眼毛邊緣)。這些點的特殊選擇是應(yīng)用依賴的,一些應(yīng)用需要超過100個點的稠密集,并且其他僅需要一個稀疏選擇。然而人臉跟蹤算法的的魯棒性通常伴隨著點數(shù)目的更加而改善,因為他們分開的測量值可以通過他們相關(guān)空間依賴性來增強彼此。例如,知道一個眼角的位置是對于期待鼻子在哪里定位是一個好的指示。然而通過增加點的數(shù)目來獲得魯棒性的改善是有限制的,典型地100個點之后性能停滯。而且,增加用來描述人臉的點集帶有計算復(fù)雜度的線性增加。因此,帶有計算負(fù)載嚴(yán)格限制的應(yīng)用可能帶有更少的點集進(jìn)展的更好。

27、同樣也有這樣的情況,在在線環(huán)境下更快的跟蹤經(jīng)常導(dǎo)致更精確的跟蹤。這是因為,當(dāng)幀被拋棄時,兩幀之間的增加察覺到的運動,以及用來在每一幀圖像上尋找人臉配置的最優(yōu)算法必須搜索可能的特征點配置的更大的空間。當(dāng)兩個幀之間的位移變大時,這個過程經(jīng)常失敗。總的來說,盡管怎樣最好的設(shè)計面部特征帶你的選擇有一個一般的指導(dǎo)方針,為了得到最優(yōu)的性能,這一章應(yīng)當(dāng)專業(yè)到應(yīng)用領(lǐng)域。面部幾何通常參數(shù)化為兩個元素的組成:一個全局(剛性)轉(zhuǎn)換和一般局部(非剛性)變形。全局轉(zhuǎn)換解釋為圖像中人臉的整體布局,通常允許沒有約束的改變(即,人臉可以在圖像上的任何地方顯示)。這包括每張圖像人臉的x,y坐標(biāo),面內(nèi)頭部旋轉(zhuǎn),和圖像中人臉的大小

28、(dxio)。另一方面,局部變形解釋為面部形狀交叉身份之間的不同和表情之間的不同。與全局轉(zhuǎn)換相對照,這些局部變形通常有更多的限制,約束,主要是由于人臉特征的更高地結(jié)構(gòu)化參數(shù)。全局轉(zhuǎn)換(zhunhun)是2D坐標(biāo) 的一般功能,適用于任何類型的對象,然而局部變形是特定對象并且必須從訓(xùn)練集中學(xué)習(xí)。在這一部分,我們描述面部結(jié)構(gòu)幾何模型的構(gòu)造,因此成為形狀模型。取決于應(yīng)用,它可以捕捉單個個體的表情變化,和交叉不同的人臉形狀或者兩者的混合。這個模型用shape_model類實現(xiàn),可以在shape_model.hpp和shape_mode.cpp文件中找到。下面的代碼(di m)片段是shape_model

29、類的頭的一部分,用來說明它的基本的功能。class shape_model/2d線性模型public:Mat p;/參數(shù)矢量k*1 CV_32FMat V;/線性子空間(2n*k) CV_32FMat e;/參數(shù)變化(k*1) CV_32FMat C;/連通性(c*2) CV_32S.void calc_params(const vector&pts;/用來計算參數(shù)的點const Mat &weight=Mat() /weight/point N*1 CV_32Fconst float c_factor=3.0)/clamping factor夾因素.vector /用參數(shù)描述的形狀calc_

30、shape();.void train(const vectorvector &p,/N個樣本形狀const vector &con=vector()/連通性const float frac=0.95;/用來保留的變化的分?jǐn)?shù)const int kmax=10)/用來保留的模型的最大數(shù)量.用人臉的形狀代表變化的模型用子空間矩陣V和方差e進(jìn)行編碼。參數(shù)矢量P存儲表示模型的形狀的編碼。連通性矩陣C同時也存儲在這個類,因為它僅術(shù)語人臉形狀的可視化示例。在這個類中基礎(chǔ)興趣的三個函數(shù)是calc_params,calc_shape,和train。calc_params函數(shù)投影一個點集到似乎可信的人臉形狀的空

31、間。calc_shape函數(shù)通過使用人臉模型(用v和e編碼)解碼參數(shù)矢量p來產(chǎn)生一個點集。train函數(shù)用人臉形狀數(shù)據(jù)集學(xué)習(xí)編碼模型,每一個模型由同樣數(shù)量的點組成。參數(shù)frac和kmax是訓(xùn)練過程的參數(shù),可以為眼前的數(shù)據(jù)特化該參數(shù)。這個類的功能將在接下來的部分進(jìn)行詳細(xì)的描述,那里我們通過Procrustes分析開始,它是用來嚴(yán)格地登記一個點集的方法。接下來通過用通常代表局部變形的線性模型。train_shape_model.cpp和visulize_shape_model.cpp文件中的程序分別的訓(xùn)練和可視化模型。他們的使用(shyng)將在本部分的結(jié)束進(jìn)行概括。Procrustes分析(fn

32、x)為了建立人臉形狀的一個變化模型,我們首先必須處理為加工注釋的數(shù)據(jù)(shj)來移除附屬于全局剛性的運動的成分。當(dāng)我們用2D模型化幾何時,一個剛性的運動通常代表為一個類似的轉(zhuǎn)換。這包括尺度,面內(nèi)旋轉(zhuǎn)和平移。下面的圖像闡述了在一個類似的轉(zhuǎn)換下的一套允許的動作類型。從一個點集中移除全局剛性運動的過程被成為Procrustes分析.數(shù)學(xué)上地,Procrusters分析的目的是同時找到一個權(quán)威的形狀并且類似轉(zhuǎn)換每一個數(shù)據(jù)實例,用這個權(quán)威的形狀將他們對齊。這里,對齊的測量是用采用了權(quán)威形狀的兩個轉(zhuǎn)換形狀的最小二乘距離。為了完成這個目標(biāo),一個重復(fù)的過程在shape_model類中實現(xiàn),如下:#define

33、 fl atMat shape_mode:procruster(交錯未加工的數(shù)據(jù),按列(作為列)const Mat &X;/const int itol ,/嘗試迭代的最大次數(shù)const float ftol)/收斂公差 int N=X.cols,n=X.rows/2;Mat Co,P=X.clone();/復(fù)制for(int i=0;iN;i+)Mat p=P.col(i);/第i個形狀float mx=0,my=0;/計算塊的中心for(int j=0;jn;j+)/分別對x和ymx+=p.fl(2*j);my+=p.fl(2*j+1);mx/=n;my/=n;for(int j=0;jn

34、;j+)/移除塊的中心(zhngxn) p.fl(2*j)-=mx;p.fl(2*j+1)-=my;for(int iter=0;iter0) if(norm(C,Co)ftol) break;/收斂?Co=C.clone();/記住當(dāng)前的估計for(int i=0;irot_scale_align(P.col(i),C);for(int j=0;jn;j+)/應(yīng)用類似的轉(zhuǎn)換 float x=P.fl(2*j,i),y=P.fl(2*j+1,i); P.fl(2*j,i)=R.fl(0,0)*x+R.fl(0,1)*y; P.fl(2*j+1,i)=R.fl(1,0)*x+R.fl(1,1)*

35、y;return P;/返回procruste對齊的形狀這個算法開始通過每一個形狀示例塊的中心,接著通過一個迭代處理,即交替的計算權(quán)威的形狀,因為所有圖像的歸一化均值,并且旋轉(zhuǎn)和尺度化到最佳匹配的權(quán)威形狀。估計的權(quán)威形狀的標(biāo)準(zhǔn)化步驟需要固定尺度問題和防止將所有的形狀縮小到0.這個尺度的選擇是隨意的,這里精選來迫使權(quán)威形狀矢量C的長度到1.0,因為這個OpenCV的normalize函數(shù)的默認(rèn)行為。計算面內(nèi)旋轉(zhuǎn)和尺度,最好通過下面的rot_scale_align函數(shù)使每一個形狀的示例和當(dāng)前估計的權(quán)威形狀相一致。:Mat shape_model:rot_scale_align(cosnt Mat

36、&src,/x1;y1;,xn;yn原形狀示例const Mat &dst/目的形狀/構(gòu)造(guzo)線性系統(tǒng)int n=src.rows/2;float 1=0,b=0,d=0;for(int i=0;in;i+) d+=src.fl(2*i)*src.fl(2*i)+src.fl(2*i+1)*src.fl(2*i+1);a+= src.fl(2*i)*dst.fl(2*i )+src.fl(2*i+1)*dst.fl(2*i+1);b+= src.fl(2*i)*dst.fl(2*i+1)-src.fl(2*i+1)*dst.fl(2*i );a/=d;b/=d;/解決(jiju)線性系

37、統(tǒng)return (Mat_float(2,2)a,-b,b,a);這個函數(shù)最小化下面的旋轉(zhuǎn)和權(quán)威形狀的不同(b tn)的最小二乘。數(shù)學(xué)上可以表示如下:這里最小二乘問題的解決采用閉合形式的解決,在下面的圖像等式的右手邊。注意而不是用來解決尺度和面內(nèi)旋轉(zhuǎn)的,在尺度化2D選擇矩陣中他們是非線性的關(guān)系(尺度和面內(nèi)選擇),我們解決變量(a,b)。這個變量與尺度和旋轉(zhuǎn)矩陣相關(guān),如下:Procureste對原始注釋形狀數(shù)據(jù)分析的可視化效果在下面的圖像中闡述。每一個面部特征用唯一的顏色顯示。轉(zhuǎn)換標(biāo)準(zhǔn)化之后,人臉的結(jié)構(gòu)開始顯現(xiàn)出來,這里人臉特征簇的位置圍繞他們均值的位置。迭代尺度和旋轉(zhuǎn)標(biāo)準(zhǔn)化過程之后,特征簇變的

38、更加緊湊并且他們的分布變的由面部變形導(dǎo)致的變化更具有代表性。最后一點是重要的,因為這些變形我們將在接下來的部分嘗試模型化。因此,Procruster分析的角色可以被認(rèn)為是對原始數(shù)據(jù)的操作,這個操作將得到更好的人臉局部變形模型用來學(xué)習(xí)。線性形狀(xngzhun)模型面部變形模型的目的是找到一個緊湊的參數(shù)化代表,即人臉的形狀在交叉身份和表情之間是怎么樣變化的。采用不同復(fù)雜度水平,有很多方法可以達(dá)到(d do)這個目的。這些方法中最簡單的是使用一個面部幾何的線性表示。盡管它簡單,特別地,當(dāng)數(shù)據(jù)集中的人臉大部分是前向姿勢時,它已經(jīng)展示了精確地捕獲面部變形的空間。它與它的非線性部分相比還有個優(yōu)點是推斷它

39、表示的參數(shù)是一個非常簡單和廉價的操作。這在跟蹤期間,通過配置它來約束搜索過程是很重要的。線性地模型化面部形狀的主要思想在下面的圖像闡述。這里,一個人臉形狀,它有N個人臉特征組成,在2N維空間模型化為一個單點。線性模型化的目標(biāo)是找到嵌入在這個2N維空間的低維超平面,所有人臉形狀的點都位于2N維空間(即圖像中綠色的點)。因為這個超平面僅跨度完整2N維空間的一個子集,它通常被稱為子空間。子空間維數(shù)越低,人臉表示更加緊湊并且約束 更加強(jiqing),這個約束強加于跟蹤過程。這經(jīng)常導(dǎo)致魯棒性更高的跟蹤。然而,子空間維度的選擇上要注意,以使有足夠的容量張成所有人臉空間,但在張成的空間里又沒有太多的非人

40、臉形狀(即圖像中紅色的點)。當(dāng)從單個人模型化數(shù)據(jù)時,這應(yīng)當(dāng)被標(biāo)識。獲得人臉變化性的子空間通常比模式化多個身份有更高的緊湊性。這就是為什么指定人跟蹤器的執(zhí)行效果要比一般人好。尋找最低維子空間(張成一個數(shù)據(jù)(shj)集)的過程成為主成份分析(PCA)。OpenCV實現(xiàn)了計算PCA的類,然而,它需要預(yù)先指定保留的子空間維數(shù)。因為這往往(wngwng)是很難確定的先驗,常見的啟發(fā)式是基于它所占的總的變化的分?jǐn)?shù)比例來選擇它。在shape_model:train函數(shù)中,PCA的實現(xiàn)如下:SVD svd(dY*dY.t();int m=min(min(kmax,N-1),n-1);float vsum=0;

41、for(int i=0;im;i+)vsum+=svd.w.fl(i);float v=0;int k=0;for(k=0;k=frac)k+;break;if(km) k=m;Mat D=svd.u(Rect(0,0,k,2*n);這里,dy變量的每一列表示減去均值的Procrustes對齊形狀。因此,奇異值分解SVD有效的應(yīng)用到形狀數(shù)據(jù)的協(xié)方差矩陣(即,dY.t()*dY)。OpenCV的SVD類的w成員存儲著數(shù)據(jù)變化性的主要方向的變量,從最大到最小排序。一個選擇子空間維數(shù)的普通方法是選擇保存數(shù)據(jù)總能量分?jǐn)?shù)frac的方向最小集(即占總能量的比例為frac),這是通過svd.w.記錄表示的,

42、因為這些(zhxi)記錄是從最大的到最小的排序的,它充分地用來評估子空間,通過用變化性方向的最大值k來評估能量。他們自己的方向存儲在SVD類的u成員內(nèi)。svd.w和svd.u成分一般分別被成為特征譜和特征矢量。這兩個成分的可視化如下圖表:注釋(zhsh):注意(zh y)特征譜的迅速下降表明,包含在數(shù)據(jù)中的主要變化可以用低維子空間進(jìn)行模型化。局部(jb)全局的組合表示圖像幀中形狀是通過局部變形和全局轉(zhuǎn)換組合產(chǎn)生的。數(shù)學(xué)上,這個參數(shù)化是不確定的,因為這種轉(zhuǎn)變的組成導(dǎo)致一個非線性的函數(shù),該函數(shù)沒有閉合形式的解。繞過這個問題的一個普通的方法是把全局轉(zhuǎn)換模型為一個線性子空間并且把它添加到變形子空間。為

43、了得到一個固定的形狀,可以用一個子空間模式化一個類似的轉(zhuǎn)換。如下:在shape_model類中,這個子空間的 通過calc_rigid_basis函數(shù)產(chǎn)生,來至產(chǎn)生這個子空間的形狀(即前面等式中x和y成分)是Procuses對齊形狀值(即,權(quán)威的形狀)。另外用前面提到的形式構(gòu)造子空間,矩陣的每一列歸一化為單位長度。在shape_model:train函數(shù)中,先前部分描述的dy是通過映射附屬于剛性運動數(shù)據(jù)成分計算得到的。如下:Mat R=this-calc_rigid_basis(Y);/計算剛性子(xng zi)空間Mat P=R.t()*Y;Mat dy=Y-R*P/產(chǎn)生(chnshng)出

44、的剛性注意這個投影是通過(tnggu)簡單的矩陣乘法實現(xiàn)的。這可能是因為剛性子空間列已經(jīng)進(jìn)行了長度歸一化。這并沒有改變模型張開的空間,并且僅意味著R.t()*R等價與單位矩陣。因為源于剛性轉(zhuǎn)換的變化性的方向已經(jīng)從先前先前學(xué)習(xí)變形模型的數(shù)據(jù)中去掉,作為結(jié)果變形的子空間將正交與剛性轉(zhuǎn)換的子空間。因此,連接兩個子空間將導(dǎo)致一個組合局部-全局線性面部形狀的表示,這同樣也正交。這里聯(lián)合可以利ROI抽取機制,排列兩個矩陣到混合子空間矩陣的子矩陣來現(xiàn)實。ROI的抽取可以用OpenCV的Mat類來實現(xiàn)。如下:V.create(2*n,4+k,CV_32F);/組合子空間Mat Vr=V(Rect(0,0,4,

45、2*n);R.copyTo(Vr);/剛性子空間Mat vd=V(Rect(4,0,k,2*n);D.copyTo(Vd);/非剛性子空間結(jié)構(gòu)模型的正交性意味著描述一個形狀的參數(shù)可以簡單地被計算,就像shape_model:calc_param函數(shù)做的:p=V.t()*s;這里的s是一個矢量化的人臉形狀,并且p存儲著表示它的人臉子空間的坐標(biāo)。最后一點注意的是線性化模型人臉形狀是怎樣約束子空間的坐標(biāo),例如使用它產(chǎn)生的形狀任然有效。在下面的圖像中,位于子空間的人臉形狀示例被展示,用來表現(xiàn)坐標(biāo)的一個增加值,用變量的一個方向值和4個標(biāo)準(zhǔn)差的增加。注意對于小的值,結(jié)果形狀保持的像人臉,但是隨著值變大開始

46、惡化。阻止這種變化的一個簡單的方法是固定住子空間坐標(biāo)的值,使當(dāng)用子空間的數(shù)據(jù)決定時位于允許的區(qū)域。對于這個一個普遍的選擇是用+-3數(shù)據(jù)標(biāo)準(zhǔn)差約束的框,這占數(shù)據(jù)變化的99.7比例。這些固定的值通過shape_model:train函數(shù),在找到子空間后,計算得到的。如下:Mat Q=Vt()*X;/將原始數(shù)據(jù)投影到子空間for(int i=0;iN;i+)/歸一化坐標(biāo)尺度 float v=Q.fl(0,i); Mat q=Q.col(i);q/=v;e.create(4+k,1,CV_32F);multiply(Q,Q,Q);for(int i=0;i4+k;i+)if(i4) e.fl(i)=-

47、1;/對于剛性稀疏(xsh)不固定else e.fl(i)=Q.row(i).dot(Mat:ones(1,N,CV_32F)/(N-1);注意方差是在子空間標(biāo)準(zhǔn)化后的坐標(biāo)上計算的,標(biāo)準(zhǔn)化是關(guān)于第一維的坐標(biāo)(即尺度)。這樣可以阻止相對大尺度的樣本數(shù)據(jù)主導(dǎo)估計。也注意到一個負(fù)值被分配到剛性子空間坐標(biāo)的方差(即V的前四列)。用來固定的函數(shù)shape_model:clamp來檢測是否一個特殊方向的方差是負(fù)值,如果不是負(fù)值則應(yīng)用(yngyng)固定,如下:void shape_model:clamp(const float c)/固定作為(zuwi)標(biāo)準(zhǔn)方差的分?jǐn)?shù) double scale=p.fl(

48、0);/提取尺度for(int i=0;ie.rows;i+) if(e.fl(i)v)/保存坐標(biāo)符號if(p.fl(i)0) p.fl(i)=v*scale;/正閾值else p.fl(i)=-v*scale;/負(fù)閾值這樣做的理由是訓(xùn)練數(shù)據(jù)通常是在人為的環(huán)境下獲取的,在這種環(huán)境下,人臉是豎直的并且以一個特殊的尺度位于圖像的中心。依賴于訓(xùn)練集中的配置的形狀模型的剛性成分是非常受限制的。最終,隨著每一個可變形坐標(biāo)的方差在尺度化的幀中被計算,在固定時,同樣的尺度化必須應(yīng)用于坐標(biāo)。訓(xùn)練和可視化用標(biāo)記的數(shù)據(jù)訓(xùn)練一個形狀模型的例程可以在train_shape_model.cpp中找到。帶有包含標(biāo)記數(shù)據(jù)路

49、徑的命令行參數(shù)argv1,訓(xùn)練通過導(dǎo)入數(shù)據(jù)到內(nèi)存開始,并且移除不完全的樣本,如下:ft_data data=load_ft(argv1);data.rm_imcomlete_samples();對于每個例子的標(biāo)記和可選的他們的鏡像部分,在傳輸?shù)接?xùn)練函數(shù)之前被存儲在一個容器中,如下:vetctorvector pointsfor(int i=0;iint(data.points.size();i+) points.push_back(data.get_points(i,false);if(mirro) points.push_back(data.get_points(i,true);然后形狀(x

50、ngzhun)模型通過調(diào)用一個函數(shù)shape_model:train()來訓(xùn)練,如下:shape_model smodel ;smodel.train(points,data.connections,frac,kmax);這里frac(即用來保留的變化分?jǐn)?shù))和kmax(即用來保持的最大特征矢量的數(shù)目)通過命令行選項可以有選擇的設(shè)置,默認(rèn)設(shè)置為0.95和20,分別(fnbi)地,(這兩個參數(shù))在大部分情況下趨向于工作好。最后采用包含保存訓(xùn)練形狀模型路徑的命令行參數(shù)argv2,保存可以通過調(diào)用一個函數(shù)來執(zhí)行,如下:save_ft(argv2,smodel);這部的簡單性是由于為shape_mode

51、l類定義(dngy)了read和write序列化函數(shù)。為了可視化訓(xùn)練模型,visualize_shape_model.cpp程序生動化地輪流顯示每個方向的非剛性變形。通過導(dǎo)入形狀模型到存儲器開始,如下:shape_model smodel=load_ft(argv1);用來置于顯示窗口的中心的模型的剛性參數(shù)的計算如下:int n=smodel.V.rows/2;float scale=calc_scale(smodel.V.col(0),200);float tranx=n*150.0/smodel.V.col(2).dot(Mat:onews(2*n,1,CV_32F);float trai

52、ny=n*150.0/smodel.V.col(2).dot(Mat:onews(2*n,1,CV_32F);這里calc_scale函數(shù)尋找尺度化系數(shù),該系數(shù)可以產(chǎn)生帶有200像素寬的人臉形狀。平移成分通過找到系數(shù)(用來產(chǎn)生150像素的平移)來計算(即,這里的模型均值中心化并且用大小為300*300的窗口顯示)。注釋注意shape_model:V的第一列對應(yīng)于尺度并且第三列和第四列分別對應(yīng)于x和y的平移。然后參數(shù)值的軌道被產(chǎn)生,該軌道從0開始,移動到正的極端,移動到負(fù)的極端,然后回到0,如下:vector val;for(int i=0;i50;i+)val.push_back(float(

53、i)/50);for(int i=0;i50;i+)val.push_back(float(50-i)/50);for(int i=0;i50;i+)val.push_back(-float(i)/50);for(int i=0;i50;i+)val.push_back(-float(50-i)/50);這里,每一個動畫的相位由50個增值組成。然后這個軌道被用于在顯示窗口上動畫人臉模型和給于(渲染)結(jié)果。如下:Mat img(300,300,CV_8UC3); namedWindow(“shape model”);while(1) for(int k=4;ksmodel.V.cols;k+)

54、for(int j = 0; j int(val.size(); j+)Mat p = Mat:zeros(smodel.V.cols,1,CV_32F);p.at(0) = scale;p.at(2) = tranx;p.at(3) = trany;p.at(k) = scale*valj*3.0*sqrt(smodel.e.at(k); p.copyTo(smodel.p); img = Scalar:all(255);vector q = smodel.calc_shape();draw_shape(img,q,smodel.C);imshow(shape model,img);if(w

55、aitKey(10) = q)return 0;注釋(zhsh)注意剛性系數(shù)(即,這些對應(yīng)于shape_model:V的前四列)通常設(shè)置為先前(xinqin)計算得到的值,用來將人臉顯示在屏幕的中心。面部(min b)特征檢測器檢測圖像中的面部特征和一般目標(biāo)檢測很相似。OpenCV有一組精細(xì)的函數(shù)來建立一般目標(biāo)檢測,其中最知名就是基于Haar特征級聯(lián)檢測器,它采用的是著名的Viola-Jones人臉檢測器實現(xiàn)的。然而,有些可以可區(qū)分的因素,這些因素使得(sh de)面部檢測唯一,他們?nèi)缦拢壕葘︳敯粜裕涸谝话愕哪繕?biāo)(mbio)檢測,目的是為了尋找圖像中目標(biāo)的大致位置。面部檢測器需要得到特征位置

56、的高精度的估計。一種錯誤是:在目標(biāo)檢測中少量像素被認(rèn)為不重要,但是在通過特征檢測進(jìn)行人臉表情估計時它可能意味著微笑和皺眉的之間的差異。來至有限空間支持的歧義:一個很常見的假設(shè)是用一般目標(biāo)檢測器檢測感興趣的目標(biāo)表現(xiàn)出充分的圖像結(jié)構(gòu),這樣,它可以可靠的區(qū)分不包含目標(biāo)的圖像區(qū)域。對于面部特征來說這不是常見的情況,它典型地限制了空間支持。這是因為不包含目標(biāo)的圖像區(qū)域通常表現(xiàn)出和面部特征非常相似的結(jié)構(gòu)。例如,人臉邊緣的一個特征,從中心位于該特征點的小邊界框來看,很容易和任何其他的包含有明顯邊緣的圖像塊混淆。計算的復(fù)雜度:一般目標(biāo)檢測的目的是尋找圖像中所有目標(biāo)的實體。另一方面,人臉跟蹤需要得到所有面部特征

57、的位置,這通常包含有大約20到100個特征。因此,有效地評估每一個特征檢測器性能,最主要的在于能夠建立一個實時的人臉跟蹤器。由于這些的差異,用于人臉跟蹤的面部特征檢測器通常專門的設(shè)計。當(dāng)然,在人臉跟蹤中,有很多一般目標(biāo)檢測器技術(shù)應(yīng)用到面部特征人臉器。然而,在關(guān)于誰表現(xiàn)的更能適合解決面部特征跟蹤問題上,沒有一個一致的說法。在這一部分,我們將使用被認(rèn)為是最簡單的模型線性圖像塊來建立面部特征檢測。盡管它簡單,在設(shè)計它的學(xué)習(xí)過程時應(yīng)關(guān)注一下,我們將看到事實上用在人臉跟蹤算法上,它可以給出面部特征位置的合理估計。而且,他們的簡單些使得估計速度非常快,使實時的人臉跟蹤成為可能。由于他們表現(xiàn)的像一個圖像塊,

58、因此,面部特征檢測器稱為塊模型。這個模型通過patch_model類來實現(xiàn),該類可以在patch_model.hpp和patch_model.cpp文件中找到。下面(xi mian)的代碼片段給出了path_model類的頭部分,強調(diào)該類 的基本功能:class patch_modelpublic:Mat P; /normalized patch/歸一化的塊.Mat /response map /映射(yngsh)calc_response(const Mat &im, /image patch of search region/搜索區(qū)域(qy)的圖像塊const bool sum2one =

59、 false); /normalize to sum-to-one?.voidtrain(const vector &images, /training image patches/訓(xùn)練圖像塊const Size psize, /patch size/塊大小const float var = 1.0, /ideal response variance /實響應(yīng)方差const float lambda = 1e-6, /regularization weight/規(guī)則化權(quán)重const float mu_init = 1e-3, /initial step size/初始化的步長大小const i

60、nt nsamples = 1000, /number of samples/樣本的數(shù)量const bool visi = false); /visualize process?/是否可視化過程.;用來檢測面部特征的塊模型存儲在矩陣P中。在這個類中兩個基本的函數(shù)是:calc_response和train。calc_response函數(shù)用來計算每一個搜索區(qū)域im的整體替代部分的塊模型響應(yīng)。train函數(shù)學(xué)習(xí)psize大小的塊模型,平均而言,在訓(xùn)練集上產(chǎn)生的響應(yīng)很接近于理想的響應(yīng)。var,lambda,mu_init和nsamples是訓(xùn)練過程的參數(shù),可以隨時調(diào)整到最佳性能。這個類的功能將在這一部

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論