Face Detection на джаве — это просто!

    Спешу поделиться с вами своею радостью :) Столкнулся я тут недавно с задачкой — нужно было определить местонахождения лиц на картинке.

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

    Алгоритмы, в принципе, неплохо известны. Одним из лучших является алгоритм Viola & Jones, но поиск готовых имплементаций результатов не принёс. Было расстроился, но обратил внимание на замечательную нативную библиотеку — OpenCV. Библиотека ценна не только реализацией основных алгоритмов компьютерного зрения, но тем, что встречается решительно на всех платформах.

    И что же вы думаете? Одним из первых в гугле выпадает вот такой замечательный проект JNI интерфейса к OpenCV!

    Несколько минут закачки, десяток минут чтения документации с установкою программы, и ещё десяток — написание теста. А потом, и вот этими четырьмя строчками, просто берём и распознаём на картинке лица!

    OpenCV cv = new OpenCV();
    cv.loadImage("test.jpg", 300, 400);
    cv.cascade("haarcascade_frontalface_default.xml");
    Rectangle bounds[] = cv.detect();




    Насколько я понял, JNI интерфейс написал Bryan Chung для языка Processing (кстати, на его сайте выложено видео — иллюстрация работы программы), а код был потом доработан и выложен на Atelier hypermédia под BSD license.

    Средняя зарплата в IT

    113 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 10 037 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

    Комментарии 76

      +4
      круто) даже не знал, что такие технологии настолько доступны :)
        +1
        НУ как бы не очень сложное оно, у меня одногруппник на 3ем курсе писал такое.
          0
          написать-то можно, только замаешься потом калибровать: там жеж не только нормализация, но ещё и тренировка алгоритма

          В примере есть строчка «cv.cascade(»haarcascade_frontalface_default.xml");" — это как раз и есть загрузка предварительно сгенерированного каскада (они идут в комплекте вместе с OpenCV)
          0
          я тоже не знал, что можно вот так просто :) потому и делюсь.
          0
          Очень полезная штука, спасибо!
          Есть пара вопросов:
          — Как у этого модуля с производительностью? Какие-нибудь тесты делали?
          — Какой минимальный размер лица в пикселях распознаётся?
            0
            Тестов не делал, но с производительностью должно быть всё хорошо: OpenCV используется для захвата лиц из потокового real-time видео с уличных камер. Ну и до кучи все эти «Moution Eye» от сони тоже, в принципе, используют эту открытую библиотеку. С точки зрения же джавы там тоненькая прокси прослойка над апи нативной либы.

            Минимальный размер пикселей задаётся каскадом. Какой каскад будет — такой и минимальный размер :)

              +1
              насчет производительности… а какое железо и размеры кадра? =))
              я гибрид этого метода и интенсивности карт разгонял для поиска лиц на живом видео в реалььном времени.

              НО у каскадов openCV система обучена искать на видео очень хорошего(!) качества, не приемлемого для камер наблюдения к примеру =(
              на телефонных камерах та же проблема =)
              решал её наверно с полгода =)
                0
                распознавал для диплома аватарки из контакта, 15-20 пиксельное лицо довольно хорошо находит, при этом «ложных срабатываний» в разы меньше, чем «нераспознанных лиц»
                лица расположенные на изображение под углом не распознает, но это можно доработать добавив поворот на pi/2 и pi
                производительность для изображений ~200х200 около 200мс на изображение (это вместе с чтением/записью в файл с рамочкой), но зависит от параметров
                  0
                  Это на каком железе?
                  Фотки предварительно отбирали как-то для теста?
                    0
                    AMD64 4400+
                    фотки не отбирал, там хорошая выборка лиц / не лиц получается
                    также наглядно видно в каких местах алгоритм не справляется
                  +6
                  Порт на Actionscript 3.0:
                  www.libspark.org/wiki/mash/Marilena

                  Пример:
                  maaash.jp/lab/Marilena_sample/
                  0
                  Вах, давно хотел подобное поюзать. А то, что это кросплатформенно и есть ява биндинг ещё больше усилило стремление попользовать. Спасибо за ценный топик.
                    0
                    Круть!
                    Еще бы умел OpenCV «снимать» параметрические показатели лица — ваще цены бы ей небыло!
                      0
                      Параметрические показания можно и самому сделать, благо алгориты нормализации пространства доступны из того же OpenCV.
                        0
                        Жуть как интересно :)
                        Это ж можно распознавание лиц сделать.
                        И вместо того, чтоб носить с собой на работу «электронную бирочку» для входа в офис — просто поглядел в объектив видеокамеры, нажал кнопочку «открыть дверь», система подумала, серверок пошуршал у себя, сравнил данные с видеокамеры с данными сотрудников. И открыл || не открыл дверь.
                        Круть! Уже хочу!
                          0
                          к распознаванию — это сюда: faint.sourceforge.net/ :) Ребята забацали «The Face Annotation Interface» на основе всё того же OpenCV. Для определения лиц используют алгоритм «EigenFace»
                            0
                            Спасибо за ссылочку!
                            Попробуем, чего у ребят получилось
                              0
                              Особо следует пробовать летом и зимой, с бородой и без =)
                                0
                                Насчет зимой/летом — не знаю, но вот уверен чтоб уменьшить возможность подтасовки и прочих хаков (например фотки босса, как предложил Quadrix), нужно будет обязательно сделать «тесты» объекта.
                                Подходишь к небольшому терминальчуку, смотришь туда, система выдает, а теперь покажи язык :) А теперь скорчи рожу, а покажи как ты сердишься, а представь теперь, что ты удивлен :)))
                                Смотрим на реакцию лица, сравниваем с эталонами сотрудника — если ок:
                                — ты наш чувак, проходи!
                                  0
                                  Фух… уж лучше приложить ключ-таблетку.
                                    +1
                                    Ключ-таблетка — это просто и неинтересно :)
                                    А тут такое веселье перед началом рабочего дня.
                                    0
                                    Фотоальбом шефа с собой таскать ;)
                                +1
                                Ага. Помнится, захакали такую систему довольно просто — показывали видеокамере распечатанную фотографию «нужной» персоны :)
                                0
                                Буду с собой таскать фотографию босса ;)
                            0
                            Компьютерное зрение, говорите? Так вот чем надо капчи распознавать.
                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                Почему? По-моему, как раз то самое: распознавание форм, поиск контуров и т.п. — разве нет?
                                Я никогда не пользовался OpenCV, да и другими библиотеками компьютерного зрения, так что поправьте меня если я неправ.
                                  +1
                                  Насколько я понимаю, распознавание символов не есть задача систем компьютерного зрения. Вернее это более частный случай для которого существует целый класс OCR систем, и на java в том числе.
                                    +9
                                    после соответствующей настройки OpenCV будет обводить буквы кружочками =)
                                      +2
                                      Да, и будет говорить: «это каптча!» или — «нееет, это совсем не каптча».
                                        –1
                                        Ну, так не интересно :)
                                    • НЛО прилетело и опубликовало эту надпись здесь
                                  +1
                                  А для PHP екстеншн есть?
                                    0
                                    Такое, по мойму, лучше написать как серверное приложение и просто юзать из php.
                                      +3
                                      как ни странно, есть
                                        0
                                        к сожалению андер уйндоус не нашел а так спасибо огромное
                                        0
                                        есть… побаловался даже =)

                                        Интересно можно заставить это не только находить лица, но и распознавать кто на фотографии? =) Было бы удобнее вконтакте так выкладывать — выложил фотографию и уже всех друзей на ней отметило.
                                        +1
                                        <irony>Rectangle</irony>
                                          0
                                          и что?
                                            +1
                                            на фото такой ректангл.
                                            0
                                            видимо высмеивается красный кружок в примере вместо прямоугольника
                                              –1
                                              о.
                                            0
                                            Спасибо огромное! Действительно интересная вещь и любопытно хотя бы поиграться.
                                            То что подобные библиотеки есть open source — просто замечательно.
                                              –1
                                              да не за что — сам ненарадуюсь)
                                              0
                                              Мега! Мегавещь! Очень нехватает в соц.проекте! Уже сижу в консоле — ставлю пакеты под php :))
                                                –1
                                                ну, если честно, то под пхп я бы с этим аккуратно — сожрёт жеж всю память и не выплюнет!
                                                  0
                                                  отдельным демоном его :)
                                                    –1
                                                    жёстко! Не проще ль тогда написать на сях простенький CGI-REST и обращаться к нему из пыха?
                                                      0
                                                      Да зачем выкручиваться так? Модуль уже скомпилировал, тестирую вот — работает очень быстро, результат очень хороший — показывает отлично. Процессор не грузит.
                                                        0
                                                        что по памяти?
                                                          0
                                                          2 ядра, 2 гига, полет нормальный (20 фоток 500х600 в одном потоке, uptime не более 1.0)

                                                          на продакшин пока не пихал, как запустим проект — сделаю фишку для «фоток», там посмотрим. Памяти хватало всегда.
                                                            0
                                                            а что за проект? Ссылочку можно?
                                                              0
                                                              глубокая альфа, недели 2 еще и будет открыто. Думаю Хабр поможет положить сервер :)
                                                                –1
                                                                оу.
                                                0
                                                а как в андроиде сделано не смотрели?
                                                  –1
                                                  Не смотрел. Но подозреваю, что там тоже есть OpenCV.
                                                  0
                                                  Написание детектора лиц на С++ занимает не больше 5 страниц кода с нуля. и работает не хуже чем openCV =))
                                                    0
                                                    Его ж ещё обучать надо… Сама имлементация да, занимает немного.
                                                    +1
                                                    Сейчас пишу курсовую, две камеры снимают руку, и движение руки переводится в 3d-модель. Пишу на С# c использованием Aforge.NET Framework — библиотека для работы с нейронными сетями, ИИ, обработка изображений. Классная вещь вобщем… =)
                                                      0
                                                      прикольно! А посмотреть на результат можно где-нибудь?) Скажем, видео.
                                                        0
                                                        Результат работы моего приложения или библиотеки вообще? ))
                                                          0
                                                          лучше приложения)
                                                          +1
                                                          Вот вобщем две ссылки:
                                                          www.youtube.com/watch?v=4fStBSob3i4 — трекинг шарика с двух камер + Lego Robotics, всё для работы с Lego уже есть в AForge.

                                                          www.youtube.com/watch?v=lKkGOUW_xas — распознавание жестов рук.

                                                          www.aforgenet.com/ — собственно сама ссылка на проект, лицензия LGPL.

                                                          p.s. если имелась ввиду моя работа, то она еще не готова, курсовая расчитана на 2 семестра, вобщем допиливать еще много))
                                                            0
                                                            прикольно) но о работе по завершению уж отпишитесь, а?)
                                                              +1
                                                              Ок, обязательно)) Может еще статейку напишу про aforge.
                                                        0
                                                        Перепостила на community.livejournal.com/ru_wearable/54285.html со ссылками на оригинал и автора. Если Вы против — скажите, уберу копию Вашей статьи.
                                                          0
                                                          нет проблем. Можно поставить линк на ЖЖ — ymik.livejournal.com
                                                          0
                                                          и ссылки поставьте, а то не понятно, что за JNI интрфейс и всё такое :)
                                                          0
                                                          лучше бы объяснили, хотя бы вкратце, принцип работы применяемого алгоритма, а как юзать те или иные библиотеки, думаю, никого не надо учить
                                                            0
                                                            В тексте я указал название алгоритма — это широко известный алгоритм Виолы-Джонса. В гугле не составит труда найти развёрнутые описания работы алгоритма. Так что описывать их тут бессмысленно, разве что перевести на русский.

                                                            Вот, например. Или вот.
                                                              0
                                                              Перевести — тож вполне полезно :)
                                                            0
                                                            А у меня вопрос из прикладной области:

                                                            скажите, как обойтись без установки библиотеки в операционной системе, а использовать внутри своего проекта на java? Прослойка между openCV и java отличная получается, но заставлять пользователя дополнительно к проекту отдельно ставить библиотеки не хочется, сами понимаете.
                                                            Известно, как обойтись без установки на с++, а что насчет Java?

                                                            Заранее спасибо.

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

                                                            Самое читаемое