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

Метод Виолы-Джонса (есть пара вопросов)

Recommended Posts

Здравствуйте!

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

Работа алгоритма. Основные понятия.

Данный алгоритм использует признаки Хаара для обнаружения черт лица. В алгоритме фигурируют такие понятия как: интегральное изображение, пирамида изображения, ближайшие соседи, метод движущегося окна и каскад классификаторов. То есть мы берем изображение, переводим его в интегральное изображение, затем при помощи движущего окна обходим все изображение, применяя признаки Хаара.

Вопросы:

1. Верно ли то, что я выше написал, касаемо работы алгоритма?

2. Еще мне не понятна работа каскада классификаторов

3. Обязательно ли использовать пирамиду изображения и ближайших соседей в данном алгоритме?

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


Ссылка на сообщение
Поделиться на других сайтах
7 hours ago, ViolaJones said:

3. Обязательно ли использовать пирамиду изображения и ближайших соседей в данном алгоритме?

Виола Джонс не использует пирамиду, а бегает разными размерами окон и скалирует фичи.

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


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

А как насчет каскада? Мое понимание такое: берем окно двигаем его по изображению и внутри этого окна вычисляем фичи. Я только не пойму, вот например я беру 4 признака, они все внутри окна применяются или только 1 из 4 ?

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


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

Делал как то презентацию для лекции. Надеюсь прояснит основные моменты.

Детектор лиц на основе метода Виолы-Джонса.rar

AdaBoost.pdf

  • Like 1

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


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

То есть мне сначала нужно обучить классификатор и только потом его использовать его в параллельной версии программы?

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

OpenCV

https://github.com/MyOwnStar/red_ninjas

https://github.com/MyOwnStar/EEC-277---GPU-Face-Detect

В OpenCV вообще лезть не стал, там 2000+ строчек, чет мне страшновато стало)

Во втором варианте там как раз таки используется image pyramid и данные классификатора (файлы class.txt info.txt)

А вот третий не использует пирамиду, а скалирует фичи и использует всего 4 классификатора (В качестве kernel)

Меня вот это все и запутало, в одном так, в другом так. Не как не могу план действий составить, точнее не до конца

План

1. Загрузить image

2. Перевести его в grayscale

3.Затем в интегральное изображение (вот это уже можно параллелить)

4.А дальше?

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


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

А реализуете просто из любви к искусству или есть какие то специфические запросы, которым не соответствуют существующие реализации ?

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


Ссылка на сообщение
Поделиться на других сайтах
30 минуты назад, Smorodov said:

А реализуете просто из любви к искусству или есть какие то специфические запросы, которым не соответствуют существующие реализации ?

Да это тема моей дипломной работы) Изначально я думал, что запрограммирую пару алгоритмов на cpu и gpu ну и покажу, что некоторые алгоритмы целесообразней давать на исполнение gpu. Я собственно так и сделал, но это пошло на курсовую (сказали, что выше сделанной работы не достаточно).

 

А про реализации, они то подходят(правда 2ая у меня в бесконечный цикл уходит), но я их понять не могу. 

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


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

Какие примитивы вы будете использовать или писать чистые *.cu kernels?

Например ля интегральных изображений вроде как есть:

cv::cuda::integral

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


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

Может вам перевести на gpu что-то другое, чего еще никто не риализовал,, виола-джонс уже и так напихан в каждый "холодильник" и ничего нового вы не сделаете. Слабо себе переставляю диплом в котором переписывается то что давно  реализованное(причем явно будет медленнее) и доказывается что на задаче со скользящим окном gpu быстрее cpu.

  • Like 1

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


Ссылка на сообщение
Поделиться на других сайтах
28 минуты назад, mrgloom said:

Какие примитивы вы будете использовать или писать чистые *.cu kernels?

Например ля интегральных изображений вроде как есть:

cv::cuda::integral

Если Вы про то, чтобы использовать готовые решения, то нет. Я буду писать сам, опираясь на реализации которые я нашел. Все таки диплом подразумевает самостаятельно сделанную работу. OpenCv буду использовать только для работы с изображениями (загрузка, перевод в grayscale и тд.) 

Примитивы только прямоугольные

19 минуту назад, iskees said:

Может вам перевести на gpu что-то другое, чего еще никто не риализовал,, виола-джонс уже и так напихан в каждый "холодильник" и ничего нового вы не сделаете. Слабо себе переставляю диплом в котором переписывается то что давно  реализованное(причем явно будет медленнее) и доказывается что на задаче со скользящим окном gpu быстрее cpu.

А что например?

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

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


Ссылка на сообщение
Поделиться на других сайтах
1 minute ago, ViolaJones said:

Если Вы про то, чтобы использовать готовые решения, то нет. Я буду писать сам, опираясь на реализации которые я нашел. Все таки диплом подразумевает самостаятельно сделанную работу. OpenCv буду использовать только для работы с изображениями (загрузка, перевод в grayscale и тд.) 

А смысл оптимизировать вычисление интеграла? Там никакой научной новизны нет.

 

2 minutes ago, ViolaJones said:

А что например?

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

