演算法優化二——如何提高人臉檢測正確率
零、檢測
接上篇博文繼續探討人臉檢測的相關內容,本文會給出Opencv中自帶的人臉檢測的相關對比以及Opnev檢測中常用的標註等相關操作。人臉檢測是一個非常經典的問題,但是還是有一些常見的問題出現在實際使用當中:
(1)誤檢(把非人臉的物體當作人臉)較多,非人臉影象當作人臉送入後續演算法,會引起一系列不良後果。
(2)漏檢問題,例如戴墨鏡、大鬍子、逆光條件、黑種人、傾斜姿態較大的臉無法檢測到。
一、人臉檢測分類器對比
序號 | 級聯分類器的型別 | XML檔名 |
---|---|---|
1 | 人臉檢測器(預設) | haarcascade_frontalface_default.xml |
2 | 人臉檢測器(快速的Haar) | haarcascade_frontalface_alt2.xml |
3 | 人臉檢測器(快速的LBP) | lbpcascade_frontalface.xml |
4 | 人臉檢測器(Tree) | haarcascade_frontalface_alt_tree.xml |
5 | 人臉檢測器(Haar_1) | haarcascade_frontalface_alt.xml |
Haar特徵,毫無疑問Haar特徵用在人臉檢測裡具有里程碑式的意義。博主針對正面人臉分類器進行了實驗,總共有4個,alt、alt2、alt_tree、default。對比下來發現alt和alt2的效果比較好,alt_tree耗時較長,default是一個輕量級的,經常出現誤檢測。針對alt和alt2兩者,在同一個視訊的對比中檢測部分alt要略微好於alt2。接下來是一些具體的對比:
(1)檢測時間上對比
影象 | Haar_alt | Haar_alt2 | lbp |
---|---|---|---|
複雜背景影象 | 2054 | 2309 | 948 |
簡單背景影象 | 912 | 964 | 326 |
(2)檢測結果上對比:
影象 | Haar_alt | Haar_alt2 | lbp |
---|---|---|---|
複雜背景影象 | 70 | 70 | 69 |
簡單背景影象 | 277 | 283 | 292 |
二、detectMultiScale函式
選擇最終的人臉分類器後,若想在這個基礎上繼續優化,那就試試這個detectMultiScale函式。具體可以檢視Opencv原始碼,下面給出這個函式的講解:
void detectMultiScale(
const Mat& image,
CV_OUT vector<Rect>& objects,
double scaleFactor = 1.1,
int minNeighbors = 3,
int flags = 0,
Size minSize = Size(),
Size maxSize = Size()
);
函式介紹:
引數1:image–待檢測圖片,一般為灰度影象加快檢測速度;
引數2:objects–被檢測物體的矩形框向量組;
引數3:scaleFactor–表示在前後兩次相繼的掃描中,搜尋視窗的比例係數。預設為1.1即每次搜尋視窗依次擴大10%;
引數4:minNeighbors–表示構成檢測目標的相鄰矩形的最小個數(預設為3個)。 如果組成檢測目標的小矩形的個數和小於 min_neighbors - 1 都會被排除。如果min_neighbors 為 0, 則函式不做任何操作就返回所有的被檢候選矩形框;
引數5:flags–要麼使用預設值,要麼使用CV_HAAR_DO_CANNY_PRUNING,函式將會使用Canny邊緣檢測來排除邊緣過多或過少的區域, 因為這些區域通常不會是人臉所在區域;
引數6、7:minSize和maxSize用來限制得到的目標區域的範圍。如果視訊中誤檢到很多無用的小方框,那麼就把minSize的尺寸改大一些,預設的為30*30。
三、視訊標註
視訊標註中必不可少的就是畫框和文字標註:
//視訊畫框
for (vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++)
rectangle(img, cvPoint(r->x, r->y), cvPoint(r->x + r->width - 1, r->y + r->height - 1), Scalar(255, 0, 255), 3, 8, 0);
//文字標註
putText(imgForShow, p.first, Point(BBox.x, BBox.y), FONT_HERSHEY_PLAIN, 2, Scalar(255, 0, 0));