0

我正在使用 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在此处输入图像描述在此处输入图像描述在此处输入图像描述

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

为问题设置图像后,我继续按照编码 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,但不是我试图检测的对象。谁能帮我调整代码以正确找到对象。非常感谢

4

1 回答 1

1

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

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

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

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

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

要尝试的事情:

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