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

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

Recommended Posts

Да..большая штука..на нее так сразу и место не найти, так она еще и запакована..Там вроде еще есть парочка вспомогательных баз, тоже на 20 гигов...Одна из них вроде как Features называется, это по идее результат прогона этой большой базы через обученную модель?? ИНтересно openface можно обучить по этой базе?? и на каких мощностях? Сама модель наверняка недоступна? или я как всегда что-то недочитал/недопонял :-)?

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


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

Вообще то это конкурс по распознаванию лиц, подается заявка, если она одобряется, то дается доступ к датасетам.

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

База аннотированная, есть основные ландмарки.

ЗЫ: Я думаю OpenFace учили на намного большем объеме данных.

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


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

установил всё без докера на убунту..немножко потанцевал с народным инструментом:-))куда же без этого. Три тестовых примера сработали как и в докере.. Теперь собсно можно разбирать код и ставить опыты...
Может кто-нить знает как трактовать вывод сравнивателя(compare.py)?
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
я так понял это квадрат расстояния чтоли?? и чем он меньше.. тем более похож
один на другого? а может я не дочитал какойто количественный критерий? типа <1
или >1?

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


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

они раньше жаловались ,что мало открытых данных, но может им корпорации подкинули.

megaface кстати с лейблами?

а то вот я им еще раньше писал

https://github.com/cmusatyalab/openface/issues/6

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


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

Подскажите плз, по openface в примерах разделяется два понятия: тренировка сети и тренировка классификатора, я чесно говоря думал это одно и тоже. Где я не прав? Спасибо.

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


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

Так с самого начала темы отделяем выделение базиса (они же фичи/признаки) и собственно разделение классов в этом базисе :)

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


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

Ну мы с самого начала о PCA говорили, потом вроде перешли на openface, я думал они
по разному работают

Похоже опять придется все переворачивать в голове:-))Извиняюсь,
 что переспрашиваю, но без правильного понимания я дальше не продвинусь.
Какое утверждение ближе к правильному пониманию:
1. Итак, я считал,
 что тренировка сети - это процесс, в результате которого нечто,
 называемое глубокой нейронной сетью НАУЧИТСЯ ИЗВЛЕКАТЬ из подсовываемого изображения
ключевые ПРИЗНАКИ в цифровом виде(128 мерный вектор) - это верно?  А что тогда
делает сам классификатор? просто извлекает эти фичи?Зачем его тогда тренировать?

2. Или в openface все так же как в обычном PCA, только больше фич?
Тренировка сети - процесс, в результате которого нечто,
называемое глубокой нейронной сетью перелопатит 100500 изображений,
найдет для всех их общие(главные) компоненты, отминусует их и полученные
остатки грубо говоря будут базисом. Классификатор будет извлекать фичи и опираясь на этот базис
вычислять минимальные расстояния. Все будет хорошо, но в основном для тех 100500 фоток, по
которым строился базис.

Спасибо. ученье свет!

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


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

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

 

Но есть более экономичный способ. Разбить классификатор на две части: энкодер и собственно классификатор.

 

Но. Задумайтесь, как Вы описываете незнакомых людей ?

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

Вы знаете, что это отличительные особенности/фичи отдельных личностей. А набор фич, выделяет конкретную личность.

Даже если он в другом освещении, под другим углом, то все равно будет "похож". 

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

Чтобы занести в базу человека, нужно вычислить его особенности, и записать.

Чтобы найти принадлежность нового лица, нужно найти ближайшее из базы.

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

Все обучение классификатора, работающего по методу ближайшего соседа сводится к созданию базы объектов с известными метками, видимо поэтому вы его в упор не видели :)

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


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

Такс..более продвинутые классификаторы и обучение их и новой сети
это наверно не для меня сейчас, первое, что я хочу сделать -
минимально действующую систему, чтоб вообще понять
что к чему работает и что в ней не устраивает.
 Тогда будет ясно в какую сторону улучшать..:-)
Наверно тогда и нужны новые классификаторы.Исходя из этого, Demo3(пример в Openface),
 которое описывает тренировку сети и классификатора мне пока не нужно.


Я полагаю, в openface входит достаточно хорошо натренированные сети
(nn4.small2.v1.t7; и еще несколько), которые умеют извлекать фичи, лучше чем то что я могу создать на данном этапе, поэтому пусть работают:-)
Пример извлечения фич - Demo2, функция getRep как раз возвращает 128 мерный вектор.
Таким образом получая такой вектор для каждого лица и сохраняя его в базе
с идентификатором лица можно получить уникальное соответствие. Но..
Мне неясно как тогда искать наиболее ближайших в этой базе. Этот момент
не рассмотрен в примерах и ложится на тех кто пользует openface? Или я чего-то не заметил?

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

