OpenCV:良好的训练输出但级联分类器很差
Posted
技术标签:
【中文标题】OpenCV:良好的训练输出但级联分类器很差【英文标题】:OpenCV: Good Training Output but Cascade Classifier is Poor 【发布时间】:2015-10-15 20:09:30 【问题描述】:对 OpenCV 非常陌生,我正在尝试训练一个可以从侧面检测狗图像的 haar 分类器。我以this 教程为指导。作者建议可以使用数量惊人的样本图像来训练一个相对有效的分类器。按照他的指示,我收集了 40 个阳性和 600 个阴性,然后使用提供的脚本以 .vec 文件的形式生成更多样本。 通过以下参数的 20 个阶段的训练大约需要一周半的时间:
<?xml version="1.0"?>
<opencv_storage>
<params>
<stageType>BOOST</stageType>
<featureType>HAAR</featureType>
<height>64</height>
<width>80</width>
<stageParams>
<boostType>GAB</boostType>
<minHitRate>9.9900001287460327e-01</minHitRate>
<maxFalseAlarm>5.0000000000000000e-01</maxFalseAlarm>
<weightTrimRate>9.4999999999999996e-01</weightTrimRate>
<maxDepth>1</maxDepth>
<maxWeakCount>100</maxWeakCount></stageParams>
<featureParams>
<maxCatCount>0</maxCatCount>
<featSize>1</featSize>
<mode>ALL</mode></featureParams></params>
</opencv_storage>
在最后一个阶段,Neg Count Acceptance Ratio 下降到 0.000579 - 我认为这意味着 0.0579% 的负样本被错误地归类为正样本,即在没有狗的情况下有狗。换言之,99.942% 的样本被正确识别。这些对我来说似乎是相当不错的数字,但是当我将分类器 .xml 文件插入面部检测程序时,结果很糟糕。
这是用于分析全黑图像的分类器图片(设备的摄像头平放在工作台上,以防止任何光线进入):
(想象一个黑色的屏幕,有几个随机放置的绿色矩形边框,有些重叠。遗憾的是,我似乎没有必要的声誉来发布真实的东西......)
我对修复分类器的最佳猜测是,我需要使用更大的负样本和正样本池进行重新训练。
我真正想知道的是:为什么接受率和分类器的实际性能如此不同?我是否误解了接受率的含义?如果我对比率的理解是正确的,我应该期望什么样的数字会给我一个有效的分类器?
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:当测试接受率远低于火车接受率时,有两种可能:
-
训练样本(正片和负片)与测试样本有很大不同。在这种情况下,您应该增加样本数量以获得更好的训练分类器的泛化能力。
学习的分类器过度拟合:在这种情况下,学习阶段达到的接受率非常小(1e-6 的数量级)。通常当正负样本数量较少(相对于阶段数)时,就会出现此问题。因此,您可以通过减少阶段数或增加学习样本数(正负样本)来避免过度拟合。
您可以检查这两种可能性。我建议您测试其他特征提取方法,例如 HOG 和 LBP。为此,您只需将 featureType 更改为 HOG 或 LBP。
正负样本的数量取决于样本的多样性。这意味着如果您有一个外观变化很大的对象(在测试图像中),您需要增加正样本的数量(>500)以覆盖所有可能的外观(负样本相同)。
不要忘记更改图像测试的输入参数(min-neighbor、scale、minSize 和 maxSize)。
【讨论】:
谢谢阿里,这真的很有帮助。为了清楚起见,如果您期望接受比以 1e-6 的顺序指示过度拟合,那么我的分类器(比率为 0.000579)很可能只需要更多样本来学习,将其放置在您的两个类别中的第一个。对吗? 我将问题归为此类的唯一问题是,即使我使用训练过的正图像对其进行测试(即训练和测试之间的差异为零),我的分类器仍然无法工作样品)。这样,我的问题的细节似乎并不完全适合这两个选项中的任何一个。我将按照您的建议尝试 LBP 和 HOG。再次感谢您的回复。以上是关于OpenCV:良好的训练输出但级联分类器很差的主要内容,如果未能解决你的问题,请参考以下文章