算法优化二——如何提高人脸检测正确率

来源:互联网 发布:禁闭岛影评 知乎 编辑:程序博客网 时间:2024/05/18 20:32

零、检测

  接上篇博文继续探讨人脸检测的相关内容,本文会给出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));
1 0
原创粉丝点击