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

Recommended Posts

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

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

Так же не понятно следующее: читал что после того как признак наложен на исходное изображение нужно отнять сумму пикселей белой стороны от черной стороны признака, но что это дает? Ну отнял, получилось допустим 500. И что дальше?

Читал на эту тему, и насколько я понял по этому числу можно определить насколько светлым или темным является исследуемый признаком участок и далее исходить из понятий типа глаза темнее чем нос, и если например есть совпадение вроде такого: темная область, светлая область и снова темная, значит это глаза-нос-глаза. Но насколько темная? Как сканировать темнокожие лица в таком случае? А если встретится на картинке другой объект который тоже подходит под описание темный-светлый-темный, то как его НЕ спутать с глаз-нос-глаз?

 

Очень надеюсь на вашу помощь

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


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

Вот здесь кое что есть: 

Ну и отвечу на вопросы которые вы задали.

Для окошка сканирования 24х24, признаков Хаара, (прямоугольников с белыми и черными областями) может быть, насколько я помню, около 200000.

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

Для поиска в различных масштабах, мы масштабируем окно сканирования, а не изображение.

Чтобы узнать есть ли в окошке лицо, нужно отправить извлеченный вектор признаков на классификатор.  В OpenCV используется AdaBoost. Этот классификатор и решает есть лицо или нет в данной позичии окна сканирования.

 

Чтобы это все работало, классификатор вначале обучают.  

  • Like 1

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


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

Большое спасибо что откликнулись! Пишу с мобильного телефона, поэтому извиняюсь что не получается нормально цитировать ваши сообщения. 

Вы писали,

Только что, Smorodov сказал:

 

Вот здесь кое что есть: 

 

Для окошка сканирования 24х24, признаков Хаара, (прямоугольников с белыми и черными областями) может быть, насколько я помню, около 200000.

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

 

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

Так же интересно, каким образом представить изображение в виде вектора, например картинку в формате JPEG. Даже не знаю что загуглить, что бы найти подходящий для данной задачи способ конвертации и представления изображения в виде вектора( я представляю себе это как вектор структур, а структура в свою очередь содержит три поля, r g b которые имеют соответствующие значения конкретного пикселя в матрице.

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

В целом я представляю себе процесс обучения так:

1. На вход программе подается набор эталонов лица

2. Каждый прямоугольник сканирования вручную помечется как правильный ответ и корректируются веса классификаторов (Но немного сомневаюсь потому что читал в процессе обучения ручная работа отсутствует за исключением подготовки материала для обучения)

 

Так же интересно, раз уж все сводится к корректировки весов классификаторов, то зачем нужны признаки, похожие на черты лица? Например прямоугольный нос... Можно же подать на вход в качестве обучающих данных например слона, и корректировать веса до тех пор пока система не будет ассоциировать слона с человеческим носом. В таком случае у меня так же не складывается логика, зачем от светлой части признака отнимать темную, если это просто числа которые нужны просто для "подгонки" весов классификаторов.

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

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


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

Детектор Хаара работает с изображениями в серых тонах, не с цветными.

Признаки - это всего лишь правило суммирования пикселей (если пиксель под белой областью + , если под черной - ). Максимальные значения будут если признак наложить сам на себя (попробуйте).  

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

Да они не 2х2, а могут быть разных размеров. 

1_all_haar_wavelets.png

В окошке сканирования размещают все возможные комбинации этих признаков 

 

 

каждый дает числовой отклик.

Итого, для каждого положения окна сканирования мы вычисляем числа для каждого признака . Признаков в окне может разместиться очень много каждый в каждой возможно позиции скользящего окна, во всех возможных масштабах, всех возможных типов.  Вот для каждого варианта вычисляем число и кладем в вектор дескриптора скользящего окна.

 

После этот вектор идет на обучение классификатора.

Именно классификатор после обучения отделяет слонов от лиц. Но если нужны слоны, можно обучить классификатор и для них. 

 

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

  • Like 1

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


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

Благодаря вам уже начал понимать)

То есть перед тем как начать обработку - нужно конвертировать изображения в серые тона. А чем это объясняется? Почему требуется такое преобразование? Что бы например исключить проблему с цветом кожи лица, и сосредоточиться исключительно на понятии "черты лица"?

По поводу признаков кажется начал понимать. То есть картинки признаков - на самом деле не являются картинками в контексте программы, просто их рисуют чтоб было понятен смысл. Где то в программе хранятся данные о разделении на части признака, т.е на темную и белую, и опираясь на данные уже можно делать вычисления в интегральном представлении изображения.

Вы писали,

Признаки - это всего лишь правило суммирования пикселей (если пиксель под белой областью + , если под черной - ). 

Немного не понятно, плюс к чему, и минус от чего?)

 

По поводу тренировок программы, скажите пожалуйста, верно ли я понимаю идею:

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

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


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

По поводу каскада хочу узнать,

Если классификатор с сильными признаками проверяется первым и может определить, есть ли смысл применять более слабые классификаторы в этом окне, то зачем нужны слабые классификаторы?) Или все дело в том, что один классификатор не может без помощи других понять, есть ли лицо в окне? Читал что такой каскад нужен для того что бы одни классификаторы учились на ошибках других. Как я понимаю в итоге когда система полностью обучена, до слабых классификаторов дело почти не доходит, они в большинстве случаев используются программой на первых стадиях обучения, что бы сделать некоторые классификаторы сильными.

По поводу +/- тут как я понимаю не важно какое получится число? То есть можно отнимать как от черной части признака белую, так и наоборот. Главное что бы было какое то опорное число?

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


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

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

Значение признака = сумма всех пикселей под белой областью признака - сумма всех пикселей под черной областью признака.

