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

Вещи, чтобы попробовать:

  1. Упростите: удалите все дополнительные параметры, которые вы предоставляете, даже если они по умолчанию.
  2. Укажите ширину и высоту для тех функций, которые, как вы знаете, будут меньше, чем те, которые вы пытаетесь обнаружить
  3. Убедитесь, что ваши позитивы и образцы не размыты
  4. Предоставьте больше позитива (и, возможно, негатива тоже)
  5. Тот, который я не упомянул выше: уменьшить -minNeighbors до 2 или 3, просто чтобы увидеть, обнаружен ли он вообще. Если нет, то вам нужно начать все сначала.
Другие вопросы по тегам