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

Распознавание лиц общий вопрос

Recommended Posts

Здравствуйте, вот и я пришел по работе к тому, чем хотел заняться еще в универе - распознавания лиц, :-) Googling привел к тому, что без opencv не обойтись,
так как все строится или прямо на ней или с её использованием. Хотел задать пока что несколько общих вопросов, дабы уберечь себя от ошибок на глобальном уровне
 и неправильного выбора метода и средств в самом начале. Задача ставится так: на входе идут наборы лиц(фото) для человека, нужно ессно сделать их отбраковку(повернуто, маленькое и всякое такое) по оставшимся
делать распознавание, т.е. для каждого чела будет несколько фото его лица, но может быть и одно.
1. Я использую с# - планирую использовать EmguCV? вроде как популярна и доки есть.
2. Я так понимаю, есть несколько подходов сделать задачу, отличающиеся как минимум точностью: PCA, AAS, AAM -если неправильно написал аббревиатуру - сорри, в голове большая каша пока.
Я склонен выбрать PCA - как наиболее описанный в примерах и я его вроде немного понял в основном благодаря чтению местного форума(спасибо огромное) и видел рабочие примеры, хотя как я понял он наименее точный.
С английским хоть и знаком но с этой темой раньше не сталкивался, посему тяжко.
Из изучения PCA я понял что по мере работы системы будет накапливаться информация (тут я уже плаваю) о пространстве лиц чтоли, т.е. сначала происходит обучение а потом по мере работы ессно будут добавляться новые
люди в связи с чем вопрос - саму информацию хранят в базах, да? Пространство лиц ведь должен обновляться и с течением времени вырастет до размеров, не помещающихся в ОЗУ. Если я тут чегото напутал плз поправьте.
В моем случае речь идет о кол-во до 1млн людей, у каждого из которых может быть несколько фото. Можно ли задачу 1млн разбить на N задач поиска в множествах меньших чем начальное, ну т.е. не делать одно
огромное пространство лиц(базу), а несколько небольших, и поисках запускать параллельно во всех и из полученных результатов выбрать наилучший, это в случае если требуется много ОЗУ. Если будет большая база,
 то в принципе можно хранить и обрабатывать ее на нескольких серверах - тут уже проблемы обработки с меня на sql лягут. Скажем так я плохо понимаю требования к памяти у этого метода, и опасаюсь что пойдя этим путем
получу систему, обрабатываемый обьем которой упрется в ОЗУ.

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

Этот вопрос писался не сразу, поэтому есть добавления, все пытаюсь его правильно сформулировать..:-) Еще одна попытка.. Для распознавания к примеру 1млн лиц нужно иметь сразу весь лям для обучения?. Мне вот нужен механизм
чтоб обрабатывал новые лица, т.е. сколько там вначале - неважно..пришло новое лицо, нет его в базе..значит добавить.. Вот вроде правильно сформулировал..а я переживаю, что для работы алгоритмов нужно изначальное обучение по всей базе.. так ли это??

Сорри, что намешано, но надо как то внести в голову просветление..:-)) Спасибо

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


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

С нуля миллион лиц, это авантюра :)

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

И да, пространство лиц и база данных это разные вещи и разные данные.

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

Для миллиона, даже для 10000 лиц стандартный opencv-шный PCA не пойдет, память переполнится.

Нужен итеративный метод.Я имею ввиду вычисление базиса.

Для хранения, да все ок, и то лучше какую-нибудь БД встроить, sqlite например. Каждое лицо будет представлено количеством чисел, равных размерности базиса.

ASM, AAM - ASM жидковато для миллиона, AAM - те же проблемы с вычислением базиса текстур что и выше.

Подружитесь с https://cmusatyalab.github.io/openface/ .

 

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


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

Спасибо вам за ответ. Итак я понял, что для обучения PCA нужна вся выборка, в принципе логично..соотвествеено добавление новых, для их поиска должно вызывать переобучение. Обучение это процесс непрерываемый(верно?) и посему должен целиком помещаться в ОЗУ - отсюда и трудности из-за объема.

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

И скажите плз биометрия здесь поможет? я видел проекты типа openbiometrics? чесно говоря не вникал, но возможно стоит? Это я о мысли искать людей по совпадению биометрических параметров лица. Спасибо. Openface сейчас буду копать, но я думал мат аппарат одинаков в этой области, посему если чтото не влазит в ОЗУ в Opencv, то не влезет и там?? или в https://cmusatyalab.github.io/openface другой подход? Спасибо

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


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

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

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

Есть итерационные методы, которым требуется ряд итераций, для достижения заданной точности.

Некоторые из них могут работать с данными по кускам.

По математическому смыслу, биометрия - тот-же PCA, только человекопонятный и более убогий :) 

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

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


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

OpenFace хорош. Он строит базис уже с помощью нейросетей.

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


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