<зануда mode on>Предполагается, что диплом пишут очень умные люди, чтобы подтвердить что они таковыми являются, для магистерской диссертации даже есть формальное требование научной новизны</зануда mode on>

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


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

для примера, то чего не хватает для моих задач:

  1. Различные адаптивные бинаризации
  2. Все что связано с контурами, их поиск и фильтрация 
  3. ASM, AAM 

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


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

DLIB-овский детктор лиц работает получше детектора Виолы-Джонса.

Может его рассмотреть для переноса на GPU ?

"As for the accuracy, it's easy to get the same detection rate as OpenCV but with thousands of times fewer false alarms. "

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


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

Какие примитивы вы будете использовать или писать чистые *.cu kernels?

Я имел ввиду что есть вариант писать всё с нуля через *.cu kernels или использовать какие либо NPP, thrust, gpu:Mat и т.д.


 

Цитата

 

DLIB-овский детктор лиц работает получше детектора Виолы-Джонса.

Может его рассмотреть для переноса на GPU ?

"As for the accuracy, it's easy to get the same detection rate as OpenCV but with thousands of times fewer false alarms. "

 

Он же вроде как построен на hog+linear svm?

И надо устроить точное сравнение.

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


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

Да, кстати, анализ существующих решений, важная часть научной работы.

Как результат анализа, показать сильные и слабые стороны каждого решения, оценить перспективность переноса блоков на GPU.

А по ходу и сами сориентируетесь чем точно хотите заниматься, что улучшить.

Приаттачил памятку о написании работ по машинному обучению.

Но структура для машинного зрения будет примерно та же.

CraftingPapersOnMachineLearning.pdf

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


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

Можно рассмотреть разные бустинги: WaldBoost, JointBoost и т.д.

Потом разные каскады: hard cascade(классический как у viola-jones), soft cascade, crosstalk cascade.

(еще есть Surf Cascade, Joint Cascade, но это только названия, а так немного не в ту степь)

Разные фичи: Haar Features(как у viola-jones), LBP Features,  Integral Channel Features  и т.д.

 

П.С. я считаю что хороший читаемый код по классическому методу это тоже неплохо.

 

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


Ссылка на сообщение
Поделиться на других сайтах
16 hours ago, iskees said:

Может вам перевести на gpu что-то другое, чего еще никто не риализовал,, виола-джонс уже и так напихан в каждый "холодильник" и ничего нового вы не сделаете. Слабо себе переставляю диплом в котором переписывается то что давно  реализованное(причем явно будет медленнее) и доказывается что на задаче со скользящим окном gpu быстрее cpu.

Насколько я понимаю, задача распараллеливания каскада достаточно сложна. И в том же OpenCV каскады на CUDA появились совсем недавно. Так что не факт, что там сделано качественно. Тот же SIFT на CUDA перенести пока мало у кого получилось (в OpenCV была бажная реализация, которую выкинули).

С другой стороны, согласен с mrgloom: кроме AdaBoost есть много других бустингов. Буквально вчера  читал статью, в которой для распознавания пешеходов и автомобилей применяют CoHOG и RealBoost. Почему бы не реализовать и сравнить с AdaBoost из OpenCV? Это уже ближе к научной работе.

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


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

 

4 hours ago, Nuzhny said:

С другой стороны, согласен с mrgloom: кроме AdaBoost есть много других бустингов. Буквально вчера  читал статью, в которой для распознавания пешеходов и автомобилей применяют CoHOG и RealBoost.

Если что, внесу конструктив: было-бы интересно сравнить работу opencv'шного adaBoost'а с популярным на kaggle XGBoost'ом на задаче детектирования чего нибудь.

Плюс, в рамках каскадных подходов сейчас модно пробовать различные способы выбора фич и большинство прорывов совершенных в последние пару лет, были именно за счет фич, при использовании фактически дефолтного adaBoost. Как пример, использовать вместо Хааровских фич генеративные особенности, полученные от Deep Learning'а. Типа модно, молодежно и практически полезно :-)

4 hours ago, Nuzhny said:

Тот же SIFT на CUDA перенести пока мало у кого получилось (в OpenCV была бажная реализация, которую выкинули).

Руками не трогал, но вот тут спидапы выглядят интересно: https://github.com/Celebrandil/CudaSift

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


Ссылка на сообщение
Поделиться на других сайтах
55 minutes ago, BeS said:

Руками не трогал, но вот тут спидапы выглядят интересно: https://github.com/Celebrandil/CudaSift

О, не так давно появилось, спасибо. Надо будет попробовать.

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


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

А с чего Вы решили что это магитестрская диссертация, топик стартер писал же "диплом", а там нужна не научная новизна и прочее, а практическая ценность. Автор, укажите вы магистрант или бакалавр?

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


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, iskees said:

А с чего Вы решили что это магитестрская диссертация, топик стартер писал же "диплом", а там нужна не научная новизна и прочее, а практическая ценность. Автор, укажите вы магистрант или бакалавр?

Да бакалавр я, бакалавр! Ребят я только понемногу начал вникать в Viola Jones, а Вы мне уже что то новое предлагаете) Мне бы это осилить.

 

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×