svoyak

Классификатор через SVM

16 сообщений в этой теме

Добрый день! Есть вот такая ситуация:
собрал и заработал OpenFace, с ним все хорошо..128 точек мне выдается.. Теперь возник вопрос как имея  
100000 таких записей осуществлять по ним поиск для выявления наиболее похожего? вот в этой статье
https://habrahabr.ru/post/306568/
автор разделил весь процесс на 4 шага и последний шаг - это как раз то что мне нужно, но я немного не понял
предложения использовать SVM(может потому что я не знаю что это:-) Я считал, что получив координаты искомого,
мы сможем довольно легко найти наиболее похожего путем наложения каких-нить фильтров, или вычисления
длины векторов в пространстве..Не могли бы вы немного прояснить где я не прав, похоже я не вижу проблемы там,
где она есть. И если можно чуть прояснить как использовать метод опорных векторов, может на каком нить примере,
почитал в википедии про него, но там как всегда сферический конь в ваккуме:-)) Я чесно говоря думал, что мне нужен какой-то

алгоритм поиска ближайшего соседа в N-пространстве, или не так?
  Спасибо.

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


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

Можно просто поиск ближайшего соседа в базе

Можно классификацию на N заданных персон.

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


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

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

Обычно получется так что точки для одного человека ложатся в виде N-мерной гиперколбасы и гиперколбасы эти переплетены между собой узлами. Так вот, чтобы понять где чье лицо нужно создать границы (не сферические), чтобы классификатор мог отличить где кто. Вот при обучении SVM и обучается классифицировать кто какой гиперколбасе принадлежит. 

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

Есть еще t-sne, которые могут выкладывать гиперпространство на плоскости или в 3-D.  

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


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

Кстати по поводу t-sne:

Я пробовал t-sne на дефолтах и получилось не лучше pca, а если надо подбирать параметры то реально ли картинка будет показывать насколько фичи различимы, ведь существует множество наборов параметров, а значит множество возможных проекций, некоторые из которых хуже, некоторые лучше.

Для pca маппинг идеально разделимых класов это 'ромашка'?

https://github.com/mrgloom/Kaggle-Two-Sigma-Connect-Rental-Listing-Inquiries-Feature-Visualization

 

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

http://www.robots.ox.ac.uk/~vgg/software/vgg_face/

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


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

Ок..спасибо за поддержку..как всегда понятно, что ничего не понятно..:-))

8 часов назад, Smorodov сказал:

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

Вы имеете ввиду перебирать все наличиствующие вектора?? наверно это будет очень долго..или я неправильно понял?? а по поводу SVM, если его научить классификации на некотором наборе, а со временем этот набор будет меняться(расти), то точность классификации будет ухудшаться???

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

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


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

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

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


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

Да со сферой то ничего сложного, для каждого лица есть 128-мерный вектор, длина которого равна единице.

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

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

Вот косинус и будет определять насколько похожи лица с точки зрения OpenFace.

 

Естественно при добавлении новых данных качество поиска будет падать.

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

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

То есть, добавил человека, переучивай SVM. 

 

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

 

 

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


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

для каждого лица есть 128-мерный вектор, длина которого равна единице.

я не проверял еще... тогда сделать предвыборку по длине не получится..  Я как-то упустил этот момент.. т.е. что, там все длинны векторов равны 1??

kNN сейчас тоже курю...:-)) вот интересно есть некие алгоритмы, встроенные сразу в несколько СУБД( MSSQL, postgres), вроде MSSQL Analysis Services(както так) и вроде бы эти алгоритмы как раз так и называются: Поиск ближайшего соседа(ей). Я бегло гуглил примеру работы с ними - они все для геоданных, у которых размерность маленькая.. и чесно говоря непонятно, можно ли натянуть их на задачу поиска среди 128ммерных данных.. Может кто слышал об этом что-нить?? Хорошо наверно было бы запользовать готовый велосипед.. Спасибо.

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


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

