Перейти к содержимому
Compvision.ru
ProgerX

Тренировка каскадов Хаара

Recommended Posts

Запускаю сэмпл facedetect из пакета OpenCV вот так:

./facedetect --cascade=../../haarcascades/haarcascade_frontalface_alt2.xml 0

Помимо моего лица, он находит штуки два на обоях, дверях. Не очень радуют меня эти сбои, покуда есть подозрения, что такие сбои только из-за моей вебкамеры (Logitech QuickCam Communicate Deluxe). Кто-нибудь пробовал работать с этим приложением? Часто ли оно даёт у Вас подобные сбои?

На самом деле, камера просто отвратительно нечёткая. Вот пример её съёмки: http://rapidshare.de/files/47770677/capture2.avi.html далее я поднимаю насыщенность. Видно что пиксели так и не могут усидеть на месте :) В этом-то и проблема :) Вдруг, если именно по аналогии камера и "создаёт" фейковые лица, что opencv путается постоянно..

Кстати, а никто не знает ли как там происходит распознавание лица? По одному кадру или анализируются и предыдущие? Если первое - то проблема не в камере, а в алгоритме OpenCV, а если второе.. то вполне возможно, что logitech подвёл своей дорогой, но некачественной камерой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Запускаю сэмпл facedetect из пакета OpenCV вот так:

./facedetect --cascade=../../haarcascades/haarcascade_frontalface_alt2.xml 0

Помимо моего лица, он находит штуки два на обоях, дверях. Не очень радуют меня эти сбои, покуда есть подозрения, что такие сбои только из-за моей вебкамеры (Logitech QuickCam Communicate Deluxe). Кто-нибудь пробовал работать с этим приложением? Часто ли оно даёт у Вас подобные сбои?

На самом деле, камера просто отвратительно нечёткая. Вот пример её съёмки: http://rapidshare.de/files/47770677/capture2.avi.html далее я поднимаю насыщенность. Видно что пиксели так и не могут усидеть на месте :) В этом-то и проблема :) Вдруг, если именно по аналогии камера и "создаёт" фейковые лица, что opencv путается постоянно..

Кстати, а никто не знает ли как там происходит распознавание лица? По одному кадру или анализируются и предыдущие? Если первое - то проблема не в камере, а в алгоритме OpenCV, а если второе.. то вполне возможно, что logitech подвёл своей дорогой, но некачественной камерой.

С опцией CV_HAAR_FIND_BIGGEST_OBJECT, команда cvHaarDetectObjects находит наибольший по размеру объект проходящий по классификаторам.

Если хотите избавиться от помех камеры, можно попробовать накапливать кадры, используя видеоаккумулятор, например, так (это фрагмент):

// Grab - изображение, поступивше с камеры

if(!gray) {gray = cvCreateImage(cvSize(Grab->width,Grab->height), IPL_DEPTH_8U, 1);}
if(!gray_f){gray_f = cvCreateImage(cvSize(Grab->width,Grab->height), IPL_DEPTH_32F, 1);}
if(!accum_f){accum_f = cvCreateImage(cvSize(Grab->width,Grab->height), IPL_DEPTH_32F, 1);}

cvCvtColor(Grab, gray, CV_BGR2GRAY); // Получаем серый цвет

cvConvertScale( gray, gray_f);
// Это усреднитель 0.3 - коэффициент вклада каждого кадра
cvRunningAvg( gray_f,accum_f,0.3);

cvConvertScale( accum_f, gray);[/code]

Что касается распознавания, то используется один кадр (алгоритм Виолы-Джонса (он-же каскады Хаара, правда не совсем)). И еще, точность алгоритма, составляет порядка 80-95% так что ложные срабатывания (в небольшом количестве) допустимы. Для улучшения качества распознавания можно также применять пирамиду cvPyrDown (кажется), хотя я пробовал, эффект не очень заметный. Можно использовать результаты распознавания Хааром, как промежуточный результат для другого метода, например PCA (метод главных компонент (собственные лица) (на форуме есть), нужно правда его тогда подправить), или другим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На самом деле распознаёт лица оно достаточно хорошо! Я бы даже сказал - очень хорошо. Ну подумаешь, раз в 7 секунд бывает вот так:

http://i041.radikal.ru/0907/72/9341b1d8177e.png

т.е. помимо лиц он видит ещё какое-то, которое я не вижу :) Ну зато как накодить там надо, чтобы он лица аж на коробке разглядывал! Это ж превосходная работа! Причём те 5 лиц он находит постоянно!

