Метод Виолы Джонса

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Метод Виолы Джонса

Сообщение Don Leno » 08.09.2020 (Вт) 19:39

Здравстуйте.
Недавно прочитал про распознование лиц и их алгоритмы. Вот решил попробовать самостоятельно реализовать данный алгоритм. Но по сути далеко не продвинулся. Начну с теории. Сам метод в общих чертах описывается на хабре https://habr.com/ru/post/133826/. Об интегральном представлении изображения нашел на этом сайте https://docs.exponenta.ru/images/ref/integralimage.html, очень подробное описание)))
После я набросал тестовый проект и написал небольшой код по загрузке изображения и конвертирования его в монохром. А дальше вычисление интегрального представления (сумм пикселей). Вот теперь проблема - код то я написал, а как узнать правильно ли там все вычисляется?
Но самое сложное - я не понимаю как вычислить эти самые признаки Хаара! Может кто сможет мне подробно объяснить как, да что? Что делать с полученным массивом сумм (интегральным представлением изображения)? А также как производить обучение и создание каскадов?

Ниже предоставлю исходник (комментов почти нет, да и то английскими словами, на русском шрифт сбился)
Подробно об исходнике:
Управление прогой реализовано через команды, вводимые в текстовое поле
Список команд такой:
1. load - загружает фиксированое изображение из папки проекта face.jpg
2. img - показывает оригинальное изображение
3. buf - показывает изображение в монохроме. (ВНИМАНИЕ! Там будет отображено не в ч/б оттенках, а в градациях синего)
4. int - показывает изображение из новосозданного массива сумм пикселей (оно же интегральное представление)
5. ex или нажатие на Esc - завершение программы
Вложения
ViolaJones.rar
(23.71 Кб) Скачиваний: 138

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Метод Виолы Джонса

Сообщение Vova_2581 » 08.09.2020 (Вт) 21:48

Красивая девушка... :)
Почитал Ваш пост, а потом почитал Ваши ссылки и подумал, - а зачем оно Вам вообще нужно??? Вы хотите отследить Вашу девушку по камерам слежения? Думаю, такому умному человеку, как Вы она точно не изменяет! Можете спать спокойно и не думать ни о каком даже признаке...

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Метод Виолы Джонса

Сообщение bon818 » 09.09.2020 (Ср) 1:13

Кстати, тема Метод Виолы Джонса, уже обсуждалась:
http://bbs.vbstreets.ru/viewtopic.php?f=1&t=47641&start=0

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Метод Виолы Джонса

Сообщение Don Leno » 10.09.2020 (Чт) 18:28

Можете спать спокойно и не думать ни о каком даже признаке...

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

Кстати, тема Метод Виолы Джонса, уже обсуждалась:
viewtopic.php?f=1&t=47641&start=0

Тема обсуждалась но описания того как мне найти признак там не описано. Там лишь говориться о преобразовании Фурье... но вопрос остался открытым и о том как сравнить полученные результаты.
Тем более преобразование Фурье для меня темный лес. Мне нужно простое объяснение. У меня есть изображение в интегральном представлении, которое храниться в массиве. Что делать дальше? Как использовать примитивы и как работать с изображением. Скорость сейчас не важна, главное попробовать реализовать столь известный алгоритм.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Метод Виолы Джонса

Сообщение Vova_2581 » 10.09.2020 (Чт) 23:49

Don Leno писал(а):То есть фото выбрано для проверки алгоритма, а не по каким либо моим предпочтениям))

Да я шучу, конечно, но девушка действительно красивая. ))
А тема не такая уж и простая, посмотрите вот тут (Стр. 26) - люди пишут целые диссертации! А Вы хотите наскоком да чтобы еще и по простому. ))
Судя по описанию... Вам нужно будет еще понять алгоритм AdaBoost, "бинарный классификатор", построить "одноуровневое дерево решений" и последним гвоздем в гроб всей этой затеи будет "объединение набора сильных классификаторов в каскадную структуру". :drunken: Вам будет нужна помощь серьезного математика.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Метод Виолы Джонса

Сообщение Vova_2581 » 11.09.2020 (Пт) 8:56

Как я это понял (может и неправильно не берусь судить) вычисления признаков Хаара производится по такому алгоритму:
1) На изображение накладывается прямоугольная область произвольного размера (вертикальная или горизонтальная).
2) Вычисляется разность сумм всех пикселей области темной и светлой стороны от такой же области на изображении.
3) Если в фрагменте большее количество светлых пикселей, то эта область считается светлой, а если больше темных пикселей, то фрагмент считается темным.
рис. 1.jpg
рис. 1.jpg (7.07 Кб) Просмотров: 2543

