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