L2 norm =1, т.е. они нормированы.

 

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


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

kNN сейчас тоже курю...:-)) вот интересно есть некие алгоритмы, встроенные сразу в несколько СУБД( MSSQL, postgres), вроде MSSQL Analysis Services(както так) и вроде бы эти алгоритмы как раз так и называются: Поиск ближайшего соседа(ей). Я бегло гуглил примеру работы с ними - они все для геоданных, у которых размерность маленькая.. и чесно говоря непонятно, можно ли натянуть их на задачу поиска среди 128ммерных данных.. Может кто слышал об этом что-нить?? Хорошо наверно было бы запользовать готовый велосипед.. С

Я как-то занимался чем то подобным, из готовых БД скорее https://support.hdfgroup.org/HDF5/ подходит, а поиск соседей делать ручками. Но в конце остановился на простой загрузке векторов из файла в память, в моем случае этого вполне достаточно было, ну и поиск OpenCV-шным kNN.

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


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

Спасибо, я думаю руками в любом случае лучше сделать, как запасной/проверочный и самый понятный вариант..ок .. Подскажите плз, еще а где можно качнуть какойнить датасет с лицами? нашел вот такой CASIA-webface - но его и оригинальный не дают скачать, а еще говорят он весьма грязный.. ну в смысле там много мусора.. вроде бы его разраб OpenFAce почистил и выложил кудато но все сцылки дохлые.. Может еще есть чегото?? Спасибо

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


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

Тренируйтесь пока на LFW.

В OpenFace нет построения индекса? в том же OpenBR есть, но не знаю какой точно алгоритм, скорее даже правильно будет сказать пайплайн.

Еще у них есть не только L2 http://openbiometrics.org/docs/plugin_docs/distance/

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


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

Есть еще "MS-Celeb-1M Dataset" но не помню есть там метки обозначающие персону или нет. 

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

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

UPD: глянул, вроде должны быть метки: https://msceleb.github.io/celeb1m/1m 

 

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


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

В OpenFace нет построения индекса?

Я так понял OpenFace - это натренированная сеть и совсем чуток помогательных скриптов вокруг нее..А openBR - судя по их сайту, это целый фреймворк для работы..

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


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

Добрый день всем! Прогнал я все что предлагает openface и столкнулся наверно с непониманием своим.. Плз проясните где я неправ.. Опишу ситуацию. Я пользовался https://cmusatyalab.github.io/openface/demo-3-classifier/ вот этой инструкцией от производителя так сказать. Скачал LFW набор и решил провести на нем тесты. Цель - проверить предлагаемый производителем классификатор. Я выбрал всех у кого есть 5 и более фото(иначе там варнинги на какомто из этапов), это все равно несколько тысяч человек. Обрезал и отцентрировал их фотки согласно инструкции, скормил их извлекателю фич, получил два файла(как в инструкции) и потом скормил их тренировщику классификатора. Он тренировался минут 15-20 и закончил(сформировал файл). Далее я начал проверять сам классфикатор(он там в виде файла *.pkl) Я давал ему картинки из того же набора, на котором он и тренировался..для облегчения его работы. Результаты он выдавал очень грустные, то ошибки то правильное совпадение с confidense около 0,1 - это в лучшем случае. Тогда я начал последовательно уменьшать набор и результаты стали шикарными, когда в наборе осталось 3-4 разных класса, я так понимаю чтото здесь не так или я чего-то не сделал.. Я хотел использовать классификатор для быстрого поиска наиболее похожего и вроде бы по инструкции он там так и используется.. но у меня чтото не работает. Проясните плз куда смотреть.Спасибо. Я понимаю, что саму сеть ведь мне не нужно перетренировывать?? Она уже обучена и должна работать? только классификатор для моего набора, на фичах извлеченных готовой сетью?

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


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

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

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

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

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


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

Войти

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


Войти сейчас

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

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