我正在使用OpenCV和python来训练HAAR和LBP分类器来检测视频帧中的白细胞。由于问题本质上是2D,因此它应该比开发其他对象分类器更容易,并且视频帧之间存在很大的一致性。
到目前为止,我一直在使用本教程:
http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html
这是视频的示例帧,我试图检测较小的明亮物体:
正面图像: - > nubmer = 60 - > filetype = JPG - > width = 50 - > height = 80
负片图片: - > number = 600 - > filetype = JPG - > width = 50 - > height = 80
N.B。在视频中的所有帧中,负片图像被提取为随机盒,然后我简单地删除了我认为包含单元格的任何内容,即正片。
设置了问题的图像后,我按照编码知识的说明继续运行分类器:
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,但不是我试图检测的对象。任何人都可以帮我调整代码以正确找到对象。非常感谢
答案 0 :(得分:1)
有时,当您提供OpenCV的图像不足时,会抛出该错误。你的" train dataset
"太小了,不能继续前进。
你能提供更多正面图片吗?我认为60可以用于某些对象,但通常人们提供的方式不止于此。
我在你的命令中注意到的另一件事是你提供的负像与你的阳性样本完全相同。 createsamples
做的是将你的积极因素放在你的底片上,并使用底片作为背景,因此常用**bg**.txt
文件名。如果你可以使用大于你的肯定的负数,我肯定会尝试。
您发布的图像中的白细胞也很模糊。如果他们的积极因素模糊不清样品,而不是你的测试detectMultiscale
,那么我怀疑OpenCV会找到它们,至少它不会坚持它们,可以这么说。我看到那是你正在使用的视频。你可能已经做到了这一点,但是让你保持视频仍然足以让OpenCV发挥其魔力!
另一件事,我会先为这些功能提供最少的参数,直到你确切知道自己在做什么为止。默认是有原因的:它们适用于大多数人。使您的样本和traincascade
-w
和-h
参数保持一致。让它们变小。 确保只有您要检测的对象才是正面的。 OpenCV可以检测比指定尺寸更大的所有对象。这可以帮助您通过减少检测可能出错的数量来确定您是否遇到其他类型的问题。
要尝试的事情:
-minNeighbors
减少到2或3只是为了看它是否被检测到。如果不是,你需要重新开始。