7

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

我遵循Naotoshi Seo 教程并使用来自Irshad Ali 网站的数据集。不幸的是,生成的模型执行缓慢​​,有很多错误检测。

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)。太感谢了!

4

4 回答 4

3

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

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

于 2013-06-19T15:32:26.013 回答
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 级联还是神经网络),您将获得更好的结果,而数据少得多。这是真正的数据科学工作:精明地选择负数据集和正数据集以及定义边界框的耗时工作。

于 2018-02-08T22:31:39.303 回答
1

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

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

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

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

于 2013-06-19T08:54:58.500 回答
0

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

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

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

于 2019-11-11T19:42:32.030 回答