LINUX.ORG.RU

Обнаружение лиц на фотографии по методу Виолы-Джонса (Viola-Jones)

 face detect, , haar, , , viola-jones,


0

3

На основе исходного кода трех Open Source-проектов, восстановлен алгоритм распознавания лиц (метод Виолы-Джонса, Viola-Jones). Алгоритм использует стандартный каскад Хаара из OpenCV, и реализован на языке Си++. Скорость работы программной реализации, на изображениях 512x512 пикс – порядка 3 кадров/сек. Предназначен для обнаружения лиц «в фас» на любых фотографиях.

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

Сайт проекта: http://sqface.ru/
Исходный код (под AGPLv3+): http://sqface.ru/download/sqface-first.tgz

>>> Подробности

★★★★★

Проверено: timur_dav ()
Последнее исправление: timur_dav (всего исправлений: 1)
Ответ на: комментарий от pacify

Беда OpenCV в том, что у неё - куча ложных срабатываний.

Более продвинутые методы могут достигать на порядок большей точности.

Но стоят они - миллионы рублей/долларов.

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

exception13 ★★★★★
()
Ответ на: комментарий от provaton

Молодец. А насколько тяжело будет построить систему распознавания на базе твоего проекта?

Система распознавания лиц в разы сложнее системы, извлекающей лица из кадра.

segfault ★★★★★
()

Как насчет того, чтоб выложить код на github? Я бы форкнул и добавил английскую доку. А дальше - пошло-поехало..

anonymous
()

Си++

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

anonymous
()
Ответ на: комментарий от exception13

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

Если кто-то возьмется модифицировать мою программу - так есть такая вещь ...
Например, ограничения на число «строгих классификаторов», stages (в код вбиты массивы фиксированной длины и т.п.); или - тип int для Summed area table (интегрального изображения).

Так что, все эти вещи для универсального проекта (работающего на любых каскадах Хаара, любых размерах изображения) придется поправить.
Фиксированные размеры, малые типы, вбил в код для большей произодительности (повысил с 0.29 сек до 0.16 сек на 512x512 пикс).
Кстати, производительность можно повышать и другими способами, и приблизиться к OpenCV. Только пока я этого не сделал. Но это возможно.

pacify ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Как насчет того, чтоб выложить код на github?
Я бы форкнул и добавил английскую доку. А дальше - пошло-поехало..

Это бы было замечательно.

Сейчас попробую найти логин от гитхаба.

pacify ★★★★★
() автор топика
Ответ на: комментарий от provaton

Ну, вот это уже немного другая история :) Если будет время, то попробуй воспроизвести, запустив через gdb.

AP ★★★★★
()

Насчет применения алгоритма для видеопотока хорошо бы посмотреть вот этого автора:

Кулябичев, Ю.П.
Обнаружение человеческих лиц в видеопотоке на основе метода виолы-джонса [Текст] / Ю.П. Кулябичев, С.В. Пивторацкая// Научная сессия МИФИ - 2007. Сборник научных трудов. - 2007. - Т.1212-13

Только я полного текста статьи не вижу на сайте http://libcatalog.mephi.ru/cgi/irbis64r/cgiirbis_64.exe?Z21ID=&I21DBN=SES...

pacify ★★★★★
() автор топика
Ответ на: комментарий от cattail

А есть примеры, где используется реально этот метод?

Ну, например, в программе Redeye Remover (как-то так называется), которую разработал один студент из Волгограда.

pacify ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Как насчет того, чтоб выложить код на github?

В общем, не смог я залить на github. Не хватает навыков работы с git.

Форкни «вручную» - распакуй мой проект, и залей к себе сам.

pacify ★★★★★
() автор топика

Реально распознать человеческое лицо и спользую к примеру качественную веб-камеру вашей программой ? Сколько времени занимает распознавание ? Будет ли распознавание работать быстрее если количество людей которых нужно распознать не больше 10-20 человек ? Спасибо очень интересный проект!!!

crono
()
Ответ на: комментарий от crono

Реально распознать человеческое лицо и спользую к примеру качественную веб-камеру вашей программой ?

Если человек будет обращен лицом к камере - да, она будет обнаруживать координаты его лица.
Если же надо сделать для повернутых в торону голов/лиц - есть другой каскад из пакета OpenCV.

