我要做的是检测图像中的2D对象。然而,这个和典型的眼睛/面部检测之间的差异在于,我试图检测的2D对象不会以任何方式进行转换,除了缩放,旋转或部分阻止(例如计算机屏幕截图中的某个图标。)
我试图用一张正像(物体)和600张负像(从背景图像中随机选择)训练一个哈尔级联,但结果并不令人满意。特别是,opencv_createsamples
创建了奇怪的缩放样本(部分被截断,有些缩放得太大)。这些是我使用的参数:
# Create samples
opencv_createsamples -img positive_images/icon.png -bg negatives.txt\
-num 1500 -bgcolor 0 -bgthresh 0 -maxxangle 0 -maxyangle 0 -maxzangle 6.28\
-maxidev 40 -vec pos.vec -maxscale 2 -w 25 -h 25
# Train cascade
opencv_traincascade -data classifier -vec pos.vec -bg negatives.txt\
-numStages 20 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 1000\
-numNeg 600 -w 25 -h 25 -mode ALL -precalcValBufSize 4096\
-precalcIdxBufSize 4096
由于任务似乎比一般的对象检测任务简单,我想知道是否有更好的方法来做到这一点。如果没有,有什么方法可以获得更好的结果?
编辑,这是我正在使用的一些示例图像:
有些有趣的事情是我尝试直接使用opencv_createsamples
(上面)和提供here(direct link)的包装器。 opencv_createsamples
结果不理想。它没有检测到样本图像并将其他不相关的对象分类为正面。然而,使用包装器结果稍微好一点,但它只在有白色背景时检测到对象。我不确定为什么使用包装器会产生这种效果,但我的参数或我使用的方式可能不正确。
目录结构:
- positive_images/
- icon.png
- negative_images/
- 600 images
- classifier/
- positives.txt
- negatives.txt