【问题标题】:OpenCV traincascade for LBP training用于 LBP 训练的 OpenCV traincascade
【发布时间】:2013-06-15 14:36:20
【问题描述】:

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

我关注Naotoshi Seo tutorial 并使用来自Irshad Ali website 的数据集。不幸的是,生成的模型执行缓慢​​,有很多错误检测。

traincascade 运行如下:

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)。非常感谢!

【问题讨论】:

    标签: opencv image-processing face-detection


    【解决方案1】:

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

    关于开始训练:积极的:) 或消极的太少。例如,您需要 5000 pos 和 2500 neg (pos = 2*neg)。至少在我看来,这是最好的选择。

    【讨论】:

    • 我尝试了你的建议,12000 个肯定和 5000 个否定。从 2000 人脸创建的正面,使用创建样本使其达到 12000。但仍然存在太多误报。你能给我举个你的工作 traincascade 参数的例子吗?我的参数如下: opencv_traincascade -data "data" -vec "samples.vec" -bg "out_negatives.dat" -numPos 10000 -numNeg 5600 -numStages 16 -featureType LBP -w 20 -h 20 -minHitRate 0.995 -maxFalseAlarmRate 0.5 -weightTrimRate 0.95 -maxDepth 1 -maxWeakCount 100 -maxCatCount 256 -featSize 1
    • 如果你有虚假的“面孔”并且也是真实的,我可以建议你尝试增加 numStages。否则你的积极方面有问题。我的参数是“-data h_data -vec vecs/vec -bg bg/negative.txt -numPos 5000 -numNeg 2500 -numStages 14 -featureType HAAR -minHitRate 0.999 -maxFalseAlarmRate 0.3 -w 14 -h 24”但我为瓶子训练级联(我也训练过lbp,但haar更好)。你也应该阅读this。这是我看到的最好的答案。
    • 谢谢!现在误报已减少到 ---> 0,我将 0maxFalseAlarmRate 更改为 0.1 并将 makWeakCount 更改为 300。但一个问题仍然是速度。现在我将尝试@GPPK 关于增加样本量的回答。虽然,因为我使用 Sonots 的 .MergeVector 作为正向量,但我似乎无法使用 20x20 的其他尺寸。你用什么来创建正向量?
    • 我使用 createsamples。它可以创建像“-num 5456 -bg bg/negative.txt -vec vecs/vec -info samples/info.txt -maxxangle 0.1 -maxyangle 0.1 -maxzangle 0.1 -maxidev 30 -bgcolor 255 -bgthresh 0 -w 14 - h 24"。但是在 20x20 的面孔中是正常的,面孔是正方形而不是矩形(在我的情况下是瓶子)。祝你好运。当你有结果时,分享你的经验:)
    • @McBodik,你有xml吗?你能和我们分享一下吗?
    【解决方案2】:

    简而言之,在建模的第 1 阶段之后得到很多误报是正常的。您需要将这些误报添加到负数据集并重复建模(第 2 阶段)。这称为硬负挖掘。这是必不可少的。您可以通过增量旋转 360 度来增加假阴性。

    另外三个重点:1)opencv_createsamples 对人脸不利; 2)使用具有挑战性(合适)的底片; 3) LBP 在许多情况下是二流的。

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      我还注意到,您没有像正面那样多的背景图像。尝试将其增加到至少与您的正面相同,这应该会有所帮助。

      我建议也破解 haar 特征,看看是否能给你带来任何结果。

      如果不查看您的输入数据,其他一切似乎都很好

      【讨论】:

        【解决方案4】:

        适用于任何一个正与一例阳性作斗争的人。 查看文件traincascade/imagestorage.cpp,在类 CvCascadeImageReader::NegReader 和方法 get 和 nextImg

        我必须重写取负样本的逻辑。 当生成软底片时,它们会在原始实现中以步进方式从背景图像缩放。 在我的情况下,背景样本只能随机使用窗口大小/训练大小从这个负片中切出。

        在我的情况下,看起来因为将较大部分的软样本缩放到小窗口中,所以训练很早就停止了,因为它总是模糊负样本,并且 FA 通过与稍后通过级联检测到的真实图像相反

        【讨论】:

        • 顺便说一句。下面链接中关于 NEG 样本随机性的说法是错误的。没有随机拾取,完全确定性地评价一组。 “3. numNeg [..] 它们是随机挑选的(从负片图像中裁剪和缩放)” answers.opencv.org/question/22964/…
        猜你喜欢
        • 2012-08-08
        • 2014-04-21
        • 1970-01-01
        • 1970-01-01
        • 2015-09-12
        • 2015-12-09
        • 2015-05-04
        • 2015-07-25
        • 2021-06-11
        相关资源
        最近更新 更多