在過去的幾個月裡,我主要針對人臉檢測進行了研發,嘗試的方法包括,adaboost+haar特徵,npd人臉檢測,和jda人臉檢測。這三種方法我都有實現,顯然jda人臉檢測器效果最佳。
jda檢測器融合了檢測和對齊兩種方式,重在檢測,通過對齊的方式使檢測的效果更好更快。
樣本內容包含:影象、真實人臉、估計人臉、置信度和權值。對於人臉影象來說,首先要將人臉歸一到同一尺度,我的做法是:
1)計算真實人臉形狀的最小外接矩形;
2)計算正方形,其中心為矩形的中心,邊長為矩形最大邊長;
3)計算正方形邊長與標準大小的比例,根據這一比例縮放影象和人臉形狀;
訓練樣本初始的估計人臉是均值人臉的微小變換(旋轉、平移和縮放),權值為1,置信度為0。檢測樣本的初始人臉為均值人臉。不要用均值人臉直接作為估計人臉。
在實際的訓練過程中,負樣本會出現嚴重不夠的情況建議用隨機變換的方式擴充樣本庫。
弱分類器所選用的特徵是畫素差,提取方式如下:
1) 生成弱分類器模板,內容包括兩個2d偏移量,n個特徵點之二的id,尺度值(1.0, 0.5, 0.25);
2) 計算當前形狀與均值形狀之間的尺度和角度關係;
3) 根據角度和尺度對映對映偏移量;
4) 偏移量分別加到兩個指定id的當前標記點,得到兩個畫素,求其差值作為特徵。
參加分類的樣本,負樣本大於10倍正樣本,最好是能達到50倍。
弱分類器選擇為計算最大熵(正負樣本都參加)或最小偏移量(僅正樣本參加),用概率p來選擇,前面的stage,p更大表示選擇最大熵方式的概率大些。
強分類器採用樹型結構,每個非葉節點是乙個弱分類器,葉節點儲存乙個置信度,到達該葉節點的樣本需加上這個值來更新置信度。一棵樹還有乙個置信度閾值,根據召回率來設定,也就是說樣本經過每乙個決策樹,都會與閾值比較小於閾值認定為負樣本並pass掉。
級聯強分類器,也就是一棵棵決策樹依次分類正樣本,但是要分為多級,每一級分類之後要進行回歸。
回歸的目的是**樣本在當前狀態下應該發生多少偏移可以到達真實位置。也就是說在單級決策樹訓練完成後還要訓練回歸器,回歸器的特徵是二值特徵,提取方式如下:
1) 如果決策樹葉節點有8個,樣本分到第三個葉節點,則形成0010000;
2) 連線樣本經過的所有決策樹生成的二值特徵;
回歸器就是二值特徵到偏移量的對映,使用liblinear可以解決,用公式可表示為iw=y,i表示特徵,y表示偏移量,w表示權值。
github上一些實現,使用liblinear來解線性方程,得到的結果用liblinear自己的介面來儲存,然後使用的時候用liblinear的函式**,這樣做會顯著減慢速度以及增加模型大小。解決這兩個問題的方法是把權值矩陣提取出來。
人臉識別之人臉檢測
人臉識別分為人臉檢測 人臉預處理 蒐集和學習人臉以及人臉識別四個部分,此部分將人臉檢測。本文基於opencv進行的。在opencv中常用的人臉檢測器有基於lbp的特徵檢測 基於haar的特徵檢測,兩者的區別 前者比後者快好幾倍且不需要許可協議,但很多haar檢測器需要許可協議。基於haar的臉部檢測...
OpenCV人臉檢測 眼睛檢測之在人臉以外找眼睛
今天在學習opencv人臉檢測時,發現眼睛檢測是在人臉以外尋找眼睛的,源 如下 import cv2 def detect face cascade cv2.cascadeclassifier cascades haarcascade frontalface default.xml eye casc...
人臉檢測2
下面的 是講具體如何訓練 當時我想研究車牌識別的,用此方法對車牌進行訓練沒有成功,呵呵。下面是成功的例子,注意是 opencv中的traincascade.exe不是 另外那個 opencv traincascade.exe data data vec a.vec bg e lch train im...