Подтвердить что ты не робот

Как правильно тренировать каскад

Какова возможная причина "Required leaf false alarm rate achieved. Branch training terminated." Следующая команда для обучения:

для создания образцов

-img imgs/CHE_one_wb.jpg -num 300 -bg imgs/negat.dat -vec imgs/vector.vec -info imgs/smpl/info.txt -maxxangle 0.1 -maxangle 0 -maxzangle 0.1 -maxidev 100 -bgcolor 255 -bgthresh 0 -w 20 -h 35

-img imgs/CHE_one_wb.jpg -num 300 -bg imgs/negat.dat -info imgs/smpl/info.txt -maxxangle 0.1 -maxangle 0.1 -maxzangle 0.1 -maxidev 100 -bgcolor 255 -bgthresh 0 -w 20 -h 35

для поездов

-data imgs/cascade/-vec imgs/vector.vec -bg imgs/negat.dat -numPos 200 -nnNeg 40 -nStStages 10 -featureType LBP -maxFalseAlarmRate 0.9 -w 20 -h 35

РЕЗУЛЬТАТ ТРЕНИРОВКИ

enter image description here

4b9b3361

Ответ 1

Я достиг своей цели и тренировал хороший каскад.

  • Сначала вам понадобится несколько оригинальных образцов (не используйте один и умножьте его на образцы). Я использовал 10 разных фотографий пивных бутылок, для каждого из которых я создал 200 сотен образцов, затем я объединил все образцы в один векторный файл с 2000 образцами.
  • -w 20 -h 35 должен соответствовать соотношению сторон исходного изображения.
  • Отношение положительных образцов к отрицательному должно быть около 2: 1 (должно быть больше положительных образцов)
  • Количество ступеней, которые вы должны выбрать самостоятельно (для меня это 12-13). Чем больше этапов вы зададите, тем точнее будет ваш каскад, но вы также можете перегрузить ваш каскад, и он ничего не найдет. Точность вашего каскада показана принятиеRatio на последнем этапе она должна быть вокруг этого значения 0.000412662 или меньше.

Но если вы получите принятиеRatio, как этот 7.83885e-07, ваш каскад, вероятно, будет перенапряжен, и он ничего не найдет, попробуйте установить меньше этапов.

!!! И еще одна важная вещь, когда вы тренируете свой каскад, вы должны иметь более одной функции на сцене, начиная с 2 или 3 этапа. Если у вас есть только одна функция, вы не получите хороший каскад. Вы должны работать над своими образовательными образами (отрицательные и положительные образцы). Нормальное обучение будет выглядеть следующим образом:

enter image description here

Для обучения я использовал команду -data imgs/cascade/ -vec imgs/vector.vec -bg imgs/negat.dat -numPos 1900 -numNeg 900 -numStages 12 -featureType HAAR -minHitRate 0.999 -maxFalseAlarmRate 0.5 -w 24 -h 30

Оба типа функций работают почти равны, иногда HAAR немного лучше, но значительно медленнее LBP.

Ответ 2

Количество негативов слишком мало по сравнению с количеством положительных элементов и количеством этапов.

Ответ 3

Если у вас небольшое количество данных, вам нужно меньше количества этапов для достижения требуемой скорости ложной тревоги, которую вы настроили. Это означает, что каскадный классификатор "достаточно хорош", поэтому ему не нужно расти дальше. Общее ложное положительное отношение фактически умножается на каждое отношение ступени, поэтому после точки достигается значение.

В ваших настройках вы установите значение 0,9. Подумайте о том, чтобы сделать его выше, например 0,95 или более.

Кроме того, ваши наборы данных небольшие, поэтому алгоритм может получить хорошие результаты при проверке на них во время обучения. Чем меньше набор данных, тем легче для обучения классификатора, поэтому требуется меньше этапов. Но это не означает, что это лучше при работе с реальными данными. Кроме того, если вы сохраните размер обучения на низком уровне и установите более высокий коэффициент, учтите, что классификатору потребуется больше стадий для завершения и будет сложнее, но очень возможно, что он будет переучиваться на тренировочном наборе.

В заключение, если характер ваших положительных и отрицательных факторов, которые у вас есть, делает их легко разделяемыми, тогда вам не нужно так много образцов. Конечно, это зависит от того, для чего вы тренируете алгоритм. С вашим количеством выборок, 10 стадий вы ставите много, поэтому алгоритм заканчивается раньше (это не обязательно плохо).