Вы упоминаете итеративные методы вычисления базиса, можно плз где нить прочитать об этом? Почему так цепляюсь за opencv - для нее есть обертки с#, примеров много. Смысл я так понял в том что при работе базис будет выдавать некий набор чисел по которому из базы можно будет извлечь лица с похожим набором(или точно с таким), количество вариантов таких наборов в базисе определяется его начальной тренировкой. Поэтому чем она больше/качественней  - тем больше лиц будет различать PCA с этим базисом. Отсюда и трудности - если тренирровать на 2000 а потом подсовывать 1 лям, то найдется очень много похожих на каждого из этих 2000. Верно?. Интресно, количественное выражение затрат памяти, может кто-нить пару примеров? В принципе для построения базиса даже не итеративным способом можно арендовать какой-нить уберсервер в облаке с 384Гб ОЗУ - это ведь разовая операция будет, ну или очень редкая. 

OpenFace наверняка хорош, жаль что на питоне - я не отметаю вариант работы с ним, но чтобы пустится в авантюру изучения нового языка должны быть веские причины:-)..не могли бы вы немного раскрыть вашу фразу "OpenFace - насколько я знаю уже содержит обученную модель лица и будет выдавать по 128 мерному вектору на лицо, дальше группируйте, сравнивайте". Имею ввиду раскрыть в сравнении с opencv PCA, вроде бы используя opencv проблем с обучением нет? или 128 мерный вектор - это более качественный? который учитывает больше особенностей? а в Opencv - менее мерный вектор(сорри за кривой оборот)?

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


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

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

Попробую на пальцах:

 

Представьте плоскость, на ней точки.

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

У каждой точки 3 координаты, так как они в трехмерном пространстве.

 

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

То нам нужно будет задать только две координаты.

Однако мы также должны знать направления осей и расположение начала координат новой СК (это и есть собственный базис).

 

Вот неплохая анимация по этому поводу:

 

И да, готовой реализации итеративного алгоритма в OpenCV нет. Реализовывать нужно будет вручную.

https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=iterative%20pca

 

Теперь пара слов о точности. Объем, занимаемый всеми лицами (точками в пространстве лиц) ограничен вариацией параметров лиц.

Следствие: чтобы выделить одно лицо из миллиона, вам нужно взять миллионную часть этого пространства. Но нужно также учитывать вариативность лица одного человека (эмоции, положение головы, очки, прочее), и эти вариации могут выходить за объем одной миллионной пространства лиц, которое Вы выделили и влезать в пространство другого, а скорее всего, нескольких тысяч других человек.

 

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

 

Теперь по поводу необходимой памяти в существующей opencv-шной реализации, насколько я помню, там необходимый объем памяти пропорционален квадрату объема занимаемого всеми изображениями.

О, вот кстати статейка на русском: https://geektimes.ru/post/68870/ 

 

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


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

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

 

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


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

Тогда ок, разберетесь :)

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

Расстояния минимизируют методом наименьших квадратов. Это размещает все точки максимально в плоскости, и если мы выбросим все остальные координаты и оставим только плоскость, ошибки для точек будут равны как раз этому расстоянию до плоскости.

 

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


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

Ага.. а каждая ось, это условно говоря какаято характеристика лица. А количество этих осей которое будет оставляться и вообще обрабатываться как-то регулируется в  opencv реализации?? или там оно прибито гвоздями??  Я так понял в количестве таких осей отличие openface?(128 мерный вектор - это об этом?) и  соосно чем больше осей, тем более точно можно найти лицо..?сорри за возможно глупые вопросы, но очень уж разобраться хочется..:-))

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


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

А количество этих осей которое будет оставляться и вообще обрабатываться как-то регулируется в  opencv реализации?? или там оно прибито гвоздями??

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

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


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

Начинаете въезжать :)

Количество осей в opencv-шной реализации задается см. параметр int maxComponents=0, по умолчанию ищутся все.

Есть два варианта, где матрицы векторов перемножаются классическим образом (флаг DECOMP_NORMAL) и получется количество векторов равное размерности изображения - 1 или транспонируются, и тогда получается количество векторов равное количеству изображений - 1 (по умолчанию).

Важность осей характеризуется собственными числами, чем больше собственное число, тем больше дисперсия параметра в выборке и тем важнее эта ось. Поэтому вначале векторы сортируют по убыванию собственных (в opencv-шной реализации делается автоматически) чисел и оставляют только N наибольших. Часто как меру принимают процент от суммы собственных чисел, скажем оставляем столько осей, чтобы сумма их собственных чисел была не меньше 95% от полной суммы. Тогда потеря информации полученная при отбрасывании осей будет не более 5%.  Учитывая что собственные числа довольно быстро убывают, то значимых осей остается намного меньше чем размерность изображения. Для лиц хоть как-то заметно влияние 30-50 собственных компонент, остальные мало заметны. 30-50 измерений против 128 это существенная разница, поэтому OpenFace и работает намного лучше.

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


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

