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

Распознавание лиц HMM (Скрытые марковские модели)

Recommended Posts

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

И насколько мелкими могут быть фотографии? Или под какой размер лучше подгонять изображения? Используя ваш код, при попытке загрузки фото размером 35х43 я получал ошибку доступа к памяти (не может быть прочитана). Есть ли смысл увеличивать изображение до нужного минимального размера?

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


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

Всем привет! Очень сложная тема и с ходу почему то не дается. Пытаюсь применить для MS Visual studio 2010 c++/cli. Может у кого-нибудь завалялись руководства или ссылки на них, был бы очень признателен) Что то вроде такого, пусть даже на английском Детектирование Лиц Каскадами Хаара

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


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

Лучшие книги по теме машинного обучения, в том числе HMM (практические, много иллюстраций и примеров):

Christopher M. Bishop

Pattern Recognition and

Machine Learning

и

Richard O. Duda

Pattern Classification

В интернете можно найти.

ЗЫ: Марковские модели - не та тема которую можно с наскока осилить :)

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


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

Да, все это здорово, но все это чистая математическая теория, без практической реализации на какой-либо платформе. Вы пробовали использовать программу выложенную в начале темы, со своими наборами фотографий? Или только стандартные?

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


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

Пробовал, все работало хорошо, как собственно и должно быть, метод-то общий. А в чем проблема?

ЗЫ: Детектор-Хаара очень простой детектор, и то вопросов по настройке параметров возникает много, а Марковские модели, штука посложнее, и если хотите пользоваться ей осознанно, то нужно осилить теорию.

Вот тут статья по образцу того что Вы Выложили: http://habrahabr.ru/post/109956/

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


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

Я так понял пример программы, который вы прикрепили в начале топика, это на C Builder? Ниразу просто с ним не работал и не встречался) Не имеется подобного проекта для Visual studio с++/cli? А по поводу статьи на хабре, очень доступно, врочем как и всегда, спасибо)

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


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

На билдер она переделана, там в архиве исходный вариант для студии есть, еще где-то на форуме помнится ссылка на еще один вариант была.

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


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

Smorodov, Привет!

Подскажи, вот там есть в алгоритме такой код с подавлением первого коэффициента: (это у меня под си шарп переделано уже, но суть не в этом)


if( SUPPRESS_INTESITY )

                {

                    float[] observations = new float[noObs.height * noObs.width * ( obsVecLen + 1 ) ];


		    hmm.cvlib.cvImgToObs_DCT(iplImg, observations, dctSize, noDCTCoeff, stepSize);


                    ExtractDCT(observations, obsInfoVec[i].obs, noObs.height * noObs.width, obsVecLen);  // Подавляем первый коэффициент ДКП


                    // Очистка

			        if (observations != null)

			        {

                                    observations = null;

			        } 

                }

Вобщем функция cvImgToObs_DCT работает долго если загрузить фотки хотябы 640 на 480 к примеру, потому как массив float[] observations становится очень большим.

Тот же eigenface работает быстрее намного :)

Вот пример фото IWXTV68p.jpg

1. Нужно ли выделять лицо для алгоритма HMM ? с eigenface итак нормально работало без выделения лица. (причем если не выделять лицо HMM у меня иногда ошибки распознавания выдает)

2. Алгоритм так и должен дольше обучаться с большими фотками чем eigenfaces? или можно как то ускорить его? Хотя он даже с маленькими фотками теми что у тебя в программе дольше учиться. Поигрался с параметрами обучения пока ускорить не вышло особо.

С исходным примером в архиве HMMFacesAlpha0_1.zip пока не разобрался, немогу скомпилировать его под студию, хотел посмотреть как оно там будет, но код вроде 1 в 1

3. И есть ли какие то преимущества скрытых марковских моделей перед eigenface?

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


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

1) И HMM и PCA используются обычно как алгоритмы распознавания, а не детектирования (можно обучить и на распознавание, но это отдельная тема), и намного быстрее и эффективнее будет вначале найти область с лицом при помощи алгоритма Viola Jones, а затем уже пытаться узнавать кто это.

