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