Как преобразовать отпечаток пальца в уникальный идентификатор, чтобы использовать его для поиска в базе данных?

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

После сохранения отпечатков пальцев в базе данных я теперь хочу найти пользователя, используя отпечаток пальца, и я не могу выполнить поиск, используя новый отпечаток пальца, потому что отпечаток пальца сохранен как blob/img. поэтому мне нужно преобразовать отпечаток пальца в уникальный идентификатор, чтобы использовать его для поиска в базе данных?

У меня есть база данных mysql с 9 000 000 пользователей. Теперь я могу получить любую информацию о пользователе, используя имя пользователя (имя пользователя)

SELECT USERS FROM members WHERE username=username_var

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

Все SDK отпечатков пальцев имеют функции, которые могут помочь мне в этом, но они не такие быстрые и занимают 7 минут для поиска, а это очень долго.

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


person ss.5    schedule 14.05.2016    source источник
comment
Мы не знаем, что такое шаблон отпечатка пальца, о каком отпечатке вы говорите и что, черт возьми, делает устройство, которое вы используете. У вас есть неполный вопрос, пожалуйста, сделайте его более ясным и объясните, что вы делаете. Вы хотите найти человека по ‹чему-то с отпечатком пальца›. Что это?   -  person N.B.    schedule 14.05.2016
comment
@Н.Б. готово :) спасибо   -  person ss.5    schedule 14.05.2016
comment
Значит, все данные, которые у вас есть, на самом деле являются изображениями? Я бы создал еще один столбец и сохранил бы хэш изображения (достаточно SHA1). В вашей таблице будут столбцы (id, unique_id, fingerprint_image). Чтобы соединиться с members, используйте соединительную таблицу members2fingerprints (member_id, fingerprint_id). Затем, когда вы сканируете отпечаток пальца, хешируйте результат и запрашивайте свою базу данных. Это должно вас заинтересовать, если у вас есть еще вопросы - стреляйте.   -  person N.B.    schedule 14.05.2016
comment
@Н.Б. Большое спасибо, у меня проблема с тем, что изображения отпечатков пальцев никогда не будут точно такими же, поэтому SELECT WHERE никогда не будет работать здесь.   -  person ss.5    schedule 14.05.2016
comment
Ну, вот почему вам нужно больше исследовать этот SDK отпечатков пальцев. Я понятия не имею, что он делает и как он соотносится с отпечатками пальцев. Он должен делать что-то большее, чем просто выдавать изображение, потому что если он выдает вам только изображение — это плохое устройство, смартфоны могут выдать вам изображения отпечатков пальцев с помощью своей камеры. Извините, но я больше не могу вам помочь, в вашем сканере отсутствует информация, о которой я не знаю.   -  person N.B.    schedule 14.05.2016
comment
@Н.Б. спасибо, если вы можете проверить это, возможно, вы можете мне помочь dreamincode.net/forums/topic/   -  person ss.5    schedule 15.05.2016
comment
@Н.Б. Есть только несколько сканеров отпечатков пальцев, которые действительно выполняют сопоставление на устройстве. Большинство сканеров отпечатков пальцев просто захватывают изображения, а их сопоставление зависит от главного компьютера и алгоритма. Хотя камера мобильного телефона действительно может сделать снимок отпечатка пальца, на самом деле использовать это изображение для сопоставления очень сложно. Большинство датчиков отпечатков пальцев имеют сложную оптику для четкого и точного захвата только выступов и впадин отпечатка пальца.   -  person mageos    schedule 25.05.2016
comment
@mageos - я тебе верю, я действительно не использовал эти сканеры, поэтому просто делал предположения. Это действительно правда, что некоторые вещи следует оставить экспертам, а не людям, которые понятия не имеют, о чем они говорят, таким как я в этом случае :) спасибо за комментарий, буду иметь его в виду.   -  person N.B.    schedule 25.05.2016
comment
@ ss.5 Вы нашли какое-нибудь решение для этого? Можете ли вы помочь мне с этим, у меня такая же проблема, чтобы сопоставить отпечаток пальца с базы данных. Спасибо   -  person Gautam Vasoya    schedule 08.09.2017


Ответы (4)


Резюме

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

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

И в этом случае Secugen SDK допускает только доступ к изображению (я полагаю, в диагностических целях) и ему нужно запустить саму проверку (и для этого вам нужен комплект 1:N; комплект 1:1 не подойдет). Если вы все еще хотите продолжить это, я включу предложение внизу. Имейте в виду, на самом деле не рекомендуется.


