训练级联分类器检测论文
Training Cascade classifier to detect a paper
我正在尝试训练级联分类器来检测 window(真实房屋 windows)上的论文 (8.5"x11")。基本上,我试图根据论文测量 windows 的宽度和高度。一旦我检测到纸张,我可以通过简单的比率计算得到 window 的宽度和高度(因为纸张是固定尺寸的)
我试过只使用普通纸,但没有成功。它可以检测到纸张,也可以检测到一些 运行dom 对象。它不太可靠,训练只用了 31 分钟。阳性样本是从 15 张不同的纸张图片(裁剪)中生成的。负样本是 300x300 window 图像。
参数:-numStages 1 -nsplits 2 -minHitRate 0.995 -maxFalseAlarmRate 0.9 -numPos 400 -numNeg 400 -w 62 -h 80
现在我正在尝试检测相同尺寸但上面印有对象的纸张(以提供一些图案)。基本上,我打印了一个很大的 Android 标志并尝试训练级联分类器来检测它。这是我的参数:
-numStages 1 -nsplits 2 -minHitRate 0.995 -maxFalseAlarmRate 0.9 -numPos 890 -numNeg 890 -w 62 -h 80
(底片的分辨率为 150x150 像素)
所以我得到了比普通纸更好的效果。我尝试将一些正样本(由 opencv_createsamples 生成)输入级联分类器,它以高精度检测纸张(打印的 Android)。当我输入一个真实的图像(window 和 Android 论文的图片时,分类器根本没有检测到论文。
请注意,当我输入真实图像时,我将其调整为 150x150,因此要检测的对象(纸张)变得更小(大约 31x40),并且我尝试将最小尺寸参数(在 detectMultiScale 中)设置为31x40.
此外,当我尝试增加阶段数时,无论我对 -minHitRate 和 -MaxFalseAlarmRate 参数进行多少试验,它都会给我一个 'required leaf false alarm rate achieved' 错误。即使将这两个参数设置为非常低的值(分别为 0.3 和 0.3)。
大家有什么建议吗?你认为我还应该尝试什么?我正在考虑用更复杂的模式重新训练系统,这会有帮助吗?我只需要一些意见,因为我已经训练我的分类器 3 周,尝试不同的参数和图像大小超过 50 次。我只是累了,运行 没有想法去尝试...
提前致谢。
训练时注意以下几点,一定能取得好成绩-
仅指定您不能没有的参数,例如
-numPos
-numNeg
对其他参数使用 默认值 值,例如
-minHitRate
-maxFalseAlarmRate
-weightTrimRate
-maxDepth
-maxWeakCount
成功生成分类器后,您可以尝试其他值。
获取大量原始正样本和负样本,而不是使用opencv_createsamples从少量样本中创建它们作为训练一次又一次使用相同样本的分类器不会提高其准确性。另请注意,-numPos
不是 .vec 文件中存在的正样本总数。相反,它是要馈送到分类器训练的每个阶段的正样本数量,因此这个数字应该略小于正样本总数,
级联分类器的属性是它们使用一系列弱分类器,以便以低计算成本提供良好的分类。因此,通过足够多的阶段训练分类器非常重要,否则它将无法工作。
检查系统上的可用内存 (RAM) 量并相应地指定以下参数-
-precalcValBufSize
-precalcIdxBufSize
因此,如果您有 1GB 的可用内存,您可以将其分成两半。请记住,您不应消耗所有可用内存,否则您的系统可能会出现故障,或者训练可能会因内存不足而过早终止。
进一步阅读: How to train cascade properly
我正在尝试训练级联分类器来检测 window(真实房屋 windows)上的论文 (8.5"x11")。基本上,我试图根据论文测量 windows 的宽度和高度。一旦我检测到纸张,我可以通过简单的比率计算得到 window 的宽度和高度(因为纸张是固定尺寸的)
我试过只使用普通纸,但没有成功。它可以检测到纸张,也可以检测到一些 运行dom 对象。它不太可靠,训练只用了 31 分钟。阳性样本是从 15 张不同的纸张图片(裁剪)中生成的。负样本是 300x300 window 图像。 参数:-numStages 1 -nsplits 2 -minHitRate 0.995 -maxFalseAlarmRate 0.9 -numPos 400 -numNeg 400 -w 62 -h 80
现在我正在尝试检测相同尺寸但上面印有对象的纸张(以提供一些图案)。基本上,我打印了一个很大的 Android 标志并尝试训练级联分类器来检测它。这是我的参数: -numStages 1 -nsplits 2 -minHitRate 0.995 -maxFalseAlarmRate 0.9 -numPos 890 -numNeg 890 -w 62 -h 80 (底片的分辨率为 150x150 像素)
所以我得到了比普通纸更好的效果。我尝试将一些正样本(由 opencv_createsamples 生成)输入级联分类器,它以高精度检测纸张(打印的 Android)。当我输入一个真实的图像(window 和 Android 论文的图片时,分类器根本没有检测到论文。
请注意,当我输入真实图像时,我将其调整为 150x150,因此要检测的对象(纸张)变得更小(大约 31x40),并且我尝试将最小尺寸参数(在 detectMultiScale 中)设置为31x40.
此外,当我尝试增加阶段数时,无论我对 -minHitRate 和 -MaxFalseAlarmRate 参数进行多少试验,它都会给我一个 'required leaf false alarm rate achieved' 错误。即使将这两个参数设置为非常低的值(分别为 0.3 和 0.3)。
大家有什么建议吗?你认为我还应该尝试什么?我正在考虑用更复杂的模式重新训练系统,这会有帮助吗?我只需要一些意见,因为我已经训练我的分类器 3 周,尝试不同的参数和图像大小超过 50 次。我只是累了,运行 没有想法去尝试...
提前致谢。
训练时注意以下几点,一定能取得好成绩-
仅指定您不能没有的参数,例如
-numPos
-numNeg对其他参数使用 默认值 值,例如
-minHitRate
-maxFalseAlarmRate
-weightTrimRate
-maxDepth
-maxWeakCount成功生成分类器后,您可以尝试其他值。
获取大量原始正样本和负样本,而不是使用opencv_createsamples从少量样本中创建它们作为训练一次又一次使用相同样本的分类器不会提高其准确性。另请注意,
-numPos
不是 .vec 文件中存在的正样本总数。相反,它是要馈送到分类器训练的每个阶段的正样本数量,因此这个数字应该略小于正样本总数,级联分类器的属性是它们使用一系列弱分类器,以便以低计算成本提供良好的分类。因此,通过足够多的阶段训练分类器非常重要,否则它将无法工作。
检查系统上的可用内存 (RAM) 量并相应地指定以下参数-
-precalcValBufSize
-precalcIdxBufSize因此,如果您有 1GB 的可用内存,您可以将其分成两半。请记住,您不应消耗所有可用内存,否则您的系统可能会出现故障,或者训练可能会因内存不足而过早终止。
进一步阅读: How to train cascade properly