4) А далее набор определенных признаков говорит о том, что это область, в которой происходи сканирование изображения, предположительно является областью лица.
То есть, для лица характерны такой набор признаков: темная область, светлая область и снова темная, значит это глаза-нос-глаза.
Как-то так по ходу... но это в теории, а вот как с практикой? Нужен хороший математик.
Посмотрите еще тут - "http://www.compvision.ru/forum/index.php?/topic/2069-помогите-понять-как-работают-признаки-хаара"

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Метод Виолы Джонса

Сообщение Don Leno » 12.09.2020 (Сб) 13:55

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

Это я понимаю. Это и называется сканирующим окно. То есть берется кусочек от всего изображения
2) Вычисляется разность сумм всех пикселей области темной и светлой стороны от такой же области на изображении.

А вот об этом я и спрашиваю. Как правильно вычислить признак? Что нужно сделать? Ведь вычитание можно сделать, но как в вашем примере ДВЕ ТЕМНЫЕ И ОДНА СВЕТЛАЯ ЧАСТЬ. Так что от чего отнимать?
3) Если в фрагменте большее количество светлых пикселей, то эта область считается светлой, а если больше темных пикселей, то фрагмент считается темным.

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

Да дело скорее не в математике. Ведь подробно алгоритм описан, но из-за сложности терминологий многое непонятно. А хотелось бы понять что и как происходит и как введется работа с этими самыми числами\суммами...
Жду и надеюсь может найдется кто сможет ответить на эти вопросы

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Метод Виолы Джонса

Сообщение Vova_2581 » 12.09.2020 (Сб) 19:05

Don Leno писал(а):Как правильно вычислить признак? Что нужно сделать? Ведь вычитание можно сделать, но как в вашем примере ДВЕ ТЕМНЫЕ И ОДНА СВЕТЛАЯ ЧАСТЬ. Так что от чего отнимать?

Наверное Вы не читали форум по ссылке, что я Вам указал... Там администратор отвечает на этот вопрос и пишет (цитата):

"Признаки - это всего лишь правило суммирования пикселей (если пиксель под белой областью + , если под черной - )."
...
"Значение признака = сумма всех пикселей под белой областью признака - сумма всех пикселей под черной областью признака."
...
"Чтобы узнать есть ли в окошке лицо, нужно отправить извлеченный вектор признаков на классификатор. В OpenCV используется AdaBoost. Этот классификатор и решает есть лицо или нет в данной позиции окна сканирования.
Чтобы это все работало, классификатор вначале обучают."
...
"Просмотр идет от ступеней с максимальной вероятностью к уточняющим.
То есть идет окно вычисляем признак 1 - прошло, 2 - прошло, 3 - не прошло. отбрасываем - вывод - не лицо.
1 - прошло, 2 - прошло, 3 - прошло, - N - прошло принимаем - вывод - лицо."

Топикстартер пишет (цитата):

"В принципе думаю идею алгоритма я понял, хочется подытожить.

1. Есть фото на котором нужно обнаружить объект

2. Для того что бы объект можно было обнаружить, надо обучить систему

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

4. На основе сканируемого изображения создается матрица - интегральное представление сканируемого изображения

5. На это изображение накладываются признаки которые являются матрицами. Они накладываются в каждое сканирующее окно. Это окно с каждым приходом по всему изображению увеличивается

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

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

8. Так как размер искомого объекта может быть разным, признаки нужно масштабировать

9. У каждого классификатора есть свой набор признаков

10. Ввиду того что общая форма лица одинаковая - это позволяет идентифицировать его

11. Перед началом работы нужно перевести изображение в grayscale

Скажите пожалуйста, я верно представляю себе алгоритм? Может чего то упустил? ".

Администратор отвечает (цитата):

"Да вроде в общих чертах похоже. Только классификатору передаются массивы (векторы) чисел а не числа по одному. ".

Вот как-то так...
Попробуйте понять логику этой переписки еще в 2017 году... Может у Вас получится, а может кто-то еще подскажет. А может обратитесь к тамошнему Администратору и он Вам что подскажет, если там еще кто-то жив.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Метод Виолы Джонса

Сообщение Don Leno » 13.09.2020 (Вс) 8:06

