1. 程式人生 > >演算法優化二——如何提高人臉檢測正確率

演算法優化二——如何提高人臉檢測正確率

零、檢測

  接上篇博文繼續探討人臉檢測的相關內容,本文會給出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));