Когда я тренировал лица, я думаю, что у меня было около 1 тысячи положительных (включая все повороты/отклонения) и 2-3 тысячи негативов, если бы я правильно помнил, для чего нужен классификатор около 11-13 уровней.

Урок Naotoshi Neo мне очень помог.

Кроме того, что я заметил сейчас, как упомянул Сафир, у вас слишком мало отрицательных образцов по сравнению с положительными. Оно должно быть как минимум равным по количеству, предпочтительно в 1,5-2 раза больше, чем положительные.

Ответ 4

Вы устанавливаете maxFalseAlarmRate = 0.9.
Это означает, что на каждом этапе не более 90% из 40 отрицательных выборок (т.е. 36 образцов) должны лежать внутри границы положительных элементов. Когда алгоритму удается помещать вне этой границы не менее 4 выборок, он может перейти на следующий этап.
Это сработало несколько этапов, пока не произошло (случайно), что с самого начала было меньше 36 образцов с положительной границей (помните, что извлечение отрицательных выборок является случайным процессом). Поэтому, когда алгоритм должен работать с разделом, он уже выполнил свою работу, и он не знает, как обрабатывать.

Ответ 5

Это не ошибка! Учитывая представленные образцы и настройки обучения, ваш каскад достиг желаемого потенциала. Либо добавьте больше данных, либо сделайте ваши требования более жесткими! На данный момент он просто заявляет, делает так хорошо, как вы просили...

У вас есть три способа...

  1. Добавьте больше этапов в -numStages, чтобы получить свой этап, например, если вы хотите получить 10 этапов, вы можете написать в параметре -numStages 14, и вы получите 10 или 11 этапов.

2. Вы можете избавиться от этого, увеличив свои данные. Я имею в виду количество ваших положительных и отрицательных изображений. "Старайтесь держать позитив больше, чем негатив"

3. Я читаю это где-то, так что я не знаю, сработает или нет. Вы можете сделать это, увеличив -minHitRate 0,995 и -maxFalseAlarmRate 0,5, эти два параметра получили значение по умолчанию, и вы можете избавиться от своей проблемы, увеличив их до 0,998 и 0,7 и продолжая это делать.

Но, как я уже сказал, это не ошибка.

Ответ 6

У меня также были некоторые проблемы с правильной тренировкой каскада. Я следую инструкциям, которые написал @Dmitry Zaytsev, но не смог получить правильный файл cascade.xml. У меня всегда были такие сообщения, как:

"Требуемая частота ложных тревог листа достигнута. Обучение в филиале прекращено".

или

"Наиболее вероятная причина - недостаточное количество образцов в заданном vec файле".

Наконец-то я это сделал. Я хочу поделиться своими мыслями, хотя я не совсем уверен, что они исправляют. Воспринимайте их как свой собственный опыт, помня, что я не разработчик.

Параметры -w и -h действительно значимы. Все начало работать должным образом, когда я понял, что векторные образцы должны иметь минимально возможный размер, и я прочитал от опытных разработчиков, что 24 - это хороший минимальный размер для этого. Я получил соотношение между осями (ширина и высота), и я использую -w 24 и -h 66 для своей вещи-детектора формы.

Кроме того, я кое-что осознал, когда получил фоновые изображения. Размер заботится. 100 x 100 пикселей это хороший размер (видел в уроках), но я хотел бы верить, что размер должен быть больше, чем изображения ваших векторных образцов !! Это означает, что если вы используете:

opencv_createsamples -vec yourvectorsamplesimages.vec -info path/to/data/file.info -num NumOfPositivesImages -w 24 -h 66
Значения

-w и -h должны быть ниже 100. Я подумал, что, потому что когда я впоследствии использовал opencv_traincascade, это был единственный раз, когда я получил правильный поезд cascade.xml как говорил @Дмитрий Зайцев ранее.

Я знаю, что мое сообщение не является строгим и, возможно, неправильным, но из-за четырех дней борьбы за получение правильного файла cascade.xml я привел к созданию таких отношений.

Просто пытаюсь помочь, поскольку твои сообщения помогли мне. :-)

Спасибо