Спасибо за подробное объяснение!
Но у меня один вопрос остался. Рассмотрим на вашем примере, где указан примитив из двух темных частей и одной светлой. Так как производить операцию?
Все суммы пикселей ОДНОЙ белой области - Все суммы ДВУХ темных областей?

Допустим, я вычислил массив значений признака и у меня есть заранее обученный классификатор. Но как производиться сравнение этих чисел?

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

Как определяется этот самый ПОРОГ? Я не совсем понимаю как работает классификатор...

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Метод Виолы Джонса

Сообщение Vova_2581 » 14.09.2020 (Пн) 23:29

Мне кажется, под словом "порог" понимается что-то приближенное (близкое). Например, пороговые числа числу 20 будут 19, 18, 21.
Может быть так? Остальное... хотел Вам написать, точнее нарисовать, но попозже, как я это понимаю, постараюсь написать завтра.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Метод Виолы Джонса

Сообщение Vova_2581 » 15.09.2020 (Вт) 16:54

Так вот, напишу так, как лично я это понял. Прошу не относиться к моему объяснению, как к истине в последней инстанции. Могу ошибаться.
Значит, берем фотографию... переводим ее в Ч/Б вариант...
face.jpg
face.jpg (56.53 Кб) Просмотров: 2481

Далее, по описанию, ее вроде как масштабируют, ну, типа, этого...
face2.jpg
face2.jpg (36.67 Кб) Просмотров: 2481

Затем сканируют с наложениями признаков Хаара...
face3.jpg
face3.jpg (34.86 Кб) Просмотров: 2481

face4.jpg
face4.jpg (39.3 Кб) Просмотров: 2481

А далее производим логическую операцию "сложения" пикселей. Если черный пиксель признака накладывается на такой же пиксель фотографии, то они умножаются. Логическая операция конъюнкции --> 1 х 1 = 1. А если черный пиксель признака накладывается на белый пиксель, то --> 0 х 1 = 0
Он не умножается или вообще игнорируется...
face5.jpg

С белой областью признака также.
А далее по формуле описанной выше...
"Значение признака = сумма всех пикселей под белой областью признака - сумма всех пикселей под черной областью признака."
То есть...
У нас получилось, к примеру, в сумме 200 черных пикселей области глаз и 1000 белых пикселей области носа. Значит...

Значение признака = 1000 - (200 + 200) = 600
Ну а далее обученный классификатор отмечает, что область глаз именно этого признака это 598
600 пороговое значение к классификатору области глаз и носа, значит это лицо.
Вот, что-то типа того. Но нужно учесть, что лицо определяет не один признак, а их множество.

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Метод Виолы Джонса

Сообщение bon818 » 15.09.2020 (Вт) 20:52

Vova_2581 писал(а):Далее, по описанию, ее вроде как масштабируют, ну, типа, этого...

Не вникал, но подозреваю, масштабируют без сглаживания, ну, типа, этого...))
Вложения
2.png
масштабирование без сглаживания
2.png (7.14 Кб) Просмотров: 2478

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Метод Виолы Джонса

Сообщение Don Leno » 18.09.2020 (Пт) 18:30

Vova_2581 и bon818
Thanx вам за помощь! Буду пробовать... Насчет вычисления вроде подробно описали. Насчет масштабирования не знал надо снова почитать все статьи и понять как правильно делать. Если что напишу снова сюда. Сейчас занят сильно. Но на выходных постараюсь скодить))
И хотелось бы уточнить. Вы пишите пиксель признака Хаара и пиксель фото. Но по моему мнению скорее берем пиксель примитива Хаара (это тот самым прямоугольник с черными и белыми квадратами). А признак Хаара скорее всего - это массив чисел получаемый при вычитании сумм пикселей.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Метод Виолы Джонса

Сообщение Vova_2581 » 18.09.2020 (Пт) 20:43

Don Leno писал(а):Вы пишите пиксель признака Хаара и пиксель фото.

Ну да... С этими пикселями производится логическая операция конъюнкции, чтобы выделить нужные (белые или темные) пиксели на фото под признаком (тем или иным) и посчитать их количество для классификатора. Ну а дальше множество признаков, если они совпадают с классификатором говорит нам, что это лицо...
Признаки.jpg
Признаки.jpg (45.32 Кб) Просмотров: 2451

Лично я так понял то, что читал. Одно могу сказать: если Ваш алгоритм начнет правильно выделять лицо, то значит Вы на верном пути и все получилось. Желаю Вам успеха!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot, Yandex-бот и гости: 53

    TopList