级联分类器 HAAR LBP 建议
Cascade Classifier HAAR LBP Advice
我正在使用 OpenCV 和 python 来训练 HAAR 和 LBP 分类器来检测视频帧中的白细胞。由于问题本质上是二维的,因此它应该比开发其他对象分类器更容易,并且视频帧之间的一致性很高。
到目前为止,我一直在使用本教程:
http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html
这是视频中的示例帧,我在其中尝试检测较小的明亮物体:
正图像:-> nubmer=60 -> filetype=JPG -> width = 50 -> height = 80
负片图像:-> 数量= 600 -> 文件类型=JPG -> 宽度= 50 -> 高度= 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
这会引发错误:
Train dataset for temp stage can not be filled. Branch training terminated.
但如果我尝试使用不同的参数,则会生成文件 '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,但不是我试图检测的对象。谁能帮我调整代码以正确找到对象。非常感谢
有时当您提供的 OpenCV 图像不足时会抛出该错误。您的“train dataset
”太小,无法继续运行。
能否提供更多正面图片?我认为 60 可以用于某些对象,但通常人们提供的方式不止于此。
我在您的命令中注意到的另一件事是您提供的负图像与正样本的大小完全相同。 createsamples
所做的是将你的正面放在你的底片上,并使用底片作为背景,因此通常使用 **bg**.txt
文件名。如果你能用比正数大的负数,我一定会试试。
您发布的图像中的白细胞也很模糊。如果它们在你的阳性和样本中模糊而不是你的测试 detectMultiscale
,那么我怀疑 OpenCV 会找到它们,至少它不会坚持它们,可以这么说。我看到那是您正在使用的视频。你可能已经这样做了,但是让你保持视频静止不动,让 OpenCV 发挥它的魔力!
另一件事,我将从为这些函数提供最少的参数开始,直到您确切地知道自己在做什么。默认值存在是有原因的:它们适用于大多数人。使您的示例和 traincascade
-w
和 -h
参数相同。把它们变小。 确保只有您要检测的对象在您的正片中。 OpenCV 可以检测所有比您指定的尺寸 大 的对象。这将通过减少检测可能出错的数量来帮助您确定您是否遇到了其他类型的问题。
要尝试的事情:
- 简化:删除您提供的所有这些额外参数,即使它们是默认值。
- 为您的函数指定相同的宽度和高度,您知道这些函数会比您尝试检测的要小
- 确保您的正片和样本不模糊
- 提供更多正面信息(也许还有负面信息)
- 我在上面没有提到的一个:将你的
-minNeighbors
减少到 2 或 3 只是为了看看它是否被检测到。如果不是,您需要重新开始。
我正在使用 OpenCV 和 python 来训练 HAAR 和 LBP 分类器来检测视频帧中的白细胞。由于问题本质上是二维的,因此它应该比开发其他对象分类器更容易,并且视频帧之间的一致性很高。
到目前为止,我一直在使用本教程:
http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html
这是视频中的示例帧,我在其中尝试检测较小的明亮物体:
正图像:-> nubmer=60 -> filetype=JPG -> width = 50 -> height = 80
负片图像:-> 数量= 600 -> 文件类型=JPG -> 宽度= 50 -> 高度= 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
这会引发错误:
Train dataset for temp stage can not be filled. Branch training terminated.
但如果我尝试使用不同的参数,则会生成文件 '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,但不是我试图检测的对象。谁能帮我调整代码以正确找到对象。非常感谢
有时当您提供的 OpenCV 图像不足时会抛出该错误。您的“train dataset
”太小,无法继续运行。
能否提供更多正面图片?我认为 60 可以用于某些对象,但通常人们提供的方式不止于此。
我在您的命令中注意到的另一件事是您提供的负图像与正样本的大小完全相同。 createsamples
所做的是将你的正面放在你的底片上,并使用底片作为背景,因此通常使用 **bg**.txt
文件名。如果你能用比正数大的负数,我一定会试试。
您发布的图像中的白细胞也很模糊。如果它们在你的阳性和样本中模糊而不是你的测试 detectMultiscale
,那么我怀疑 OpenCV 会找到它们,至少它不会坚持它们,可以这么说。我看到那是您正在使用的视频。你可能已经这样做了,但是让你保持视频静止不动,让 OpenCV 发挥它的魔力!
另一件事,我将从为这些函数提供最少的参数开始,直到您确切地知道自己在做什么。默认值存在是有原因的:它们适用于大多数人。使您的示例和 traincascade
-w
和 -h
参数相同。把它们变小。 确保只有您要检测的对象在您的正片中。 OpenCV 可以检测所有比您指定的尺寸 大 的对象。这将通过减少检测可能出错的数量来帮助您确定您是否遇到了其他类型的问题。
要尝试的事情:
- 简化:删除您提供的所有这些额外参数,即使它们是默认值。
- 为您的函数指定相同的宽度和高度,您知道这些函数会比您尝试检测的要小
- 确保您的正片和样本不模糊
- 提供更多正面信息(也许还有负面信息)
- 我在上面没有提到的一个:将你的
-minNeighbors
减少到 2 或 3 只是为了看看它是否被检测到。如果不是,您需要重新开始。