Скучные детали

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

Вместо этого существуют функции (и они должны быть в вашем SDK) для преобразования изображения отпечатка пальца в список особых характерных точек (пересечений, завитков и т. д., называемых minutiae), вместе с их относительным расположением и другими параметрами. параметры. Уровень, до которого это происходит, зависит от используемого SDK и библиотеки: существует более одного метода. Целеустремленность для очень конкретного сенсора помогает, но тогда методы различаются тем, что они предлагают (например, надежностью, устойчивостью к небольшим поворотам отпечатков пальцев и т. д.). См. эту статью в качестве примера, а также ссылки на другие методы.

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

Когда у вас есть вектор признаков, вам нужно преобразовать его в хранимый объект SQL, который может быть строкой или серией столбцов в кортеже. Как это сделать, зависит от того, как построен вектор. Природа этого объекта будет определять, какой поиск вы сможете выполнять. Этот перевод можно выполнить несколькими способами, и это определенно не что-то вы должны попробовать сами.

Это также связано с тем, что даже после векторизации отпечатков пальцев у вас все равно не будет точного совпадения. Даже между двумя отпечатками пальцев одного и того же человека, снятыми в течение одной минуты. Вместо этого у вас будет несколько положительных совпадений и несколько отрицательных совпадений, и вам нужно будет установить доверительный порог для обоих («это он», «это не он», «не могу сказать»). А также решить, допускать ли и до какой степени ложные срабатывания («Да, это он!» — но это не так) и ложноотрицательные («Нет, это не он» — и это было). На дверном замке вы не хотите ложных срабатываний, но можете допустить ложный отрицательный результат (вы просто снова проводите пальцем). В уголовном расследовании нельзя допустить, чтобы ложноотрицательный результат ускользнул от преступника, и вы можете принять дюжину ложноположительных результатов (вы проверите их алиби позже...), но не сотню (вы не можете проверить ни одного сотни человек, и у некоторых из них не будет алиби - всех не арестуешь).

А для больших баз данных вам всегда придется запускать первый проход, в результате чего вы ограничиваете поиск теми отпечатками, которые имеют разумное инвариантное совпадение признаков (например, "абсолютное число оборотов между 75% и 125% выборки). Это необходимо для уменьшения количества кортежей, которые вы затем будете подвергать дальнейшему неинвариантному анализу, который намного дороже и определенно не может быть выполнен со стандартными функциями MySQL.

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

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

Даже такая простая вещь, как «возврат ближайшего совпадения или определение того, есть ли совпадение вообще?» сильно зависит от того, как отпечаток пальца обрабатывается перед сохранением. Вот почему обычно SDK предоставляют высокоуровневый интерфейс для сопоставления с отпечатком пальца, и они сами выполняют тяжелую работу. Иногда эту тяжелую работу вообще невозможно перевести в базу данных (или не без огромных трудностей); например, если «зачисление» на самом деле является обучением нейронной сети, а не вставкой вектора признаков в базу данных.

Грязный взлом

У вас девять миллионов пользователей (кто вы, ФБР?) и разрешение на получение девяти миллионов отпечатков пальцев. И у вас есть этот SDK. И о сопоставлении девяти миллионов изображений не может быть и речи. Но по указанным выше причинам вы можете задать SDK только вопрос "Есть ли это изображение в вашей базе данных?" и получить список, скажем, из трех имен с «Да на 99%, да на 92%, да на 90%».

Вы можете возможно сделать это: запустить очень высокий уровень, очень грубый биннинг на изображении, основанный на чем-то действительно макроскопическом. Я не знаю, может быть, количество мелких деталей хребта. Вам нужно будет сделать это, изучив изображение; возможно, OpenCV может вам помочь. Вы получите число от 1 до N, и это число будет ненадежным, с погрешностью, скажем, 2%.

Ключевым моментом здесь является то, что вы должны быть уверены, что SDK никогда не скажет, что отпечаток, который должен войти в блок X, когда-либо совпадет с отпечатком, который вы поместили в блок Y.

Затем вы можете построить пятьдесят баз данных с одной пятидесятой пользователей в каждой, предполагая (скорее: надеясь), что ваше распределение параметров является достаточно плоским, а не крутым гауссовским. При анализе отпечатка пальца вы можете скопировать в каталог базы данных SDK одну из пятидесяти баз данных, соответствующую значению X от имеющегося у вас отпечатка пальца, и в которой вы будете хранить только тех пользователей с таким же значением X. Из-за неопределенности некоторые пользователи будут находиться в двух базах данных, но таким образом вы уменьшите проблему в пятьдесят (или, может быть, в сорок пять) раз.

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

person LSerni    schedule 14.05.2016
comment
большое спасибо, есть много полезной информации, но я новичок в этом, можете ли вы привести мне пример. Знайте, что я могу сохранить детали отпечатков пальцев в качестве шаблона, используя свой SDK, и я могу сохранить его в БД, что мне делать дальше - person ss.5; 15.05.2016
comment
проверьте это для лучшего понимания dreamincode.net/forums/topic/ - person ss.5; 15.05.2016
comment
Я понимаю. Ваш SDK позволяет скомпилировать изображение в шаблон. Попробуйте следующее: возьмите шаблон для двух разных сканов указательного пальца (назовите их А и Б) и один для безымянного пальца (С). Вы можете получить доступ к шаблонам? На что они похожи? Если вы можете обнаружить сходства между A и B, которых нет между A и C или B и C, то вы можете попытаться разработать фильтр MySQL, который будет находить только вероятных кандидатов. Затем вы можете запустить m_FPM.MatchTemplate() только для этих образов. Боюсь, что без документации SDK мы мало что можем вам рассказать. - person LSerni; 15.05.2016
comment
Документация SDK, scribd.com/doc/312618062 / - person ss.5; 15.05.2016
comment
2.14. Формат шаблона FDx SDK Pro поддерживает три типа форматов шаблонов отпечатков пальцев: • Собственный формат шаблонов SecuGen («SG400») • Формат ANSI-INCITS 378-2004 Finger Minutiae для обмена данными («ANSI378») • ISO/IEC 19794-2: Форматы обмена биометрическими данными 2005 г. — Данные об отпечатках пальцев («ISO19794-2») Шаблоны SG400 зашифрованы для обеспечения высокого уровня безопасности и имеют размер 400 байт. Шаблоны ANSI378 и ISO19794-2 не зашифрованы, и их размер зависит от того, сколько пальцев находится в структуре и сколько найдено контрольных точек. - person ss.5; 15.05.2016
comment
Жду вашей помощи :) - person ss.5; 15.05.2016

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

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

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

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

