我正在使用 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,但不是我试图检测的对象。谁能帮我调整代码以正确找到对象。非常感谢