Алгоритм сравнения отпечатков пальцев: комбинация классических алгоритмов |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2024-09-16 12:23 Теория алгоритмов, актуальная математика, распознавание образов Про алгоритмы распознавания по отпечаткам пальцев человека написано много статей. Описание алгоритмов обработки и сравнения отпечатков пальцев включено во многие учебники по компьютерному зрению и обработке цифровых изображений. Целью этой заметки не является дать исчерпывающую информацию по алгоритмам распознавания отпечатков пальцев, а на примере решения задачи сравнения отпечатков пальцев показать, как можно использовать и комбинировать между собой классические алгоритмы Сomputer Science (обход графа и нахождение наибольшей общей подпоследовательности) для решения практической задачи. Постановка задачи На мой взгляд, наилучшее и исчерпывающее введение в задачу распознавания отпечатков пальцев даётся в справочнике [1]. Там же рассматриваются различные подходы к описанию отпечатков (выделению характерных признаков) и их последующему сравнению. Наиболее распространённый и наиболее старый из существующих методов - описание отпечатков пальцев путём выделения на папиллярном узоре характерных особенностей – минюций (окончаний и ветвлений папиллярных линий). Примером алгоритма выделения минюций на изображениях отпечатков пальцев является алгоритм MINDTCT, реализация которого включена в пакет программ NIST Biometric Image Software (NBIS)[3]. Исходный код NBIS доступен по ссылке [4]. Применяя алгоритм выделения минюций к изображению отпечатка, мы получаем описание отпечатка в виде списка минюций. Каждая минюция описывается набором параметров, который включает в себя: - координаты минюции по отношению к системе координат, связанной с изображением отпечатка (центр координат - левый верхний угол изображения, ось ординат направлена вниз); - её направление , которое определяется значением угла касательной к папиллярной линии в точке по отношению к горизонтальной оси; - тип минюции (окончание или ветвление); - другая информация, описывающая степень уверенности в корректном выделении минюции (коэффициент качества минюции), а также уникальные особенности минюции, которые могут быть использованы при сравнении. Далее мы будем рассматривать описания минюций только их координатами и направлением. Задача алгоритма сравнения двух отпечатков и будет заключаться в вычислении коэффициента подобия , отражающего степень совпадения между двумя отпечатками пальцев. В случае описания отпечатка набором минюций нам необходимо посчитать число совпадающих минюций после компенсации сдвига и поворота отпечатка по отношению к отпечатку с учётом локальных нелинейных деформаций (Рис. 3). Примеры отпечатков взяты из датасетов, размещённых на сайтах международного конкурса Fingerprint Verification Competition [2]. Здесь я сознательно опускаю строгое математическое описание задачи сравнения, стараясь передать суть простыми словами. Любителей строгих математических формулировок отсылаю к уже упомянутому справочнику [1], раздел 4.3.1. Приведённый выше рисунок хорошо иллюстрирует основные проблемы, возникающие при сравнении отпечатков с использованием минюций: - Список выделенных на отпечатке минюций в общем случае неупорядочен и имеет переменный размер: некоторые минюции могут отсутствовать из-за того, что часть поверхности пальца отсутствует на изображении отпечатка. А некоторые минюции могут быть не обнаружены алгоритмом выделения минюций. Возможна и обратная ситуация - алгоритм обнаружения создаёт несуществующие минюции. - Изображение отпечатка пальца обычно получают путём контакта трёхмерной поверхности пальца с плоской поверхностью сканера отпечатков. Поэтому помимо относительного сдвига и поворота между сравниваемыми отпечатками возникают различные нелинейные деформации папиллярного узора, которые в общем случае достаточно сложно промоделировать. Это приводит к тому, что даже если у нас будет достоверная информация о взаимном сдвиге и повороте отпечатков относительно друг друга, после компенсации сдвига и поворота минюции могут не совпасть по своим координатам и направлениям. Для решения последней из указанных проблем, вводят следующее правило: две минюции и будут образовывать пару в том случае, если выполняются следующие условия:
В последнем выражении выбирается минимум из двух величин: и из-за цикличности значения разности углов (разность между углами и составляет всего лишь ). Пороговые значения и задают пространство допусков (tolerance box): чтобы минюции образовали пару, необходимо, чтобы после взаимного совмещения отпечатков они находились достаточно близко к друг другу, а их направления не слишком сильно различались. Пример образования пар минюций для двух сравниваемых отпечатков после компенсации взаимного сдвига и поворота представлен на рисунке ниже. Алгоритм сравнения отпечатков пальцев Для решения задачи сравнения отпечатков рассмотрим алгоритм, описанный в статье [5]. Алгоритм включает в себя следующие этапы:
Такое построение алгоритма сравнения позволяет избежать необходимости предварительного совмещения точечных образов, что в случае некорректной оценки параметров глобальных преобразований может приводить к принятию ошибочного решения о схожести сравниваемых отпечатков. Теперь пройдёмся по каждому из описанных выше этапов. Подготовка промежуточного представления отпечатка Входными данными для этого шага является список выделенных на отпечатке минюций: . Здесь .Для получения промежуточного представления отпечатка выполним следующие шаги: Шаг 1. Вычисляем координаты центра тяжести для списка минюций, полагая, что "масса" каждой из минюций равна 1:
Если для каждой из минюций алгоритм выделения минюций вычисляет коэффициент качества, то этот коэффициент можно использовать в качестве значения "массы" минюции: Шаг 2. Отсортируем список минюций по возрастанию их взаимного расстояния от центра тяжести . Зачем проводить такую сортировку, будет понятно после рассмотрения последующих этапов алгоритма сравнения. Шаг 3. Для каждой минюции формируют локальную структуру, которую авторы алгоритма [5] назвали "K-plet". "K-plet" строится таким образом, чтобы быть инвариантным к возможному взаимному сдвигу и повороту, который может присутствовать на сравниваемых отпечатках. "K-plet" состоит из центральной минюции и других минюций отпечатка . К тому, как выбрать эти минюций, мы вернёмся позднее. Каждая минюция представляется тройкой чисел . Здесь - Евклидово расстояние между минюциями и ; - угол, который образует отрезок, соединяющий минюции и ; - направление минюции относительно направления центральной минюции . Звучит не очень понятно, но если посмотреть на рисунок, то всё встаёт на свои места. Ниже приведены формулы расчёта параметров для минюции в случае, если центральная минюция :
Здесь функция определяется аналогично соответствующей функции стандартной библиотеки языка С. Теперь рассмотрим подробнее процедуру формирования "K-plet" для очередной минюции в предположении, что для всех других минюций мы уже вычислили значения . Шаг 3.1. Разделим множество минюции на четыре непересекающиеся группы, соответствующие квадрантам, на основании значений : При этом в какой-то группе может и не быть минюций (как например в группе III). Шаг 3.2. Для каждой из сформированных на предыдущем шаге групп проводят сортировку минюций внутри группы в порядке неубывания значений . Шаг 3.3. Сформируем пустой список минюций, который будет описывать "K-plet". Совершаем последовательный циклический обход сформированных групп (I группа -> II группа -> III группа -> IV группа -> I группа -> ...). При каждом посещении какой-либо группы выбираем очередную минюцию и добавляем её в "K-plet". При этом одновременно удаляем выбранную минюцию из рассматриваемой группы и переходим к следующей группе. Если в какой-либо группе изначально отсутствуют минюции или группа оказывается пустой на каком-либо цикле обхода, то переходят к следующей группе. Циклический обход групп завершается, если из всех четырёх групп суммарно было выбрано минюций или если выбраны все минюции. Пример, иллюстрирующий шаг 3.3. для случая представлен на рисунке ниже: Указанный способ выбора минюций для построения "K-plet" позволяет сохранить высокую связность между различными областями отпечатка, в отличие от простого выбора наиболее близких по расстоянию от центральной минюций. Как мы увидим в дальнейшем, высокая связность является важным свойством, используемым алгоритмом сравнения. Итак, в результате мы получаем структуру данных, представляющую собой массив "K-plet" для каждой из минюций, выделенных на отпечатке. Визуализация промежуточных представлений отпечатков для нашего примера приведена на рисунке ниже. Сравнение промежуточных представлений отпечатков Рассматриваемый алгоритм сравнения основан на попарном сравнении локальных структур минюций ("K-plet") с последующим переходом к сравнению локальных структур для соседних минюций. Звучит опять не очень понятно. Чтобы разобраться в устройстве алгоритма сравнения, обратимся ещё раз к рисунку выше, на котором изображены два промежуточных представления отпечатков одного и того же пальца. Перед нами - два графа (обозначим которые и соответственно), вершины этих графов - минюции. Выберем две вершины (минюции), одна из которых принадлежит , а другая - . Будем считать, что выбранные вершины представляют одну и ту же минюцию. Чтобы убедиться, что два отпечатка принадлежат одному и тому же пальцу, нам будет необходимо обойти все оставшиеся вершины в двух графах и посчитать число вершин, которые представляют одну и ту же минюцию на двух отпечатках. Обозначим число таких вершин через . Тогда коэффициент подобия вычисляется по следующей формуле:
где - количество минюций, выделенных на отпечатке , а - количество минюций, выделенных на отпечатке . Для обхода вершин графов мы можем воспользоваться либо алгоритмом обхода графа в ширину (breadth-first search, BFS), либо алгоритмом обхода графа в глубину (depth-first search, DFS) [6]. В данном конкретном случае нет абсолютно никакой разницы, какой алгоритм обхода (BFS или DFS) мы можем использовать. Авторы алгоритма [5] предлагают использовать алгоритм BFS. Мы же, чтобы было интереснее, будем использовать алгоритм DFS. Хотелось бы напомнить, что разница между BFS и DFS заключается в порядке обхода вершин. Порядок обхода задаётся структурой данных, которая служит для хранения и последующей выборки посещённых, но не обработанных вершин. Для BFS такая структура - очередь (First In, First Out - FIFO). Для DFS - стек (Last In, First Out - LIFO). Описание алгоритма DFS можно найти, например, в книгах [6,7] или в публикациях на Хабре (например, [8]). Здесь мы остановимся лишь на модификациях алгоритма DFS, необходимых для использования DFS в описываемом алгоритме сравнения отпечатков. Модификации заключаются в следующем:
Тогда алгоритм сравнения будет выглядеть так: Входные данные:
Выходные данные: - число пар вершин в графах и , которые представляют одну и ту же минюцию на двух отпечатках. Непосредственно алгоритм сравнения:
Точность описанного выше алгоритма зависит от того, каким образом реализован шаг 4.1 - сравнение локальных структур минюций (двух "K-plet"). Сравнение локальных структур минюций Итак, "K-plet" - это упорядоченный список смежных вершин. Результат сравнения двух "K-plet"- список пар смежных вершин, которые образовали пары (представляют одну и ту же минюцию). А значит, задачу сравнения двух "K-plet" можно представить как задачу о нахождении наибольшей общей подпоследовательности (Longest Common Subsequenbce - LCS)[7,9]. Задача LCS состоит в том, чтобы найти общую подпоследовательность наибольшей длины для двух последовательностей и . Эта задача решается путём применения динамического программирования. В этом случае алгоритм решения задачи LCS будет состоять из двух последовательных этапов:
Следуя [7], приведём псевдокод для "LCS-Length" и "Print-LCS". LCS-Length(X, Y) Здесь - двумерный массив для хранения стоимости формируемой наибольшей общей подпоследовательности, - двумерный массив, сохраняющий "происхождение" ; эта информация необходима для последующего построения наибольшей общей подпоследовательности: Print-LCS(b, X, Y) Здесь - список пар смежных вершин, которые образовали пары. Если бы сравниваемые последовательности и представляли собой обычные строки, то функция "IsEqual(x,y)", которая вызывается на строке 7 функции "LCS-Length", превратилась бы в простую проверку на равенство . А функция "MatchingWeight(x,y)", вызываемая на строке 8, возвращала бы всегда 1. В этом случае код функции "LCS-Length" полностью совпадёт с кодом, приведённым в книге [7]. В нашем случае мы сравниваем два "K-plet", где каждый "символ" - это тройка чисел (Евклидово расстояние от центральной минюции; угол, который образует прямая, проходящая через текущую минюцию и центральную минюцию; и направление текущей минюции относительно направления центральной минюции). Тогда функция "IsEqual(x,y)" превратиться в проверку следующих условий:
Здесь и - две сравниваемые минюции. Пороговые значения , и подбираются на основе обучающей выборки и фактически задают пространство допусков (tolerance box), который упоминался в разделе, посвящённом простановке задачи сравнения отпечатков. Функция "MatchingWeight(x,y)" должна отражать степень совпадения сравниваемых минюций и . Логичным решением будет вычислить вес , который должна возвращать функция "MatchingWeight(x,y)" так:
где коэффициенты и также подбираются эмпирически на основе обучающей выборки. Прежде чем двигаться дальше, нам необходимо ввести ещё одно изменение в алгоритм работы функции "LCS-Length". Необходимо, чтобы в наибольшую общую подпоследовательность не попадали пары минюций, которые не могут образовать пары. Выделим два таких условия:
В случае приведённых выше условий в заносим штрафное значение FALSE_WEIGHT, равное максимально возможному значению , взятому со знаком минус. В случае приведённой выше формуле для расчёта , FALSE_WEIGHT . Тогда модифицированная функция "LCS-Length" (назовём её "LCS-Length-Mod") будет иметь следующий вид: LCS-Length-Mod(X, Y) Вернёмся обратно к описанию алгоритма сравнения в предыдущем разделе. На шаге 4.1 мы последовательно вызываем функции "LCS-Length-Mod" и "Print-LCS", чтобы получить список пар смежных вершин как результат сравнения двух "K-plet". А на шаге 4.2 нам необходимо пройти по полученному списку пар смежных вершин с тем, чтобы положить найденные пары в стек для последующей обработки, а также посчитать число таких пар для последующего определения коэффициента подобия для сравниваемых отпечатков. Чтобы исключить необходимость повторного прохода по списку пар смежных вершин на шаге 4.2 мы можем выполнить действия шага 4.2 в процессе построения списка пар смежных вершин в функции "Print-LCS". Модифицированная функция "Print-LCS" (назовём её "Print-LCS-Mod"): Print-LCS-Mod(b, X, Y) В соответствии с выкладками, приведёнными в статье [5], cложность получившегося алгоритма равна , где - число минюций. Работа построенного алгоритма сравнения для нашего примера: За кадром остался вопрос выбора начальной пары минюций, которая необходима для начала работы описанного выше алгоритма сравнения. Но поскольку нам изначально ничего не известно о том, какие вершины сравниваемых графов представляют одну и ту же минюцию (или, если рассматривать задачу шире, принадлежат ли сравниваемые отпечатки одному и тому же пальцу), то мы можем выбрать следующие стратегии:
Что касается достигаемой точности распознавания для описанного алгоритма, любопытные читатели могут найти эту информацию непосредственно в статье [5]. Практическая реализация алгоритма сравнения отпечатков пальцев Так как в предыдущей заметке наличие псевдокода явилось причиной обвинения автора в том, что он реально ничего не реализовывал, то ниже приведены фрагменты кода, реализующего описанный алгоритм сравнения. Сразу хочу сказать, что код написан на языке C древней редакции и может быть написан оптимальнее со всех точек зрения. Сначала введём следующие структуры данных: Тогда мы можем выделить память под промежуточное представление отпечатка, на котором выделено minutiae_amount минюций: Следующие массивы будут необходимы для работы алгоритма сравнения: Здесь мы предполагаем, что максимальное число минюций, выделенных на отпечатке, не может превышать 50. Функция, реализующая алгоритм сравнения: Литература 1. D. Maio, D. Maltoni, A. K. Jain, and J. Feng. Handbook of Fingerprint Recognition. Springer Verlag, 2020. 2. Fingerprint Verification Competition. http://bias.csr.unibo.it/fvc2000/download.asp; http://bias.csr.unibo.it/fvc2002/download.asp 3. K. Ko, W. J. Salamon. NIST Biometric Image Software (NBIS). https://www.nist.gov/services-resources/software/nist-biometric-image-software-nbis - 2015. 4. https://nigos.nist.gov/nist/nbis/nbis_v5_0_0.zip 5. S. Chikkerur, A.N. Cartwright, and V. Govindaraju. K-plet and Coupled BFS: A Graph Based Fingerprint Representation and Matching Algorithm. In: Advances in Biometrics. ICB 2006. Lecture Notes in Computer Science, vol 3832. Springer, Berlin, Heidelberg. https://doi.org/10.1007/11608288_42 - 2015. 6. Скиена, С.С. Алгоритмы. Руководство по разработке. - 3-е изд.: Пер. с англ. - СПб.: БХВ-Петербург, 2022. 7. Кормен, Т., Лейзерсон, Ч., Ривест, Р. Алгоритмы: построение и анализ. М.: МЦНМО, 2000. 8. Реализуем алгоритм поиска в глубину. Перевод Ксении Мосеенковой (kmoseenk). Блог компании OTUS. https://habr.com/ru/companies/otus/articles/660725/ - 2022. 9. Нахождение максимальной общей подпоследовательности. Автор: hamst. https://habr.com/ru/articles/142825/ - 2012. Источник: habr.com Комментарии: |
|