Вообще говоря вы имеете дело с 250000 мерными точками.

Некоторые из них, это лицо. Задача классификатора провести гиперплоскость разделяющую лица от не лиц.

"Сильные признаки" - это совокупность "слабых"  признаков. Прочитайте про статейку про adaBoost в теме которую я упоминал выше.

Просмотр идет от ступеней с максимальной вероятностью к уточняющим. 

То есть  идет окно вычисляем признак 1 - прошло, 2 - прошло, 3 - не прошло. отбрасываем - вывод - не лицо.

1 - прошло, 2 - прошло, 3 - прошло, - N - прошло принимаем - вывод - лицо.

 

Обучение одной ступени каскада выглядит примерно так:

То же самое, но представьте это в 200 000 мерном пространстве.

  • Like 1

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


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

А черно-белые не гордятся? Или в таком случае вероятны искажения?

 

Большое вам спасибо! Вы очень сильно помогли! Я почитаю ссылки, надеюсь разберусь!

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


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

Подскажите пожалуйста 

 

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

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


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

Вейвлеты Хаара. Сложение - это интегрирование. Если бы что-то умножалось, то признаки не назывались бы признаками Хаара, а какими-нибудь другими. То есть ответ на вопрос - складываются по определению.

Теперь второй вопрос - почему именно вейвлеты Хаара взяты за базис? Потому что суммы можно очень быстро вычислять по интегральному изображению: 4 считывания в память и 3 сложения. Это очень быстро.

И третий вопрос, который может возникнуть. Есть ли что-то ещё? Есть и много. Мы сейчас говорим о классической связке признак + классификатор, а именно о Haar + AdaBoost. Также популярна связка LBP + AdaBoost, которая быстрее, но менее точна. Есть HOG + SVM, её для лиц использует библиотека dlib (вроде как там сложнее, чуть ли не dpm, но это уже детали).

Так вот связка Haar + AdaBoost была прорывной в своё время, впервые для прикладных задач появилась возможность искать объект на изображениях в реальном времени. В фотоаппаратах появилась функция поиска лиц, функция автоматической съёмки по улыбкам. Это всё Haar + AdaBoost и чуть позже LBP + AdaBoost. Типа революционная фича, которая сейчас используется намного реже. Началась эра глубоких нейросетей.

  • Like 1

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


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

Вейвлеты Хаара. Сложение - это интегрирование. Если бы что-то умножалось, то признаки не назывались бы признаками Хаара, а какими-нибудь другими. То есть ответ на вопрос - складываются по определению.

Теперь второй вопрос - почему именно вейвлеты Хаара взяты за базис? Потому что суммы можно очень быстро вычислять по интегральному изображению: 4 считывания в память и 3 сложения. Это очень быстро.

И третий вопрос, который может возникнуть. Есть ли что-то ещё? Есть и много. Мы сейчас говорим о классической связке признак + классификатор, а именно о Haar + AdaBoost. Также популярна связка LBP + AdaBoost, которая быстрее, но менее точна. Есть HOG + SVM, её для лиц использует библиотека dlib (вроде как там сложнее, чуть ли не dpm, но это уже детали).

Так вот связка Haar + AdaBoost была прорывной в своё время, впервые для прикладных задач появилась возможность искать объект на изображениях в реальном времени. В фотоаппаратах появилась функция поиска лиц, функция автоматической съёмки по улыбкам. Это всё Haar + AdaBoost и чуть позже LBP + AdaBoost. Типа революционная фича, которая сейчас используется намного реже. Началась эра глубоких нейросетей.

То что стороны признаков складываются - здесь вопросов нет :) мне интересно почему от белой стороны отнимается темная сторона признака  и почему именно отнимается а например не прибавляется

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


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

1. По определению. Это просто операция интегрирования функции - вейвлета Хаара. Если бы он имел другой вид, то производилась бы другая операция.

2. А что дало бы сложение двух областей? Ответ: для всех вариантов вейвлетов мы бы получили одно и тоже число, а именно сумму в квадратике. И зачем это надо?

Разница же показывает, какая часть темнее, а какая светлее.

  • Like 1

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


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

Большое спасибо! Теперь понял мысль в целом. 

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

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


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

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

  • Like 1

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


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

Smorodov,

Согласен насчет абстракций. Просто меня путает и вводит в ступор следующее:

Вы говорите глаза темнее щек. Окей, допустим это так(хотя в реальности сильно зависит от цвета кожи и глаз).

Но о результате работы признака вы говорите как о паре - глаза и щеки, где глаза как вы сказали темнее щек, верно? Но результат признака ведь не пара вроде "одно темнее другого), а одно число. В этом смысле я рассматриваю полученное число как абстракцию. Поправьте, если ошибаюсь

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


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

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

Будет что то вроде такого, если писать словами:

Изображение на 12% похоже на горизонтальный перепад яркости, на 5% на вертикальный, на 7% похоже на черную точку на белом фоне, на 4% на диагональный перепад яркости. 

Вместе они опишут структуру изображения. 

  • Like 1

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


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

Smorodov,

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

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


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

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

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

Извлечение признаков, переводит вашу картинку из одной системы координат в другую.

  • Like 1

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


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

Спасибо за объяснения!

Еще один вопрос меня волнует, касается он принципа распознания объектов, в данном случае лиц. Буду рад если поможете довести до ума.

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

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


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

Ну там не то что бы одно и то-же, но получается компактная область, которая и выделяется при обучении классификатора. Что внутри области - лицо, что снаружи не лицо.

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

 

  • Like 1

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


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

Ясно, спасибо! Видео увы посмотреть не могу, телефон чего то глючит, браузер не дает его воспроизвести, зависает... Но гляну обязательно когда будет такая возможность...

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

  • Like 1

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×