Получается, что openface пользует какойто принципиально другой алгоритм, раз у него получается выделить 128 ЗНАЧИМЫХ компонент? Я верно понял? Ведь по теории столько же можно выделить и в Opencv,(если дать изображение с нужным размером и не упираться в ТТХ компьютера). Но в opencv реализации из этих 128 важную роль будут играть 30-50(остальное выкидывается), а в openface - все 128. И поэтому openface лучше/круче. Верно?

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


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

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

Картинку, для случая разделения двух классов, прикрепил. 

Basis.PNG

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


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

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

Разве OpenFace для этих целей не нейросети использует?

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


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

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

А разные энкодеры и самоорганизующиеся сети только и занимаются формированием оптимального базиса. Думается такой энкодер и используется в OpenFace.

У нейронных сетей получается сложный нелинейный базис, в отличие от разных вариаций линейных регрессий.

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


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

Мало так по openface информации... гугел его почти не знает... вроде библиотека не большая.. я так понял они пользуют Torch -  и в этом весь компот.. питон как таковой там особо и не нужен и dlib дергают C++ ый а кто нить пользовал вообще этот проект, работает??

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


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

Работает, ничего сложного нет. Питон прост как валенок, его можно даже и не учить, а просто гуглить непонятные места.

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


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

Да, это я видел..собсно кода там совсем немного и он в принципе ясен.. Я так понял из раздела установки всё рассматривается в контексте linux? Я так понял больше сложностей чтоб все это развернуть и запустить..

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


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

Да, конечно Линукс.

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


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

Доброго дня всем! Установил я докер и сборку его от bamos, как указано в мануале.. вроед бы без ошибок, правда не лучшим образом(на убунте, которая в виртуалбоксе), докер контейнер запускается в баш(кошмар для таких виндузятников как я:-)), но тем неменее..из руководства по установке взял


1)./demos/compare.py images/examples/{lennon*,clapton*}
2)./demos/classifier.py infer models/openface/celeb-classifier.nn4.small2.v1.pkl ./images/examples/carell.jpg
3)./demos/web/start-servers.sh

как я понимаю(плз, поправьте если понимаю не верно) это 1) - определение один ли человек на фото чтоли? а как трактовать вывод его в консоль

Comparing images/examples/lennon-1.jpg with images/examples/lennon-2.jpg.
  + Squared l2 distance between representations: 0.763
Comparing images/examples/lennon-1.jpg with images/examples/clapton-1.jpg.
  + Squared l2 distance between representations: 1.132
Comparing images/examples/lennon-1.jpg with images/examples/clapton-2.jpg.
  + Squared l2 distance between representations: 1.145
Comparing images/examples/lennon-2.jpg with images/examples/clapton-1.jpg.
  + Squared l2 distance between representations: 1.447
Comparing images/examples/lennon-2.jpg with images/examples/clapton-2.jpg.
  + Squared l2 distance between representations: 1.521
Comparing images/examples/clapton-1.jpg with images/examples/clapton-2.jpg.
  + Squared l2 distance between representations: 0.318


? он несколько изображений сравнивает?

2. это он наверно определяет кто это по картинке да? вывод такой

=== ./images/examples/carell.jpg ===
Predict SteveCarell with 0.97 confidence.

, используя celeb-classifier.nn4.small2.v1.pkl - это вроде одна из их обученных сетей, верно? я видел гдето, что можно взять другую? это маленькая а есть поболее..Я правильно понимаю процесс: ему дали carell.jpg, нейросеть извлекла фичи, а далее он должен был где-то извлеченные фичи поискать и найти соответствие? там в докере гдето какаято небольшая база есть? кто-нить знает как там организовано? и как вывести не конечный результат а сами извлеченные фичи? чтоб потом самому сравнивать.?

третий пример вроде на определение лица..чот он у меня камеру не нашел..ну эт не мудрено..на виртуалке ее нет.. но вообще в докер както камера прокидывается?? или здесь надо исключительно на реальную систему ставить все хозяйство и пускать?

Ну и последний нубский вопрос, как в докере mc установить, apt-get install mc не находит, это репы не прописаны в докере стандартные?

Еще раз спасибо за помощь, дело движется понемногу..:-))

 

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


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

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

 

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


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

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

Не думаю что это лучший вариант для распознавания лиц.

Его можно использовать с LBP гистограммами на входе например, работать будет.

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


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

А кто-нить понял как собссно делать Extract Features для входящей картинки?? Я правильно понимаю: эти Features и есть тот 128 мерный вектор, описывающий данное конкретное лицо, и чтобы найти похожих мне нужно эти векторы для обработаных людей хранить в базе и искать среди похожих на того, кого в данный момент дали на вход? Это верное понимание??

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


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

Пришел ответ от мегафейса.

Скачиваю 64 Гб.  Кому надо, пишите в личку, поделюсь.

  • Like 1

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×