Opencv 自训练HAAR分类器会导致令人失望的低精度

Opencv 自训练HAAR分类器会导致令人失望的低精度,opencv,object-detection,haar-classifier,cascade-classifier,Opencv,Object Detection,Haar Classifier,Cascade Classifier,我正在训练一个哈尔分类器来检测壁球拍的头部。 不幸的是,在准确性方面的结果相当糟糕,我想了解我的流程有哪些缺陷。在这一点上,我并不担心性能,因为我不会将其用作实时检测器 阴性样本 我使用一些在线图像数据库获取随机图片(不同宽度和高度)。 我还添加了一些与壁球相关的负面图片,比如空球场,或者球员在没有球拍头的球场上的照片(总共不到20张)。 阳性样本 我总共创建了4168个阳性样本,其中 168是游戏录音的手动注释快照 4000个样本是使用opencv_createsamples创建的

我正在训练一个哈尔分类器来检测壁球拍的头部。 不幸的是,在准确性方面的结果相当糟糕,我想了解我的流程有哪些缺陷。在这一点上,我并不担心性能,因为我不会将其用作实时检测器

阴性样本
  • 我使用一些在线图像数据库获取随机图片(不同宽度和高度)。
  • 我还添加了一些与壁球相关的负面图片,比如空球场,或者球员在没有球拍头的球场上的照片(总共不到20张)。
阳性样本 我总共创建了4168个阳性样本,其中

  • 168是游戏录音的手动注释快照
  • 4000个样本是使用opencv_createsamples创建的
    opencv_createsamples-img img/sample/r2_white.png-bg img/neg.txt-info img/generated/info.txt-pngoutput img/generated-maxangle 0.85-maxyangle-0.85-maxzangle 0.85-num 4000

    我使用了相对较高的最大角度,因为我觉得这更能代表壁球拍在比赛录音中的表现。
矢量 在合并了手动注释的样本和生成的样本的注释之后,我使用以下参数创建了向量:
opencv_createsamples-info img/pos_all.txt-num 4168-w 25-h 25-vec model/vector/posities_all.vec-maxangle 0.85-maxyangle-0.85-maxzangle 0.85

训练 我用以下参数训练模型。再次添加-模式,因为我觉得功能的旋转更能代表真实世界的壁球游戏。
opencv\u traincascade-data../model-vec../model/vector/positives\u all.vec-bg neg.txt-numPos 3900-numNeg 7000-numStages 10-w 25-h 25-numThreads 12-maxfalsalarmrate 0.3-mode all-precalcValBufSize 3072-precalcIdxBufSize 3072

培训总共花费了大约10个小时,但即使在最后阶段的第100个样本中,假警报仍然为0.84(前提是我正确解释了培训输出)。 在第5阶段结束时,最低值为0.74

=======培训9阶段=====

根据我的理解,haar分类器在较大的旋转(x,y,z)时存在问题。成功的人脸haar分类器是在单一方向上训练的,因此有一个用于正面,另一个用于侧面。此外,您还需要更多的阴性样本(最好是空法庭和人员)。创建示例时,应确保应用了透明背景。最好增加阶段数,将误报率提高到0.5。谢谢@Mika。特别是旋转钻头是一个很好的线索。我想我可能必须研究深度学习检测器才能使这个例子起作用,但同时我想弄清楚我的方法的主要问题是什么。作为一个例子,对于负片样本,我使用了150k负片小图像和大约50k全尺寸图像。使用15k正对象样本和以下设置:
-numPos 12500-numNeg 25000-minHitRate 0.999-MaxFalseArmRate 0.5-w 24-h 24
培训期间最重要的信息是:负计数接受率:这应该大致符合每个阶段的最大假报警率,因此,如果你有0.5 maxFAR,你应该在第0阶段后看到大约0.5,在第1阶段后看到0.5^2,等等。如果这个值小得多,你的负样本不够清晰。如果太高,则分类器太弱。所有样本都直接来自工业用例,因此训练和目标域非常熟悉。第9阶段为0.03,而理论值为0.3^9=0.000019683。imho是对象太复杂而无法训练的指标(例如,不同的旋转没有共享足够的特征)。