Сколько времени занимает распознавание?

На 2800 MHz Атлоне - мне удалось ускорить ее до 0.16-0.19 сек на кадр, то есть до 5-7 кадров/сек (кадры 512x512 пикс).
Для картинки 1920x1080 - рекомендую уменьшать картинку в размерах перед работой алгоритма до, примерно, 512x512/640x480.

Будет ли распознавание работать быстрее если количество людей которых
нужно распознать не больше 10-20 человек ?

От количества людей быстродействие этого алгоритма не зависит.
Зависит в основном - от размера кадра (сколько пикселей).

pacify ★★★★★
() автор топика
Ответ на: комментарий от crono

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

exception13 ★★★★★
()
Ответ на: комментарий от sphericalhorse

Не, ну оно знает куда смотреть. Интересно будет глянуть, какой там самый тормозной момент. Возможно, ускорение не FPGA должно дать нехилый прирост производительности.

AiFiLTr0 ★★★★★
()
Ответ на: комментарий от Reset

а gplv3 для embedded не применим?

Как написано на Википедии, AGPLv3 нацелен прежде всего на защиту от сокрытия кода web-приложений: ... requires that the complete source code be made available to any network user of the AGPL-licensed work, typically a Web application.

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

Простая GPLv3 не может требовать открытия исходников программы, которая «крутится» на сетевом девайсе, например - на Ethernet-видеокамере с «распознавалкой».

Я правильно понимаю смысл лицензии?

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

А вообще странно, люди различают лица без 3д моделей (хотя объём лица и запоминается), просто полагаясь на «растровый образец» всего лица и его отдельных черт в частности.

alltiptop ★★★★★
()

Ждём в программах для организации изображений.

Yaremi_Roman
()
Ответ на: комментарий от pacify

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

Binary ★★★★★
()
Ответ на: комментарий от pacify

Если я прав, то даже обычная GPLv3 вполне достаточна для девайсов.

AGPLv3 нацелена, вроде как, исключительно на SaaS.

winddos ★★★
()
Ответ на: комментарий от pacify

Простая GPLv3 не может требовать открытия исходников программы, которая >«крутится» на сетевом девайсе, например - на Ethernet-видеокамере с >«распознавалкой».

Я правильно понимаю смысл лицензии?

Нет.
GPL предполагает, что если если в девайсе используется GPL-код и этот девайс распространяется, то исходники вместе с правками должны быть опубликованы.
Т.е. если я сам себе девайс сочиню и там будет GPL-код, то от меня нельзя требовать исходный код с девайса, но если я девайс буду продавать/распространять бесплатно, то можно и нужно требовать.
Слово «девайс» можно заменить на слово «программа» с тем же результатом.

anonymous
()
Ответ на: комментарий от anonymous

Готово - https://github.com/tony2001/sqface

Отлично. Развивайте проект дальше. Я хочу заняться другими интересными задачами.

«Дока» там, конечно, не бог весть что, но для начала хватит.

Доки там не вижу. Вижу аннотацию проекта (README.ru/.rest).
Хотя, может это и правильно. Пусть исходный код развивается.
Переписать заново - не трудно.

pacify ★★★★★
() автор топика

Вопрос: предположим, ты в итоге достигнешь лучшего, чем в OpenCV, качества распознавания при сравнимой скорости. Патчи для OpenCV тогда напишешь?

Замечание: комментарии писать нужно по-английски.

anonymous
()

ЗачОтно. Не специалист по сабжевой проблематике, но некоторый интерес имею.

drSchur ★★★
()
Ответ на: комментарий от anonymous

Вопрос: предположим, ты в итоге достигнешь лучшего, чем в OpenCV,
качества распознавания при сравнимой скорости.

Если работа будет оплачиваться - то да, буду этим заниматься.

Я работаю только по тем проектам, где есть гарантированная оплата.
Либо, если программа лично мне нужна.

Патчи для OpenCV тогда напишешь?

OpenCV мне не нравится, я его использую лишь по-необходимости.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

Просто я хочу сказать, что публикация кода в таком виде мало что даёт. Если бы ты (предположим на минуту) донёс свои доработки до разработчиков OpenCV, или даже (что сделать сложнее) довёл бы собственный проект до такого уровня, чтобы с тем OpenCV успешно конкурировать, то тогда ты получил бы за свой труд кое-что взамен. Прежде всего международную известность: пусть и в узких кругах, но это охренительный плюс к резюме. А так – не получаешь практически ничего.