Ни один биометрический алгоритм не идеален. Точность алгоритмов измеряется двумя показателями: процентом ложных допущений (FAR) и коэффициентом ложных отклонений (FRR). По мере того, как вы работаете над снижением FAR, вы неизбежно увеличиваете FRR по мере увеличения порога соответствия.

person mageos    schedule 25.05.2016


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

m_FPM.SetTemplateFormat(SGFPMTemplateFormat.ANSI378); чтобы задать для шаблона значение ANSI378, а затем сохранить его в базе данных.

or

m_FPM.SetTemplateFormat(SGFPMTemplateFormat.ISO19794); чтобы установить для шаблона значение ISO19794-2, а затем сохранить его в базе данных.

затем, когда вы сопоставляете захваченный шаблон отпечатка пальца с сохраненным в базе данных, вы затем захватываете изображение отпечатка пальца, а затем конвертируете его в шаблон ANSI или ISO в зависимости от типа формата шаблона. вы решили сохранить свои шаблоны, а затем выполните сопоставление с помощью функций MatchAnsiTemplate или MatchIsoTemplate в вашем SDK в соответствии с форматом шаблона, который вы выбрали для архивных шаблонов отпечатков пальцев в своей базе данных.

Я также отметил, что у Secugen есть собственный собственный формат шаблона SG400, который вы также можете использовать. Основная проблема здесь заключается в том, что если вы сохранили свои шаблоны отпечатков пальцев в формате ANSI, то для захваченного изображения отпечатка пальца преобразуйте его в шаблон ANSI, а затем переберите шаблоны отпечатков пальцев в базе данных и используйте функцию MatchAnsiTemplate, чтобы найти правильное совпадение. . Если вы сохранили свои шаблоны отпечатков пальцев в формате ISO, то для вашего захваченного изображения отпечатка пальца преобразуйте его в шаблон ISO, а затем просмотрите шаблоны отпечатков пальцев в базе данных и используйте MatchIsoTemplate. strong>, чтобы найти правильное совпадение.

person Joseph    schedule 16.05.2016
comment
Спасибо, но если я сохраню шаблон в своей базе данных, как искать в базе данных, используя новый шаблон отпечатка пальца? Поэтому я не могу искать с помощью WHERE, если вы меня понимаете. - person ss.5; 16.05.2016