персонажа до этого же лица и тогда поиск тривиален. Что скажете?

Спасибо.

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


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

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

Функция поиска ближайшего лица из базы и будет вашим классификатором (метод ближайшего соседа). Есть еще kNN из той же серии.

 

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

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

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


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

Я понял..на одном и том же расстоянии могут находится очень много лиц.. Да.. расстояние можно использовать как условие, которое значительно сузит область поиска, т.е. из всей базы я выберу лица, находящиеся только на таком же расстоянии например от центра координат..+- заданная погрешность, а потом среди них уже нужно искать другими способами..  тут нужно подумать что больше похоже например на 3,3,3: 2,2,2 или 3,3,0.:-)

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


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

Похожий трюк используется в CBIR, может излагаю не точно.

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

 

по-моему это называется

triangle-inequality principle

https://courses.cs.washington.edu/courses/cse576/02au/lectures/CBIR.pdf

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


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

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

Расстояние искать от каждого лица в базе до искомого лица я имел ввиду. Там ближайшее будет одно (наиболее вероятно).

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


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

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

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


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

Обычно бинарное дерево ускоряет поиск.

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


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

Да..тут уже похоже надо будет определяться с методами по мере возникновения трудностей, пока объем не вырастет, все будет ок а когда начнутся трудности(много похожих) - тогда нужно будет вводить дополнительные методы/условия.. ок. Спасибо.

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


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

Добрый день! Наигрался я с Openface, должен сказать вещь очень неплохая, но вот встало попутно два вопроса, даже три:-) 1. Как оценивать расстояние между двумя лицами с точки зрения похожести?? К примеру >1 - 100% разные люди, <0.2 - 100% один человек, ну и что делать с тем что между 0.2 и 1? Кто-нить как-то решал такую задачу? 2. Вопрос вытекает из предыдущего, хотел сравнить с другими системами, например OxfordProject, но те выдают величину Confidence - типа процент уверености, чтоли.. как соотнести результаты работы этих двух систем? или как можно результат работы openface перевести в что-то типа такого процента уверенности?. Ну и последний вопрос, есть ли какие нить улучшайзеры в системе, что-нить поменять добавить и попробовать снова - а вдруг лучше будет? с общей работой разобрался, теперь нужно делать тюнинг:-)) если возможно. Спасибо.

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


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

http://vis-www.cs.umass.edu/lfw/results.html

можно использовать ROC curve

Соответственно получить ROC curve варьируя threshold, потом выбрать threshold который больше подходит по задачу(больше ложных срабатываний или больше пропусков)

 

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


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

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

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


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

https://ru.wikipedia.org/wiki/ROC-%D0%BA%D1%80%D0%B8%D0%B2%D0%B0%D1%8F

https://en.wikipedia.org/wiki/Receiver_operating_characteristic

roc curve это один из методов сравнения двух моделей

 

LFW это бенчмарк.

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


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

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

Полученная статистическая модель даст Вам возможность оценивать достоверность (confidence).

 

Еще может будет интересно: http://vision.ia.ac.cn/zh/senimar/reports/Siamese-Network-Architecture-and-Applications-in-Computer-Vision.pdf

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


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

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

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

2.KD/VP деревья - распространенный и наверно самый упоминаемый алгоритм, суть в постепенном разбиении исходного множества на подмножества, организованные в виде дерева,
разницу между ними я пока не понял, описана здесь https://ru.wikipedia.org/wiki/VP-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE в разделе преимущества, но что это значит хз.В этом случае
для искомой точки по дереву быстро находится подмножество - а потом в нем уже деается линейный поиск.
Отрицательные стороны - распараллеливание будет менее эффективно, сложный мат. аппарат. Но в целом это должно быть лучше всех. Не понятны расходы памяти, но ясно что есть наличие
большой структуры в памяти(дерева) - как по мне минус для масштабируемости, все должно крутится на одной машине.
 
3. Есть еще способ типа триангуляции поверхности методом Вороного и еще какого товарища Делоне - но там по формуле расход памяти это количество точек в степени N/2 - т.е.
очень много в моём случае, это если я правильно его понял, посему я его отложил в сторонку.

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

Такой вот длиннопост вышел.. Поделитесь плз мыслями..Спасибо.:-)

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×