Смотри сам, конечно, но ИМХО – попытка бы того стоила.

anonymous
()
Ответ на: комментарий от AP

Такая «фигня» на классическом десктопе вообще малоприменима, а место ей в системах безопасности в общественных местах, тема интересная и перспективная.

nand
()

Спасибо вам большое, сам учусь в магистратуре по направлению «Цифровая обработка изображений» и ваш опыт будет очень полезен мне.

nand
()

Вопрос: могу ли я использовать проект в своей бакалаврской работе, открыв код роботы под лицензией GPL2/3??

ymuv ★★★★
()
Ответ на: комментарий от anonymous

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

Я делаю конкретную работу - конкретным людям. Как правило, за деньги. Либо, изучаю «технологии» с какой-то конкретной пользой.
Надо кормить семью.

Вышеописанный алгоритм построен на основе анализа четко описанных алгоритмов в коде проектов HxMarilena и MATLAB: Viola-Jones object detection.

Для тех людей, кто хотят что-то добавить в OpenCV, приведены подробные пояснения, как использовать стандартные каскады Хаара.

Если надо проконсультировать по возможным способам ускорения этого алгоритма - обращайтесь ко мне в Jabber: lubyagin@jabber.ru, или на почту.

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

pacify ★★★★★
() автор топика
Ответ на: комментарий от ymuv

Вопрос: могу ли я использовать проект в своей бакалаврской работе,
открыв код роботы под лицензией GPL2/3??

Если тебе нужен именно GPL2/GPL3 only - ты можешь переписать код «с нуля».
Всё необходимое для написания кода (алгоритм) - есть на текущий момент в Интернете.
Собственно, суть моей работы состоит в подсказке - как именно использовать значения left_val/right_val из XML-каскада.
До этого - нигде в Интернете этот момент не был описан.

pacify ★★★★★
() автор топика

Привет, в жабири оффлайн, поэтому напишу сюда.

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

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

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

Вот кусок кода: http://pastebin.com/9TGNWS92

nikitos ★★★
()
Ответ на: комментарий от AP

