Каскадный классификатор 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
Примечание: негативное изображение было извлечено как случайные блоки во всех кадрах видео, затем я просто удалил все, что, по моему мнению, содержало ячейку, т.е. положительное изображение.
После настройки изображений для проблемы я продолжаю запускать классификатор, следуя инструкциям по кодированию:
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, просто чтобы увидеть, обнаружен ли он вообще. Если нет, то вам нужно начать все сначала.