Комментарии 24
А чем сравниваете вектора? Какой индекс используете?
Добрый день!
В данных подходах используется метод ближайших соседей (Nearest Neighbors), сравнение изображений в виде векторов происходит путем вычисления перебором расстояний между всеми парами точек в наборе данных. Близость векторов основана на вычислении косинусного или евклидового расстояния. В рассмотренных подходах использовалось косинусное расстояние – вычисление косинуса угла между двумя векторами – если косинус большой, то значит вектора находятся далеко друг от друга и изображения не похожи, в другом случае, при близости векторов, изображения будут считаться похожими.
Надеюсь ответил на Ваш вопрос.
Получение изображения в виде вектора с помощью сверточных автоэнкодеров происходит за счет того, что энкодер кодирует изображение, но обратное декодирование не нужно и берется слой из модели, который отвечает за кодирование изображения и сохраняется.
Он основан на расчете евклидового расстояния между векторами
То есть по сути алгоритм сводится к тому что
берём предобученную сетку
для всех изображений из банка и данного изображения берем значения из одного внутренних слоёв в режиме предсказания
задаём метрику (расстояние) между изображениями как евклидово расстояние между векторами из предыдущего пункта
для данного изображение ищем изображение из банка с минимальным расстоянием
но как принять решение совпало-не совпало основываясь на значении этого расстояния?
я решения не вижу
критерий типа расстояние < константы явно не прокатит
Ну понятно, что если брать данные из самого последнего слоя (то есть по сути из полученного значения классификатора) то алгоритм вырождается в задачу что нейросетка по данной картинке нашла нужный класс и она похожа на все картинки из этого класса
В общем, достаточно сравнения с порогом, либо выдачи топ 5-10 с дальнейшей обработкой.
Окей...ваш алгоритм выдал дистанцию 42
Это число многократно проверено и полностью отвечает на ваш вопрос...
Теперь примите решение...изображения совпадают или нет
Думаю вам будет затруднительно
Под дальнейшей обработкой вы подразумеваете просмотр кожаным мешком?
Порог очевидно выбирается, на основе данных для обучения, в соответствии с нужным отношением true positive/false positive. Именно исходя из этого можно определить 42 это много или мало.
https://towardsdatascience.com/understanding-auc-roc-curve-68b2303cc9c5
Не убедительно...не надо просто сыпать терминами
Это я и без ссылок знаю, но это не тот случай
А почему бы не рассмотреть другой алгоритм определения похожести
Имеем много сеток которые проверяют простые признаки на фото....например...наличие-отсутствие усов, наколок, количества глаз, носов и тд
То есть по сути по фото составляется описание...как ориентировка в полиции (даже по таким описаниям находят)...то есть каждому фото ставится вектор признаков....а далее обучаем еще одну нейросетку что два вектора признака принадлежат-не принадлежат одному лицу
Алгоритм очевиден
Думаю это проще и понятнее в текущих условиях использования нейросетей
Это как раз тот случай, не знаю что уж вы там знаете, и при чем тут сыпать терминами. Почитайте любые вменяемые результаты и исследования по данному вопросу, это стандартный и полностю рабочий подход.
В таком тоне вести диалог не вижу смысла.
То есть вы не можете определить - 42 это много или мало
Я ж вам сказал, что это легко определяется на размеченных данных, которые используются во время обучения, абстрактно этот вопрос не имеет смысла. Часто в качестве метрики используется косинусное расстояние, которое более менее нормализовано. Но вопрос о пороге все равно в конечном итоге определяется из данных.
Лично я не вижу почему это просто
Давайте несколько упростим схему нейросети до почти линейных преобразований (просто для рассмотрения данного вопроса)
Допустим мы на размеченных данных нашли некую величину, которая хорошо срабатывает для критерия дистанция < константа
Теперь на вход подаем изображение более контрасное (амплитуда величин больше)...соответственно снятый со слоя вектор имеет тоже большую контрастность и вычисленная дистанция может качнуться в любую сторону ... как большую так и меньшую
Толда критерий дистанция < ранее вычесленная константа теряет смысл
И например для вскрытия биозамка надо просто осветить свое лицо светом разной яркости и колористики....вот вам и отмычка для фейс-замков
Вся суть нейросеток, что их нельзя упростить до почти линейного преобразования.
Но вообще вопрос не в этом, базовая предпосылка использования эмббедингов это то, что похожие входные множества(в данном случаи похожие лица) отображаются в близкие вектора эмбеддингов. Можно долго размышлять, почему так происходит на практике, но если тренировать нейросетку, а потом отсечь ей голову, это будет так. Если эта предпосылка не выполняется, то полученная модель либо будет совсем мусором, либо существенно хуже любой "нормальной".
Очевидно, когда работают с изображениями делают базовую нормализацию, чтобы выровнять контраст и т.д. И так же очевидно, чтобы модель работала, обучающая и рабочая выборка, должны быть из плюс-минус одного распределения. (то есть какой-то значимый перекос в обучающих/реальных данных это априори плохо)
Теперь если вернуться к вопросу сравнения эмбеддингов. Да можно сделать еще одну настройку, в виде бинарного классификатора который будет принимать на входе два эмбеддинга(один запроса и другой из базы) и выдавать вердикт эквивалентны они или нет. (сравнение с порогом, полученным из данных, именно таким тривиальным классификатором и является) Чтобы на практике кто-то так делал, я лично не видел, думаю по целой совокупности причин, начиная что результат скорее всего получается не сильно лучше наивного расстояния, а возможно и хуже, и кончая тем что это дает линейную сложность, соответственно уже несколько миллионов лиц считать не так весело.
В том то и фишка идеи обратного распростанения ошибки для обучения, благодаря которому нейросетки заработали, что хоть чуть-чуть но пороговые функции линейны...так что вы не совсем правы
Да и после обучения пороговые функции не заменяются на ступенчатые (хотя это тоже всего лишь вопрос амплитуды входного сигнала)
Даже со всякими нормализациями исходного изображения, я перераспределяя интенсивность на кадре смогу изменить вычисленную дистанцию, а значит заставить сработать критерий неправильно
То есть, вы сделаете навороченный фейс-замок....я куплю пару диммируемых китайских фонариков разных спектров, подойду к замку и буду светить себе на лицо покручивая диммеры. Какая-то комбинация откроет замок.
Хотя можно и рожи покорчить...но это дольше по времени
Если бы все было так просто то adversarial attack, не были бы похожи на еле заметный/мутный шум. Всякие простые фокусы, приводят к тому, что точка вываливается из "аттрактора" реальных лиц и там сколько свети или не свети, все равно близкого расстояния не получится.
Можно не тоьько светить аналоговыми фонариками, но и проецировать на лица изображение видео...тогда каждый кадр - это попытка подбора ключа
Вот такой брутто-форс получается
А про фишки антираспознавательного макияжа тоже много пишут
И куча примеров, когда внесение шума заставляет нейросетку принять непрааильное решение
Пс
Вы из сбера...мои деньги точно в безопасности?
Вообщем опять начинаются попытки быстро найти решение...и как обычно начинают навешивать ограничения на входные данные...этого не может быть, потому что не может быть никогда...но иногда случается
Тут и аттрактор лиц уже привлекли и нормализацию кадра и тд и тп
Я не говорю что ваш алгоритм безполезен....просто он решает задачу задания метрики (отношение порядка) на наборе картинок... причем эти метрики могут быть разными в зависимости от того на что изначально обучалась нейросетка
Но определение порядка между обьктами не даст ответ на вопрос совпали-не совпали
Добрый день!
Решение о схожести изображений, помимо значения расстояния, принималось на основе проверке ‘вручную’ 5 - 10 фотографий, которые модель вывела как похожие (в любом случае необходимо было проверить действительно ли они похожи на исходную).
Спасибо за отклик.
Добрый день!
Я хотел бы дать ещё комментарии
Помимо евклидова расстояния в качестве меры схожести векторов можно использовать скалярное произведение векторов (например, я это использовал в https://habr.com/ru/post/266129/)
Если рассматривать предпоследний слой классификатора - то он фактически является значениями расстояний (в смысле скалярного проиведения предыдущего пункта) до заданных примерами классов, а последний слой просто делает выбор из лучшего значения
В обычном классификаторе при незначительном искажении входного изображения, полученные на предпоследнем слое расстояния изменятся практически пропорционально и все одновременно, поэтому работа последнего слоя по выбору оставит фактически тот-же выбор класса что и для незашумлённого изображения
Да - вы определили d(a,b) = |f(a)-f(b)|
Но не провели исследование, чему равно d(a+e,b)-d(a,b)=|f(a+e)-f(b)|-|f(a)-f(b)|, хоть при небольших e - как правило там будет огромный разброс и критерий d(a,B) < const , где B - коллекция примеров, думаю просто не будет работать на практике
Я правильно понимаю, что если использовать фото, которого нет в базе банка (например любые генерации лиц), то модель становится бесполезна?
ML-подходы по поиску похожих изображений