(это каскад, который *_alt_tree.xml - он даёт меньше сбоев).

PS смотрю на скриншот.. а всё-таки изображение с камеры - полный отстой. Плюс к этому ещё я слишком близко поднёс коробку - не в фокусе получилось.

Кстати, по поводу того, что искать окружность наибольшего радиуса.. мне кажется такое не прокатит, покуда оно видит лица на стене, которые явно больше моего, моей окружности :)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Существуют ли в свободном доступе наборы изображений, на которых OpenCV с заданной моделью распознавателя из стандартной комплектации (например, haarcascade_frontalface_alt2.xml) гарантированно находит лица?

Возникла проблема проверки правильности подключения OpenCV в проект.

Попутно другой вопрос - какая модель предпочтительней для изображений низкого и среднего качества (любительские фото в интернете)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Существуют ли в свободном доступе наборы изображений, на которых OpenCV с заданной моделью распознавателя из стандартной комплектации (например, haarcascade_frontalface_alt2.xml) гарантированно находит лица?

Возникла проблема проверки правильности подключения OpenCV в проект.

Попутно другой вопрос - какая модель предпочтительней для изображений низкого и среднего качества (любительские фото в интернете)?

Излюбленный пример при демонстрациях машинного зрения и обработки изображений

C:\Program Files\OpenCV\samples\c\lena.jpg

Что касается разрешения, то HaarClassfiers не особо к нему чувствительны, насколько я понял, они все равно уменьшают окно сканирования до 24х24

см. здесь http://www.cs.utexas.edu/~grauman/courses/...la_cvpr2001.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Опишите плз, как сгенерировать на основе одного эталонного объекта заданное количество случаев с помощью createsamples.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Опишите плз, как сгенерировать на основе одного эталонного объекта заданное количество случаев с помощью createsamples.

Вот тут есть: Обучение каскадов Хаара

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно ли с помощью каскада Хаара находить автомобильные номера или лутше использовать какой нибудь другой метод?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем привет! Пытался обучать классификатор Хаара, использовал haarkit.

Но вышло как то не очень... Почему то детектируется фон, Куча разноцветных кружочков)

- npos <number_of_positive_samples>,

- nneg <number_of_negative_samples>

количество положителных/отрицательных образцов используемых при обучении каждого уровня классификатора. Разумные значения: npos = 7000 и nneg = 3000.

Это значит что должно быть столько картинок (7000, 3000)? и причем у положительных должны быть выделены объекты типа:

rawdata/0018.bmp 1 90 22 55 68

rawdata/0019.bmp 1 81 19 59 76

rawdata/0020.bmp 1 83 19 53 73

?

http://www.iem.pw.edu.pl/~domanskj/haarkit.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Это значит что должно быть столько картинок (7000, 3000)?
Да, именно так.

rawdata/0018.bmp 1 90 22 55 68

rawdata/0019.bmp 1 81 19 59 76

rawdata/0020.bmp 1 83 19 53 73

Это означает, что на изображении 0018.bmp присутствует 1 искомый объект, причём его кординаты: x = 90, y = 22, width = 55, height = 68.

Всё просто!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Это означает, что на изображении 0018.bmp присутствует 1 искомый объект

Это я понял, я в смысле, должно быть 7000 картинок с описаниями (0018.bmp 1 90 22 55 68) объектов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Это я понял, я в смысле, должно быть 7000 картинок с описаниями (0018.bmp 1 90 22 55 68) объектов?

Должно быть 7000 объектов, а не картинок. А описаний столько, сколько самих картинок.

Если на одном изображении присутствует, например 2 объекта, то описание будет выглядеть так:

4_0344.bmp 2 295 153 9 17 349 153 10 18

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Должно быть 7000 объектов

мля это полный ппц... даже если 2 сек на 1 картинку.. то 7000 объектов это 4 часа....

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
мля это полный ппц... даже если 2 сек на 1 картинку.. то 7000 объектов это 4 часа....

Вот-вот! И я про то же! Я где-то сотни три для положительных сэмплов использовал - что-то похожее получается. А негативные сэмплы - просто чтобы не содержали искомый образец. Так потом эта программулина, которая обучает каскад, еще очень долго работает, чтобы достичь нужного порога распознавания. Причем не всегда получается. Короче, долго и нудно. Лучше всего это делают китайцы :)...

З.Ы. Кроме того, как показывает опыт использования, каскад плохо отрабатывает поворот изображения - мне пришлось делать это вручную: детект - нет результата - поворот - детект - и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А имеет значение размер изображения?

