Jump to content
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 подвёл своей дорогой, но некачественной камерой.

Share this post


Link to post
Share on other sites
Запускаю сэмпл 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 (метод главных компонент (собственные лица) (на форуме есть), нужно правда его тогда подправить), или другим.

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
Существуют ли в свободном доступе наборы изображений, на которых 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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

  • Like 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Всем привет! Пытался обучать классификатор Хаара, использовал 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

Share this post


Link to post
Share on other sites
Это значит что должно быть столько картинок (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.

Всё просто!

Share this post


Link to post
Share on other sites
Это означает, что на изображении 0018.bmp присутствует 1 искомый объект

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

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites
Должно быть 7000 объектов

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites
мля это полный ппц... даже если 2 сек на 1 картинку.. то 7000 объектов это 4 часа....
Гхм!!! У нас ребята неделю сидели, выбирали.

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
Млин... опять не получилось... обводит кружочками фон(

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

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Я пытаюсь тренировать каскад на четырёх положительных и 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

Share this post


Link to post
Share on other sites
Я пытаюсь тренировать каскад на четырёх положительных и 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/) есть пример, где тренируют на одном положительном сэмпле, а вот негативных должно быть все равно много. негативные при этом выступают, если я не ошибаюсь, в качестве фона, куда помещаются положительные сэмплы.

Share this post


Link to post
Share on other sites
Млин... опять не получилось... обводит кружочками фон(

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
а вот негативных должно быть все равно много.

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×