用于LBP培训的OpenCV traincascade

时间:2013-06-19 07:01:00

标签: opencv image-processing face-detection

我正在使用traincascade实用程序在OpenCV中使用LBP功能创建头部探测器。我希望,头部探测器会产生类似于由Vladim Pivarevsky创建的OpenCV的轮廓面。我想重新创建模型,因为当前模型只处理正面和左侧面。

我关注Naotoshi Seo tutorial并使用Irshad Ali website中的数据集。不幸的是,由于大量的错误检测,结果模型执行缓慢​​。

列车运行如下:

opencv_traincascade -data "data" -vec "samples.vec" -bg "out_negatives.dat" -numPos 26000 -numNeg 4100 -numStages 16 -featureType LBP -w 20 -h 20 -bt GAB -minHitRate 0.995 -maxFalseAlarmRate 0.3 -weightTrimRate 0.95 -maxDepth 1 -maxWeakCount 100 -maxCatCount 256 -featSize 1

我尝试使用其他数据集,现在来自http://fei.edu.br/~cet/facedatabase.html的正面,但结果仍然相同:检测速度慢,误报很多。

任何人都有创建级联haar / lbp模型的知识或经验吗?请提出任何建议,以便提高模型的准确性。我尝试使用OpenCV内置模型,结果很好(lbpfrontalface.xml)。非常感谢你!

4 个答案:

答案 0 :(得分:3)

最好的方法是“试错”......你真的需要不同的面孔,而且差异越大越好。您可以拍摄一张脸,并通过创作样本做多张脸。但是这样,你永远不会有好的级联。您应该有许多不同的面孔,如果它们不够,您可以通过创建样本来增加它们。例如,你有500个不同的面孔,你可以使用5000创建样本,那么也许级联会让你满意。

关于开始训练:多多积极:)或太少负面。你需要例如5000 pos和2500 neg(pos = 2 * neg)。至少在我的情况下,这是最好的选择。

答案 1 :(得分:2)

简而言之,在建模阶段1之后获得大量误报是正常的。您需要将这些误报并将其添加到负数据集并重复建模(阶段2)。这被称为硬负采矿。这很重要。您可以通过将它们逐渐旋转360度来乘以误差。

其他三个要点:1)opencv_createsamples对于脸部不好; 2)使用具有挑战性的负面因素(合适的); 3)LBP在许多情况下是第二速率。

  1. 面部相当对称,在拍摄时不会出现类似失真的梯形。如果必须,使用非常小的角度,如0.02弧度。此外,当您查看.vec文件中的图像时,您会发现扭曲边缘周围的背景填充看起来非常不自然。

  2. 不仅负数的数量很重要,而且负数的质量也很重要。与许多负面图像(例如树木,落基山脉等)相比,面部是平滑的,因此在远处区分面部与松树相对容易。但是,你会从像墙壁这样的光滑表面上得到很多误报。最好在负数据集中包含具有挑战性的图像。我发现最好的背景是光滑的彩绘石膏板墙的图像。沿着一些墙​​壁走一段视频,用ffmpeg把它切成一堆图像。同样,您可以通过将它们逐渐旋转360度来乘以这些底片,然后再次翻转和旋转。

  3. 要耐心,使用HAAR而不是LBP。

  4. AI现在风靡一时,只需将100,000个未剪切的图像分成相应类的文件夹,然后开始训练你的模型。但是,您可能会发现此方法只能获得98-99%的正确分类率。方式太多误报。如上所述(无论是使用HAAR级联还是神经网络),您将获得更好的结果,而且数据少得多。这是真正的数据科学工作:精明的负面和正面数据集选择以及定义边界框的耗时工作。

答案 2 :(得分:1)

它会很慢,相对于它从20x20开始并搜索整个图像然后变得稍大,再次搜索等等 - 尝试增加样本大小以减少运行时间。

我也注意到你没有任何接近bg图像的正面。尝试增加至少与你的积极相同,这应该有所帮助。

我建议也要解决haar功能,看看是否能给你带来任何结果。

在不查看输入数据的情况下其他一切似乎都很好

答案 3 :(得分:0)

对于任何挣扎于薄片阳性的人。 在类CvCascadeImageReader :: NegReader和方法get和nextImg

上查看文件traincascade/imagestorage.cpp

我必须重写取负样本的逻辑。 当产生软底片时,它们会按比例缩放从背景图像中以原始方式逐步缩小。 在我的情况下,只能使用窗口大小/序列大小从此底片中随机剪切背景样本。

在我的情况下,由于将较大比例的软样本缩放到一个小窗口中,因此训练被停止得很早,因为它总是模糊的负样本,并且FA通过了与后来级联检测到的真实图像相反的