Мы разработали модуль для мобильного приложения, который верифицирует личность: сканирует лицо пользователя и сравнивает его с фотографией на предоставленном документе, будь то паспорт, водительские права или пропуск, а также делает liveness проверку, т.е. проверяет реальность человека перед камерой, предлагая ему выполнить несколько простых жестов: повороты головы и подмигивания. Бонусом модуль сканирует сфотографированный документ и выгружает из него важные данные - имя и фамилия, дата рождения, пол, номер и серия документа.
Нашей главной задачей было не просто создать сервис по проверке документов, а суметь реализовать удобное и быстрое приложение, которое бы упрощало процесс регистрации, а не наоборот. Каждый шаг - от фотографирования документа до подтверждения личности - должен быть интуитивно понятным, проходить быстро и без запинок.
Наша задача состояла из двух частей: реализация распознавания паспортов и распознавания лиц.
Основным инструментом для распознавания документов стал Google Vision API, распознающий текст на любом языке и создающий bounding box вокруг каждого слова. Данный сервис условно бесплатен и позволяет сканировать до 1000 изображений в месяц без оплаты. Гугл мы тренировали на румынских паспортах: именно их почему-то больше всего в интернете.
Для начала, на предоставленном пользователем фото паспорта мы с помощью OpenCV определяем контур паспорта, его “рабочую область”. Данное выделение не всегда может проходить гладко, например, если фото сделано на пестром фоне или рядом есть другие объекты. В таком случае мы находим самый большой контур и считаем, что это и есть паспорт.
Полученное изображение передается Google Vision, который определяет и выделяет отдельно каждое слово. После этого выполняется поиск ключевых слов, которыми в данном случае являются названия полей: “Имя”, “Фамилия”, “Место рождения” и прочее.
В мире ~193 страны, и каждая из них выпускает паспорта с теми данными, которыми захочет. Ключевые слова для каждого вида ID могут быть разными и находиться в разных местах. Для решения нашей задачи было целесообразно (и достаточно) вручную собрать ключевые слова с паспортов тех стран, которые были нам интересны. Однако если бы мы разрабатывали приложение-космополит, то здесь нужно было бы искать другой подход.
Для каждого типа паспорта (в нашем случае тип - это страна) существует конфигурационный файл, в котором заданы:
Думаете, что страны отличаются друг от друга культурой, историей, своим народом? Нет, они отличаются размером пробелов и межстрочных интервалов в паспортах своих граждан. Например, в румынских паспортах пробелы короткие, а в шведских - большие. Размер пробелов важен нам для поиска значения ключевых слов: после того, как находится ключевое слово, система ищет его значение, которое может быть как справа от ключевого слова, так и снизу.
Зная размер пробелов и межстрочных интервалов паспортов определенного типа, мы знаем, насколько нужно отступить вправо или вниз для поиска значения ключевого слова. Размер пробелов и интервалов определяется не абсолютно, а относительно (в зависимости от размера изображения).
Полученные данные выгружаем в формате json “слово - значение”.
Вторая часть этого проекта заключалась в разработке модуля по распознаванию и сравнению лиц. Мы решили не изобретать велосипед и использовали обученную модель FaceNet, которая может сравнить две фотографии человеческого лица и сравнить одно ли это лицо или два разных, чтобы верифицировать личность.
С помощью python приложение сначала определяет где находится фотография человека на паспорте. После этого FaceNet должна была сравнить фото паспорта с лицом перед фронтальной камерой смартфона и убедиться, что это один и тот же человек.
Однако изначально модель работала неверно и определяла схожесть лиц абсолютно случайно. Решение данной проблемы было достаточно простое - мы максимально близко обрезали лицо с паспорта, и модель заработала как надо.
Алгоритм сравнения лиц работает локально, все расчеты идут на устройстве, а вот алгоритм по определению данных с паспорта отправляется на бэк, где и происходит распознавание.
Еще одной важной задачей было суметь определить находится ли перед камерой живой человек, или только его фото или видео с ним. Как правило, для решения этой цели пользователя просят выполнить ряд простых движений лицом в определенной последовательности.
Благодаря Google ML Kit данный функционал реализуется довольно быстро и просто; в нашем приложении мы просим пользователя повернуть голову налево и направо, подмигнуть левым и правым глазом, а в конце улыбнуться.
Таким образом, наше приложение знает, что перед ним реальный человек с реальными, а главное своими, документами. А вы можете посмотреть наше демо видео, чтобы убедиться, что само приложение тоже реально:
Приложение получилось довольно лаконичным, но быстрым и эффективным: распознавание документа в среднем занимает менее двух секунд, а распознавание лица происходит в режиме реального времени незаметно для пользователя.
Современные сервисы и технологии позволяют довольно быстро и без особых затрат реализовать систему, которая до нуля снизит различные злоупотребления при регистрации.