К примеру если я обучаю каскад на картинках 320x240, а использовать буду на 160х120.

И имеет ли значение поворот объекта?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
мля это полный ппц... даже если 2 сек на 1 картинку.. то 7000 объектов это 4 часа....
Гхм!!! У нас ребята неделю сидели, выбирали.

К примеру если я обучаю каскад на картинках 320x240, а использовать буду на 160х120
Мой личный опыт (но никак не знание теории) подсказывает, что лучше обучать на минимальных объектах. Впрочем, здравый смысл говорит мне о том же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Млин... опять не получилось... обводит кружочками фон(

Как же правильно делать :)

Какой фон предпочтительнее?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Млин... опять не получилось... обводит кружочками фон(

Как же правильно делать :)

Какой фон предпочтительнее?

Тут есть исходник, позволяющий набирать положительные примеры из видеопоследовательности:

http://www.tutorialized.com/view/tutorial/...Resources/43410

И кое-какие ресурсы по теме.

Еще один ресурс:

http://note.sonots.com/SciSoftware/haartraining.html

Там автор говорит, что тренировал каскад неделю. Есть ссылки на файлы фона.

Правда статьи на англ., но основное можно понять и так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я пытаюсь тренировать каскад на четырёх положительных и 5 негативных образцах. Но при этом объект не находится даже на фотографии с положительным образцом?

aartraining -data handcascade -vec hand10.vec -bg PH\bg.dat -nstages 10 -nsplits 2 -minhitrate 0.999 -maxfalsealarm 0.5 -npos 4 -nneg 5 -w 10 -h 10 -nonsym -mem 128 -mode ALL

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Я пытаюсь тренировать каскад на четырёх положительных и 5 негативных образцах. Но при этом объект не находится даже на фотографии с положительным образцом?

aartraining -data handcascade -vec hand10.vec -bg PH\bg.dat -nstages 10 -nsplits 2 -minhitrate 0.999 -maxfalsealarm 0.5 -npos 4 -nneg 5 -w 10 -h 10 -nonsym -mem 128 -mode ALL

маловато будет, наверное. на хабре (www.habrahabr.ru - тема про поиск НЛО :) - http://habrahabr.ru/blogs/artificial_intelligence/67937/) есть пример, где тренируют на одном положительном сэмпле, а вот негативных должно быть все равно много. негативные при этом выступают, если я не ошибаюсь, в качестве фона, куда помещаются положительные сэмплы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Млин... опять не получилось... обводит кружочками фон(

Как же правильно делать :)

Какой фон предпочтительнее?

Фон - чем больше вариантов, тем лучше для обучения - меньше ложных детектов будет. Главное, чтобы негативные изображения точно не содержали искомый объект. А что ищещь, если не секрет? Плюс еще можно поиграться с параметрами процедуры поиска объектов: алгоритм поиска, порог принятия решения.

Я процент ложных срабатываний убирал так: cvHaarDetectObjects( PCvArr(SrcImage), Cascade, Storage, 1.1, 4, CV_HAAR_DO_CANNY_PRUNING , ImSize );

1.1 - параметр, который определяет шаг приращения масштаба при поиске объектов (10%, как я понял);

4 - порог срабатывания - чем ниже, тем больше детектов, но выше процент ложных срабатываний; я для поиска лиц у себя использовал это значение;

CV_HAAR_DO_CANNY_PRUNING - алгоритм, который используется в процессе выделения признаков - почему выбрал не помню, но вроде с ним получились наилучшие результаты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
а вот негативных должно быть все равно много.

В общем что бы не детектировал фон я решил по пробывать отсекать его (заливать белым) оставляя только объект. получается негативные мне почти совсем не нужны?

хм... что получится из этого позже отпишу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ничего не получается...

Кто тренировал и у кого получилось, покажи плиз какого вида картинки вы использовали в negative и positive

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Фон отсекать как раз нельзя, каскад должен знать типичные отрицательные признаки. Грубо говоря, при проходе по каскаду подсчитывается сумма весов для каждой haar-feature. Значение очередной haar-feature сверяется с некоторым порогом. Если оно больше порога, то к сумме прибавляется один вес, если меньше - другой. Веса могут быть либо отрицательными, либо положительными в зависимости от того, удовлетворяет значение искомому объекту или нет. Веса и пороги формируются при обучении.

Если ты затираешь фон, то значения весов, соответствующие ложной сработке, будут равны нулю (или почти нулю). А они должны быть отрицательными. Соответственно сумма всех весов будет больше, чем должна; отсюда ложные сработки.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×