Kinect人脸识别系统—开发历程
除非比較重要的文章,其他小文章都放在52coding.com上了。此文屬于,吐槽文章。
持續(xù)維護地址:?http://52coding.com/kinect-face-recognition-development
本篇文章主要講的是開發(fā)者的切身經(jīng)歷,如果你正在弄Kinect或者做系統(tǒng),又或者曾經(jīng)做過一段時間,或許會有所共鳴。如果要了解系統(tǒng)中使用的一些算法,我已經(jīng)做了多篇博客,你可以很容易搜到,我只給文章名字不給鏈接了。《怎樣使用OpenCV進行人臉識別》《Kinect Face Tracking SDK[Kinect人臉跟蹤]》《Gabor的OpenCV代碼》,都是無價的文章。
我是2011年暑假開始研究人臉識別,那時剛弄完本科的畢業(yè)設(shè)計---Haartraining人臉檢測,當時haartraining整的挺火熱的,農(nóng)歌畢業(yè)不成問題。暑假來到上海的大學,開始研究生生涯。接到電話,說本科畢設(shè)的論文評上院優(yōu)秀論文,不是校優(yōu),湊合吧,看來不論選擇和什么老師做畢設(shè),都是金子。
當時OpenCV沒有FaceRecognizer模塊,Kinect才接觸,微軟也只提供了簡陋的Kinect SDK beta(沒有人臉追蹤)。我也只會個C++和Matlab,不過這些就夠了。看閱各種人臉識別的書籍,圖書館所有和人臉識別的書都被我借過來。這還不夠,打印了李子青Handbook of face reconition,以及購買了基本人臉識別的圖書。研究OpenCV的C++接口,打印了OpenCV參考文檔。上課看,回宿舍看,有時上廁所也看。
一開始為了熟悉Kinect,那時還是Kinect for Xbox,我做了一個動作識別系統(tǒng),五千行代碼,仿照國外C#的動作識別算法,弄過的都知道他們。什么,他們的算法好像就幾百行,你的怎么這么復雜?我設(shè)計了復雜的數(shù)據(jù)結(jié)構(gòu),做了向后擴展,也就是說他如果明天說可以檢測6個人的骨骼了,我代碼不用修改都可以用,然后每過一段時間會自動清除消失的人物的骨骼數(shù)據(jù)(具體點,骨骼數(shù)據(jù)和動作識別數(shù)據(jù)),更加,我檢測的動作也增加了。其中以前后左右上下方向的識別還是不錯。
然后我就開始搭建人臉識別系統(tǒng)。首先開始設(shè)計的就是數(shù)據(jù)庫,這塊我用了整整1個月時間。不僅僅設(shè)計數(shù)據(jù)庫吧,主要系統(tǒng)模型設(shè)計好,數(shù)據(jù)庫怎么為以后的系統(tǒng)做準備。數(shù)據(jù)庫使用最簡單的Access,因為電腦普遍都支持容易配置,并且MFC支持不錯。數(shù)據(jù)庫代碼約2000行左右,包含各種各樣的功能。特別的是的,當時沒有很好的考慮圖像數(shù)據(jù)存儲問題,所以設(shè)計的數(shù)據(jù)庫是把圖像數(shù)據(jù)一起存放進去的,這點為后來制造了不少麻煩。
技術(shù)發(fā)展迅速,漸漸出現(xiàn)了帶有人臉識別模塊的OpenCV,我很快學會使用它,并且翻譯了那篇文章。看到他寫的代碼的質(zhì)量和優(yōu)美,感覺如詩如畫。當時我自己用OpenCV寫了PCA算法,又在弄LDA,但缺乏資料,這下它把他們都實現(xiàn)且封裝了,我很是開心。可以直接學習,也可以直接使用。
因為Kinect只有骨骼追蹤,沒有人臉檢測算法,我又在想辦法弄Adaboost,發(fā)現(xiàn)準確率地啊。又去弄基于膚色的人臉檢測算法,還沒全弄好,Kinect說他提供人臉追蹤功能。我去,弄了半天,沒想到它突然出現(xiàn)啊,當時是2012年3月吧,它一出來(Kinect SDk1.5),我就速度用它分割了簡陋的人臉圖片。首先感覺,定位十分準確,比Adaboost準確多了,也會比沒有完成的基于膚色分割的準確。其次,這個圖像質(zhì)量,能做人臉識別嗎?質(zhì)量比ORL、Yale等很老的數(shù)據(jù)庫中的人臉差了不知道多少倍。好吧,微軟說它在Xbox中實現(xiàn)了人臉識別,咱信任他的說法,自己干一個看看。
正為著這么低劣分辨率的圖像發(fā)愁,Kinect for Windows橫空出世,分辨率提高了一些。我知道,別想再等下去了,Kinect分辨率不會再提高了,是時候考慮采集人臉的事情。特別的現(xiàn)在SDK提供了錄制功能,感覺微軟就是為了我的畢設(shè)賣力開發(fā)啊,沒有這些功能:人臉追蹤、分辨率更高的Kinect for Windows還有錄制功能,我看我的碩士課題玩不下去了。
正是處于Kinect和OpenCV的高速發(fā)展,我的人臉識別系統(tǒng)不斷改進。我也一直一手更新Kinect和OpenCV更新的信息,分享自己掌握的知識,造福廣大程序員。
2012的7月開始,用了整整一個暑假,才完成了人臉數(shù)據(jù)采集方案的制定和實施,麻煩了45個同學來配合,原本設(shè)計每個方向上(十來個方向劃分)人臉圖片起碼得50張,運行程序發(fā)現(xiàn)有些同學不夠,很多采集了2到3次。不錯,有些同學的人臉真怪,Kinect就是很難捕獲他的臉,囧。還有的同學頭總是歪著的,并且怎么糾正都沒用,真是奇葩,只能刪掉他的數(shù)據(jù),再找其他人充數(shù)。很多個夏天的下午,我就折騰數(shù)據(jù)采集了。數(shù)據(jù)采集后,還得進行人臉分割,將圖像存放到數(shù)據(jù)庫里,弄個系統(tǒng),沒數(shù)據(jù)庫不像話。
數(shù)據(jù)庫的設(shè)計:圖像數(shù)據(jù)直接存在Access數(shù)據(jù)庫中(MFC的ADO編程),不但用了大量代碼進行讀寫,并且實際運行時讀寫速度慢的要死!沒人指導,我又趕時間完成這個系統(tǒng),硬著頭皮將分割的人臉存到數(shù)據(jù)庫里了。經(jīng)常是這樣的,運行程序(face tracking功能,可以參考那篇文章)分割人臉,分割后查看人臉數(shù)據(jù)是否可用(有的人臉沒跟蹤好,能刪就刪,反正圖片多,有些錯的不用在意),然后輸入名稱保存,這時就得等待漫長的時間。程序要寫數(shù)據(jù)庫,但很緩慢,數(shù)據(jù)存的越多越緩慢,很多時間我就刷網(wǎng)頁了,哎。反正暑假那兩個月煎熬。特別的,我分割的不但是rgb圖像,而且還有深度圖像的人臉。有人處理過深度圖像嗎?即使用了提供的轉(zhuǎn)換,它的坐標竟然還是偏移的,你得自己修正。深度圖像有孔洞?的確有,當時SDK還很多孔洞呢,你自己插值唄。后來SDK更新,解決了孔洞問題,囧,又白折騰了。之后,我將圖片存放在磁盤中,數(shù)據(jù)庫存放圖片地址,才加快數(shù)據(jù)的讀寫,不過大量測試時,你快不到哪里去。誰叫我分割了12萬張圖像,6萬彩色和6萬深度圖像,數(shù)據(jù)庫那么長,每次不是簡單的讀取,還是讀取后是自動打亂的,每次讀的圖像都不會相同。
數(shù)據(jù)庫龐大,之后需要抽取圖像進行訓練,這時我又得考慮一些緩存方法,保存一些數(shù)據(jù)信息,減少它需要掃描數(shù)據(jù)庫的時間。為什么需要掃描,因為,你不知道每個人的圖片有多少張,每種朝向(自己將人臉姿態(tài)角度分類,模仿了PIE人臉數(shù)據(jù)庫)有多少張,我們只有選擇最小值才行。也就是說,你要拿某類的30張圖像訓練,那么每個人圖像應(yīng)該都得大于等于是把,然后每個人取得時候是隨即獲取他N個中的30張,如果寫matlab自然簡單,但你用c++得保證木有問題才能出現(xiàn)正確結(jié)果,夠你折騰的吧。沒有Image Watch,你不知道自己是否真的去讀正確了。
各種算法的融合,首先你得了解那些算法比較好,你有什么資源,那些算法你可以實現(xiàn)?matlab確實有不少算法,你可以參照其中的代碼,寫出OpenCV版本的。比如我模仿了PCA、LDA、Gabor等等。預處理、特征提取和降維、分類,每一層,我都嘗試各種算法進行多次隨機測試。你得一個一個實現(xiàn)好,關(guān)鍵要處理的是數(shù)據(jù)如何傳輸?這時我的程序已經(jīng)很大了,數(shù)據(jù)如何在各種類中傳輸,拷貝少、速度快都得考慮。需要使用多少張圖像進行訓練,你多試幾次,電腦死掉了說明不行了。圖像多大合適?你得考慮可能要用到傅里葉變換,最好是2、3、5的倍數(shù)為佳。Gabor卷積核多大合適?維數(shù)降到多大合適?你多次測試,統(tǒng)計時間和準確率看看。速度快,準確率會低,速度慢,耗時又長了。而且還帶有隨機性,因為我的訓練集圖片每次測試都是隨機的,你得測5次吧,如果變化太大,測10次吧。
ok,你到這里弄了基于靜止圖像的人臉識別算法,寫出來可以成本科畢設(shè)吧,研究生不太好。那我在整個多數(shù)投票方法吧,權(quán)值哪里來?剛才做的大量測試來。
你弄出來分類器,用圖片弄那么長時間,實時運行效果行不行?你得測試,中間處理結(jié)果你得保存,處理結(jié)果你得顯示。人物移出界面程序死掉、參數(shù)沒設(shè)置好運行死掉、時間運行長了莫名其妙程序死掉、光照變化了效果不行了。
當然,一切優(yōu)化的差不多了,用了很長時間與老師交流和修改,最終分數(shù)很低。只能說聲,抱歉,雖然用了如此多的精力,與無數(shù)前人沒有遇到的問題pk,我盡力了無悔了。
微博:http://weibo.com/1083488192/zCVUznJON
?查看對話|?回復
??查看對話|?回復
?查看對話|?回復
??查看對話|?回復
?查看對話|?回復
?查看對話|?回復
??回復
?查看對話|?回復
??查看對話|?回復
?查看對話|?回復
??回復
??回復
?查看對話|?回復
??回復
總結(jié)
以上是生活随笔為你收集整理的Kinect人脸识别系统—开发历程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pdf加密及分享工具
- 下一篇: Impinj英频杰超高频Indy R20