Пока не осилил получить трейс. Сделал build.sh /usr Debug, после запуска оно тупо отжирает всю оперативную память и я ничего вообще не могу сделать на компе пока не убью ДТ :( Ну чего она меня так не любит?

`--> ps aux | grep darktable
nss       2172 38.9 91.6 8002668 5474360 ?     Dsl  00:42   0:10 darktable
provaton ★★★★★
()
Ответ на: комментарий от provaton

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

provaton ★★★★★
()
Ответ на: комментарий от provaton

Пофиксил траблу - оказалось что она из-за того, что я снес один из своих каталогов с фотками, который был в дарктейбловской базе. Вылечил ручным удалением фоток из libraries.db

Охренеть какой безглючный каталогизатор!

provaton ★★★★★
()
Ответ на: комментарий от AP

О, эврика! Правда оговорка - крешится не при импорте с камеры, а с кардридера. Камеру не видит вообще (но это очевидно проблема моего недонастроенного арча).

Искомый бэктрейс:

#0  0x00007ffff184a7f9 in ?? () from /lib/libc.so.6
#1  0x00007ffff184b79f in ?? () from /lib/libc.so.6
#2  0x00007ffff184de2d in malloc () from /lib/libc.so.6
#3  0x00007ffff7b33511 in g_realloc () from /usr/lib/libglib-2.0.so.0
#4  0x00007ffff7b4c987 in ?? () from /usr/lib/libglib-2.0.so.0
#5  0x00007ffff7b4cd8a in g_string_sized_new () from /usr/lib/libglib-2.0.so.0
#6  0x00007ffff7b4fc12 in ?? () from /usr/lib/libglib-2.0.so.0
#7  0x00007ffff7b50260 in g_assertion_message () from /usr/lib/libglib-2.0.so.0
#8  0x00007ffff7b50792 in g_assertion_message_expr () from /usr/lib/libglib-2.0.so.0
#9  0x00007ffff7617e2e in ?? () from /usr/lib/libgdk-x11-2.0.so.0
#10 0x00007ffff7618cd4 in ?? () from /usr/lib/libgdk-x11-2.0.so.0
#11 0x00007ffff7619477 in gdk_region_union () from /usr/lib/libgdk-x11-2.0.so.0
#12 0x00007ffff7622fd7 in ?? () from /usr/lib/libgdk-x11-2.0.so.0
#13 0x00007ffff7623183 in ?? () from /usr/lib/libgdk-x11-2.0.so.0
#14 0x00007ffff72069fa in gtk_widget_queue_draw_area () from /usr/lib/libgtk-x11-2.0.so.0
#15 0x00007ffff720af65 in gtk_widget_unparent () from /usr/lib/libgtk-x11-2.0.so.0
#16 0x00007ffff7037c23 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#17 0x00007ffff78a70e4 in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
#18 0x00007ffff78b885a in ?? () from /usr/lib/libgobject-2.0.so.0
#19 0x00007ffff78c26f1 in g_signal_emit_valist () from /usr/lib/libgobject-2.0.so.0
#20 0x00007ffff78c2892 in g_signal_emit () from /usr/lib/libgobject-2.0.so.0
#21 0x00007ffff7042b9a in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#22 0x00007ffff7043dfe in gtk_button_set_label () from /usr/lib/libgtk-x11-2.0.so.0
#23 0x00007fff8645ab69 in _lib_recentcollection_updated (instance=0x608180, user_data=0x7fff8c15e2d0)
    at /home/nss/src/darktable/src/libs/recentcollect.c:274
#24 0x00007ffff78a70e4 in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
#25 0x00007ffff78b906a in ?? () from /usr/lib/libgobject-2.0.so.0
#26 0x00007ffff78c26f1 in g_signal_emit_valist () from /usr/lib/libgobject-2.0.so.0
#27 0x00007ffff78c2a7d in g_signal_emit_by_name () from /usr/lib/libgobject-2.0.so.0
#28 0x00007ffff1e42067 in dt_control_signal_raise (ctlsig=0x6110f0, signal=DT_SIGNAL_COLLECTION_CHANGED)
    at /home/nss/src/darktable/src/control/signal.c:82
#29 0x00007ffff1df1d4e in dt_collection_update_query (collection=0x65b5d0)
    at /home/nss/src/darktable/src/common/collection.c:475
#30 0x00007ffff1e097ee in dt_film_set_query (id=31) at /home/nss/src/darktable/src/common/film.c:77
#31 0x00007ffff1e0a06a in dt_film_open (id=31) at /home/nss/src/darktable/src/common/film.c:137
#32 0x00007ffff1ea6548 in dt_camera_import_job_run (job=0x7ffff7ff2970)
    at /home/nss/src/darktable/src/control/jobs/camera_jobs.c:391
#33 0x00007ffff1e3ac45 in dt_control_run_job (s=0x7ffff7fd1010) at /home/nss/src/darktable/src/control/control.c:654
#34 0x00007ffff1e3b641 in dt_control_work (ptr=0x7ffff7fd1010) at /home/nss/src/darktable/src/control/control.c:809
#35 0x00007ffff4e6ddf0 in start_thread () from /lib/libpthread.so.0
#36 0x00007ffff18ab39d in clone () from /lib/libc.so.6
#37 0x0000000000000000 in ?? ()

Завтра подумаю как его лучше зарепортить.

provaton ★★★★★
()
Ответ на: комментарий от pacify

Нет, ты не прав. Эта штука выделяет прямоугольники с лицами.
Может использоваться, например, для автоматизации удаления «красных глаз» на фото.

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

firsttimeuser ★★★★★
()
Ответ на: комментарий от nikitos

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

Спасибо за подсказку. Что-то такое я и задумывал. Но для экономии
времени - сделал по стандартной схеме.

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

pacify ★★★★★
() автор топика
Ответ на: комментарий от ymuv

А какая тогда можно? AGPL2/3?

Только AGPLv3+

Чтобы слишком умные создатели сервисов не спешили нарушать приватность жизни жителей сети. ;)

pacify ★★★★★
() автор топика
Ответ на: комментарий от Chitatel-I-Pisatel

Вообще то это в какой то мере вынужденный шаг отчаяния, смотри прошлые темы ТС.

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

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

pacify ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.