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

簫鳴琴奏_CPP程序俠:回覆@VinjnZhang:分數低就低了,還得繼續後面的人生。[哈哈] (1分鐘前)

VinjnZhang:回覆@簫鳴琴奏_CPP程序俠: 評分低有很多原因,並不一定是你做得不好(今天 17:04)

簫鳴琴奏_CPP程序俠:回覆@VinjnZhang:這個是碩士論文,不及格的才能看到意見。申請了軟件著作權,給學校和以後的學弟學妹維護了。有過公司看到後想商業化,想收我,但還是限於當今人臉識別太強大,我就弄了一年的系統,這點算法,商業化是找死……只是在實驗室幹了二年,最後被別人完全否定,很不爽,吐槽多了,sorry。 (今天 16:45)

VinjnZhang:回覆@簫鳴琴奏_CPP程序俠: 評委的意見是什麼?主辦方想看到怎樣的產品?你這個考慮開源不,也許可以繼續維護下去,以後找工作絕對有幫助! (今天 16:34)

簫鳴琴奏_CPP程序俠:回覆@VinjnZhang:還有人物出現和消失,如何使用骨骼追蹤自行檢測,實時更新當前信息。距離變化,朝向是否考慮設置權重,視頻序列長度選擇。有意義的算法創新?我只能運用機器學習思想大量測試調整現有模型中的參數。難道要弄個坑爹方法,卻去對比十年前的結果。只能說,人臉識別啊,沒創新算法,別碰吧…… (今天 16:30)

簫鳴琴奏_CPP程序俠:回覆@VinjnZhang:自帶人臉識別算法很簡單,而且也是近期纔出現的。論文主要工作不在算法上(實現沒有的gabor特徵提取),在系統實現,特別是算法中參數的選擇,圖片剪裁到多大合適,特徵維數多大,gabor參數,使用採集了二個月45個人的人臉數據,共6萬張圖像進行測試驗證。人臉數據如何自動獲取,戴眼鏡是否有影響…… (今天 16:14)

VinjnZhang:opencv自帶了幾個人臉識別算法,Kinect應該只是用來取頭部的信息,這樣的系統非常不創新,而且爲什麼需要 1.3W 代碼? (今天 15:55)

  回覆
簫鳴琴奏_CPP程序俠:回覆@Information_security:是啊,最低的及格分。看起來簡單,但參數設置通過大量測試纔得到。kinect許多問題的解決,都是首創的。 (今天 10:02)

Information_security:回覆@簫鳴琴奏_CPP程序俠:你這個得了學校最低分1? (今天 09:31)

簫鳴琴奏_CPP程序俠:回覆@Information_security:這個youku視頻已經很清晰了(超清),不折騰了~ (今天 08:19)

Information_security:視頻可以上傳網盤啊! (今天 01:03)

  回覆
cnkinect:轉發微博 (6月24日 22:19)

  回覆
簫鳴琴奏_CPP程序俠:回覆@Kinect體感中國:gabor、lbp之類的,做的很簡單。3D點雲有人做了。 (6月24日 22:12)

i軟件開發:點子很不錯啊。建議考慮一下參加這個活動,說不定還有¥¥的獎金等着你呢。別錯過,月底就截止報名了。 http://t.cn/zTrDvnk 看看那些超級cool的演示。 (6月24日 21:21)

  回覆
Kinect體感中國:是基於3D點雲識別人臉的吧? (6月24日 21:17)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章