Авторы Петр Смуда и Петр Темпчик

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

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

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

С нуля до героя

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

Исследования и первые попытки

Вначале мы исследовали алгоритмы распознавания лиц и возможности сканирования на Python.

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

Затем мы начали кодировать решение на основе наших документов и студенческого билета, взятого у коллеги. Как правило, люди не любят показывать свои документы из-за конфиденциальных данных. Мы подумали и в первом подходе решили скрыть все конфиденциальные данные черными полосами в зависимости от типа документа, выбранного пользователем.

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

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

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

Улучшение обработки документов

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

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

  • старые / новые водительские права - квадрат из синих пикселей на европейском флаге,
  • старый / новый ID - квадрат красных пикселей на эмблеме орла рядом с клювом орла,
  • студенческий билет - квадрат из зеленых пикселей в верхнем левом углу.

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

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

Мы также решили обновить версию OCR с 3.04 до 4.0 и переключить языковую версию с английской на польскую. После этого изменения мы заметили, что OCR делает меньше ошибок, когда некоторые черные пиксели или точки (дело с водительскими правами) появляются в области вырезания.

Адаптация решения к окончательной настройке оборудования

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

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

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

Аппаратные приключения

Стоит отметить, что выбранная операционная система и меняющиеся идеи имеют огромное влияние на то, как будет развиваться проект. Когда мы начали работать над проблемой в Ubuntu 18.04 LTS, мы не ожидали такого количества проблем с настройкой оборудования.

Во-первых, камера. Мы использовали камеру Intel RealSense Depth Camera D435 с разрешением 1280x720 пикселей и активным ИК-стерео. Наш выбор был продиктован возможностью использования глубинных технологий для борьбы с мошенничеством, что очень желательно в таких решениях. Основная «проблема» этой камеры заключалась в ее подключении к компьютеру. Если вы хотите записывать кадры RGB и глубины в 720p, его необходимо подключить с помощью кабеля USB-C 3.1. У нас его не было, поэтому нам нужно было обзавестись такой.

Во-вторых, сканер. В ходе проекта мы работали с двумя сканерами: HP Deskjet 3070A и Fujitsu fi-65F. В обоих случаях их драйверы вызывают большинство проблем. В случае с HP драйверы Ubuntu 18 установлены по умолчанию, но после каждого цветного сканирования с разрешением 600 точек на дюйм возникала ошибка с сохранением изображения. Помогло Обновление версии драйверов. Установка Fujitsu создала гораздо больше проблем, и заставить ее работать под Ubuntu было непросто. Когда вы посетите веб-страницу SANE, вы увидите, что Fujitsu fi-65F поддерживается со статусом Хорошо. Однако, чтобы он заработал, вам нужно извлечь файл 65f_0A01.nal из драйвера Fujitsu для Windows (например, на DVD) и поместить его в специальную папку на диске. Несмотря на то, что вы заставили его работать, вы обнаружите, что качество сканирования низкое и требует дополнительной обработки.

В-третьих, принтер. Поскольку мы хотели напечатать какие-то билеты после успешной авторизации, нам нужно было получить принтер. Мы решили выбрать DYMO LabelWriter 450, профессиональный принтер этикеток. После того, как мы приобрели его и подключили к компьютеру, открылась печальная правда. Даже если он был правильно распознан Ubuntu, он не печатал! И снова потребовалось исследование в Интернете, чтобы решить эту проблему, вызванную отсутствием драйвера CUPS.

Обработка документов

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

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

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

Установка

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

OpenCV (Open Source Computer Vision) - это библиотека, предназначенная для компьютерного зрения в реальном времени, написанная на C / C ++ и с интерфейсами C ++, Python и Java. Мы часто использовали его при создании изображений документов и лиц для функций обработки и вывода на экран.

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

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

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

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

MTCNN - модель нейронной сети для распознавания и выравнивания лиц. Мы использовали реализацию Дэвида Сэндберга (FaceNet’s MTCNN).

Tesseract OCR - многоязычный движок оптического распознавания символов с открытым исходным кодом, разработанный Google. Наш выбор OCR был продиктован довольно хорошими результатами по нашим сканированным и обработанным документам. Мы использовали польскую версию Tesseract 4.0 вместо английской версии, потому что она выглядела более устойчивой к нежелательным ситуациям с черными пятнами на изображениях.

По борьбе с мошенничеством

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

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

Мы также протестировали антифрод решение, основанное на живости лица. Мы учли библиотеку dlib и ее поддержку для определения лицевых ориентиров. Предварительно обученная модель использовалась для проверки того, как часто человек моргает перед камерой в течение 5–10 секунд записи. Если это выглядело естественно, мы относились к нему как к настоящему человеку.

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

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

Окончательный прогноз на основе сравнения изображений

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

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

  1. Все изображения преобразуются в оттенки серого.
  2. И цветные, и серые изображения преобразуются в их пространственные представления с помощью модели FaceNet.
  3. Для каждого типа цвета подсчитывается количество пар изображений (документ-лицо), находящихся в области сходства.
  4. Вычисляется максимум из этих чисел.
  5. Если полученное число не ниже некоторого порога, это тот же человек.

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

Данные и результаты

Данные

Наш окончательный набор данных состоял из 21 уникального человека с уникальными 42 документами и 1508 фотографиями (только RGB, без изображений глубины). Это было не больше, потому что люди не очень-то хотят, чтобы их документы сканировали, и нет доступного набора данных, отвечающего нашим требованиям.

Важное примечание: в течение всего проекта мы собрали данные от 41 человека с 84 уникальными документами и более 10000 фотографий, но из-за изменения решений и оборудования мы не смогли использовать их все в окончательном наборе данных.

Результаты

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

Следовательно, мы сосредоточились на двух показателях, чтобы проверить наше решение: истинно положительный уровень (TPR, отзыв) и ложноположительный показатель (FPR). Первый из них говорит, сколько человек с их документом было принято системой. Когда второй означает, сколько людей с чьим-то другим документом были авторизованы.

В Таблице 2. мы представили результаты сравнения каждой фотографии документа с каждой записью лица. Следовательно, если кто-то предоставил два документа и был записан дважды, его / ее сравнивали бы четыре раза.

По полученным результатам мы можем вычислить TPR и FPR, которые соответственно равны примерно 0,927 и 0,122. Более того, все типы документов определялись правильно, а имена распознавались без ошибок.

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

Последние мысли

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

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



Вы можете найти код нашего решения на Daftcode’s GitHub.

использованная литература

  • Ф. Шрофф, Д. Калениченко, Дж. Филбин, FaceNet: унифицированное встраивание для распознавания лиц и кластеризации, https://arxiv.org/pdf/1503.03832.pdf
  • К. Чжан, З. Чжан, З. Ли, Ю. Цяо, Совместное обнаружение и выравнивание лиц с использованием многозадачных каскадных сверточных сетей, https://arxiv.org/pdf/1604.02878.pdf
  • Р. Смит, Обзор механизма распознавания текста Tesseract. Анализ и распознавание документов, 2007. ICDAR 2007. Девятая международная конференция по. Vol. 2. IEEE, 2007.

Если вам понравился этот пост, нажмите кнопку хлопка ниже 👏👏👏

Вы также можете подписаться на нас в Facebook, Twitter и LinkedIn.