级联分类器 HAAR LBP 建议

Posted

技术标签:

【中文标题】级联分类器 HAAR LBP 建议【英文标题】:Cascade Classifier HAAR LBP Advice 【发布时间】:2015-09-18 20:57:20 【问题描述】:

我正在使用 OpenCV 和 python 来训练 HAAR 和 LBP 分类器以检测视频帧中的白细胞。由于问题本质上是 2D,因此它应该比开发其他对象分类器更容易​​,并且视频帧之间具有很好的一致性。

到目前为止我一直在使用这个教程:

http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html

这是视频中的一个示例帧,我正在尝试检测较小的明亮物体:

正面图像:-> nubmer=60 -> filetype=JPG -> 宽度 = 50 -> 高度 = 80

负图片:-> number= 600 -> filetype=JPG -> width = 50 -> height = 80

注意负图像被提取为视频中所有帧中的随机框,然后我简单地删除了我认为包含单元格的任何内容,即正图像。

为问题设置图像后,我继续按照编码 robin 的说明运行分类器:

find ./positive_images -iname "*.jpg" > positives.txt

find ./negative_images -iname "*.jpg" > negatives.txt

perl bin/createsamples.pl positives.txt negatives.txt samples 1500  "opencv_createsamples -bgcolor 0 -bgthresh 0 -maxxangle 0.1 -maxyangle 0.1 maxzangle 0.1 -maxidev 40 -w 50 -h 80"

find ./samples -name '*.vec' > samples.txt

./mergevec samples.txt samples.vec

opencv_traincascade -data classifier -vec samples.vec -bg negatives.txt\
-numStages 20 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 60\
-numNeg 600 -w 50 -h 80 -mode ALL -precalcValBufSize 16384\
-precalcIdxBufSize 16384

这会引发错误:

临时阶段的训练数据集无法填充。分部培训终止。

但如果我尝试使用不同的参数,则会生成文件“cascade.xml”,同时使用 HAAR 和 LBP,更改 minHitRate 和 maxFalseAlarmRate。

为了在我的图像上测试分类器,我有一个 python 脚本

import cv2

imagePath = "./examples/150224_Luc_1_MMImages_1_0001.png"
cascPath = "../classifier/cascade.xml"

leukocyteCascade = cv2.CascadeClassifier(cascPath)
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
leukocytes = leukocyteCascade.detectMultiScale(
    gray,
    scaleFactor=1.2,
    minNeighbors=5,
    minSize=(30, 70),
    maxSize=(60, 90),
    flags = cv2.cv.CV_HAAR_SCALE_IMAGE
)
print "Found 0 leukocytes!".format(len(leukocytes))

# Draw a rectangle around the leukocytes
for (x, y, w, h) in leukocytes:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

cv2.imwrite('output_frame.png',image)

这不是找到我想要的对象,当我使用不同的参数运行它时,有时它会找到 67 个对象,有时是 0,但不是我试图检测的对象。谁能帮我调整代码以正确找到对象。非常感谢

【问题讨论】:

【参考方案1】:

当您提供的 OpenCV 图像不足时,有时会引发该错误。您的“train dataset”太小,无法继续运行。

你能提供更多正面的图片吗?我认为 60 可以用于某些对象,但通常人们提供的方法不止于此。

我在您的命令中注意到的另一件事是您提供的负图像与正样本的大小完全相同。 createsamples 所做的是将正面放在负面上,并使用负面作为背景,因此通常使用 **bg**.txt 文件名。如果您可以使用大于正面的底片,我肯定会尝试。

您发布的图片中的白细胞也很模糊。如果它们在您的阳性和样本中模糊不清,而不是您的测试detectMultiscale,那么我怀疑 OpenCV 会找到它们,至少它不会粘住它们,可以这么说。我看到那是您正在使用的视频。您可能已经这样做了,但要让视频保持静止,让 OpenCV 发挥它的魔力!

另外一件事,我会从为这些函数提供最少的参数开始,直到您确切知道自己在做什么。默认设置是有原因的:它们适用于大多数人。使您的样本和 traincascade -w-h 参数相同。让它们变小。 确保只有您尝试检测的对象是您的阳性对象。 OpenCV 可以检测所有大于的对象,而不是您指定的尺寸。这将通过减少您的检测可能出错的事情的数量来帮助您确定您是否遇到了其他类型的问题。

要尝试的事情:

    简化:删除所有您提供的额外参数,即使它们是默认值。 为您的函数指定相同的宽度和高度,您知道这将小于您尝试检测的值 确保您的阳性和样本不模糊 提供更多正面信息(也可能提供负面信息) 我上面没有提到的一个:将你的-minNeighbors 减少到 2 或 3 只是为了看看它是否检测到它们。如果没有,您需要重新开始。

【讨论】:

以上是关于级联分类器 HAAR LBP 建议的主要内容,如果未能解决你的问题,请参考以下文章

opencv5-objdetect之级联分类器

OpenCV3.1.0级联分类器训练与使用

opencv训练好的分类器都有哪些

如何利用OpenCV自带的级联分类器训练程序训练分类器

如果我使用裁剪对象或全帧来训练级联分类器,有啥区别吗?

OpenCV中的Haar级联分类器数据: