想要询问是否有任何适合视频的面部检测方案,理想情况下需要最少的培训时间,而不是像Viola-Jones那样的几周。我读过有关LBP的内容,但它也需要大量的训练样本,但不确定需要多长时间。训练LBP的时间是否与使用相似训练集的Viola-Jones方法一样多?我将在一个运行在Linux操作系统上的像raspberry pi这样的微处理器上实现它。我希望它能在C上实现速度,因为我希望它能够以10fps - 20fps的视频流检测图像。
答案 0 :(得分:10)
OpenCV附带了一个名为 traincascade 的工具,用于训练LBP,Haar和HOG。特别是对于面部检测,他们甚至以 traincascade 所需的格式发送24x24像素面的3000图像数据集。
根据我的经验,在 traincascade 支持的三种类型中,LBP花费最少的时间进行训练,为哈尔拍摄小时而不是几天。
对其训练过程的快速概述是,对于给定的阶段数(一个不错的选择是20),它试图找到尽可能多地拒绝非面部而不拒绝面部的特征。拒绝非面部和保持面部之间的平衡由最小命中率(OpenCV选择99.5%)和误报率(OpenCV选择50%)控制。用于制作OpenCV自己的LBP级联的特定元算法是Gentle AdaBoost(GAB)。
这里描述了在OpenCV中实现的LBP变体:
廖胜才,朱祥新,甄磊,张伦和Stan Z. Li。学习用于人脸识别的多尺度块局部二值模式。国际生物识别大会(ICB),2007年,第828-837页。
OpenCV中使用默认参数的实际情况是:
探测器检查图像中的24x24窗口以寻找面部。从级联分类器的第1阶段到第20级步进,如果它可以显示当前24x24窗口可能不是面部,则它拒绝它并在窗口上移动一到两个像素到下一个位置;否则它会进入下一阶段。
在每个阶段,检查3-10个左右的LBP特征。每个LBP特征在窗口内都有一个偏移量和一个大小,它覆盖的区域完全包含在当前窗口中。在给定位置评估LBP特征可能导致通过或失败。根据LBP功能是成功还是失败,将特定于该功能的正或负权重添加到累加器。
一旦评估了所有舞台的LBP特征,就将累加器的值与阶段阈值进行比较。如果累加器低于阈值则阶段失败,如果累加器高于阈值则阶段失败。同样,如果一个阶段失败,则退出级联并且窗口移动到下一个位置。
LBP功能评估相对简单。在该特征在窗口内的偏移处,九个矩形以3×3配置布置。对于特定的LBP功能,这9个矩形的大小都相同,范围从1x1到8x8。
计算九个矩形中所有像素的总和,换句话说,它们的积分。然后,将中心矩形的积分与其八个邻居的积分进行比较。这八个比较的结果是8位(1或0),它们组装在一个8位LBP中。
这个8位位向量用作2 ^ 8 == 256位LUT的索引,由训练过程计算,特别是每个LBP特征,用于确定LBP特征是通过还是失败。
这就是它的全部内容。