2) А зачем ему большие фотки? Наиболее эффективно работать с фотками минимального размера на котором вы сами можете узнать человека, остальное избыточная информация, которую алгоритм должен отсеивать. Просто приводите масштаб изображений к стандартному размеру.

3) Зависит от задачи и реализации. Потенциал марковских моделей больше, но реализация и обучение сложнее.

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


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

Спасибо! потестировал еще и понял что с марковскими моделями меньше ошибок распознавания

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


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

А обьясните на пальцах как работают эти марковские модели :) я понял только что по изображению окно бегает, и что для каждого пикселя в этом окне строится вектор.

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


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

см. пост 55, там ссылка на хабр.

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


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

Да читал я хабр, непойму как вектора по состояниям распределяются, и что дальше делается )

Можешь по коду пояснить?

obsInfoVec[ i ] = cvCreateObsInfo( noObs, obsVecLen ); - вот это я так понял вектора создаются.

а дальше чета не секу, наверное придется отладчиком до посинения смотреть че как считается )))

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


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

Я не влезал в эти дебри пока, имею общее представление.

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

Определенное состояние является конечным, и если система достигла этого состояния, значит паттерн опознан. Ну вот коротко, как я это понимаю. А вообще лучше книжки читать :)

В книжках все написано :)

Christopher M. Bishop

Pattern Recognition and

Machine Learning

и

Richard O. Duda

Pattern Classification

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


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

А не подскажите можно ли построение модели маркова выполнить с использованием видеокарты?

Должно ведь быстрее быть поидее

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


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

Можно. А куда спешка такая ?

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


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

Да у меня вот диссертация по распознаваниям лиц, нада научную новизну ну вот я и подумал про такое :)

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

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


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

набирайте в Google "Hidden Markov Models gpu" :)

и поймете, что тут все истоптано.

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


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

Это неважно, главное что в реальных системах про такое не сказано:) Ну или я не находил таких систем. в основном метод главных компонент везде используется.

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


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

Думаю эти книжки будут полезны (по крайней мере для списка литературы)

Wechsler H. Reliable Face Recognition Methods

и

Li S.Z., Jain A.K. Handbook of Face Recognition

Весь полезный набор можно посмотреть здесь: http://www.amazon.com/tag/face%20recognition?ref_=tag_dpp_cust_itdp_t&store=1

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


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

еще есть fisher faces(LDA) вроде лучше справляется с изменением освещенности.

сравнение c PCA http://www.cs.columbia.edu/~belhumeur/journal/fisherface-pami97.pdf

еще какие то вариации

1-s2.0-S0950705112000548-gr2.jpg

еще некоторый материал

http://www.stat.ucla.edu/~sczhu/Courses/UCLA/Stat_231/Stat_231.html

http://kingpotter1990.bol.ucla.edu/papers/EigenFace.pdf

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


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

Smorodov, щас ваш проект билдеровский скомпилировал под рабочим компом с линуксом (opensuse 12.1 kde 4.8)в консольном QT проекте на чистом C++, и что то оно гораздо быстрее работает с теми же самыми выборками, чем у меня дома в винде на си шарпе с использованием того враппера что ShurikEV предлагал. Прям в разы.

А дома комп гораздо быстрее :) что то тут не то :) попробую дома скомпилить под C++ в студии.

Правда под линем библиотека 2.4 а дома 2.3.1, и и на лине консольный проект а дома виндовый под GUI.

Неужели сишный код настолько быстрее :)

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

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


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

Smorodov, щас ваш проект билдеровский скомпилировал под рабочим компом с линуксом (opensuse 12.1 kde 4.8)в консольном QT проекте на чистом C++, и что то оно гораздо быстрее работает с теми же самыми выборками, чем у меня дома в винде на си шарпе с использованием того враппера что ShurikEV предлагал. Прям в разы.

А дома комп гораздо быстрее :) что то тут не то :) попробую дома скомпилить под C++ в студии.

Правда под линем библиотека 2.4 а дома 2.3.1, и и на лине консольный проект а дома виндовый под GUI.

Неужели сишный код настолько быстрее :)

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

Я в итоге реализовал на С++, а на С# написал враппер на некоторые функции. На плюсах действительно все быстрее работает, главное избегать утечек памяти

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×