Процедура регистрации SIM-карт не менялась уже более двух десятков лет. В сравнении с остальными технологиями — вечность. Пока одни всерьез обсуждают возможности телепортации, другие тащатся в офис оператора или его партнера, стоят в очереди и теряют чуть ли не полчаса на том, что медленный сотрудник забивает в учетную систему паспортные данные. А потом еще примерно час ждут, пока купленная SIM-карта активируется в биллинге, чтобы с нее можно было позвонить.
Проект GoldenSIM и ABBYY далек от телепортации, но сокращает эти полтора часа до полутора минут.
Проект GoldenSIM и ABBYY далек от телепортации, но сокращает эти полтора часа до полутора минут.
Пообещать проще, чем реализовать
За процессом регистрации SIM-ки стоит много бизнес-процедур и бюрократии. Возможно, поэтому до сих пор по пути автоматизации не пошли сами мобильные операторы — им необходим более гибкий партнер, способный быстро сформировать команду разработки и подстроиться под требования всех заинтересованных сторон. И в таком формате мы в GoldenSIM дошли до стадии работающего продукта.
Мы решили сделать две версии автоматического инструмента: терминал и мобильное приложение. Людям не хочется никуда специально заходить, чтобы подключить связь, а с нашими решениями они смогли бы просто и быстро активировать SIM-карту в любом месте. Терминал по нашей задумке должен устанавливаться в аэропортах, на железнодорожных вокзалах и других объектах, где есть большой поток приезжих, в том числе иностранцев. Задача терминала — сформировать абонентский договор, выдать SIM-карту и тут же зарегистрировать ее на абонента, для чего нужно сначала распознать его паспорт и извлечь из отсканированного документа данные. Мобильное приложение, конечно, SIM-карту не выдаст в любом случае, но оно должно помочь зарегистрировать нового абонента, который получил «чистую» SIM любым удобным способом. Например, в Москве и Московской области сейчас это можно сделать в ближайшей «Пятерочке» или магазинах «Лента».
В обеих версиях продукта ключевой момент — авторизация абонента. В 2018 году вступили в силу поправки в «Закон о связи», согласно которым мобильный оператор не имеет права предоставлять связь анонимным абонентам, то есть не предоставившим паспортные данные. Соответственно, при регистрации SIM-карты как терминал, так и мобильное приложение должны получить паспортные данные и убедиться, что они действительно принадлежат человеку, который обратился за услугой. Начнем с того, как мы решили эту задачу.
Читаем паспорт
На рынке есть разные решения для чтения документов и проверки их подлинности. Мы пощупали их и оценили с точки зрения интегрируемости, производительности и стабильности. В итоге в качестве партнера выбрали ABBYY с двумя технологиями: серверный SDK для извлечения данных из паспортов в терминале ID.Terminal и мобильный SDK для распознавания документов в режиме реального времени на смартфоне, уже в мобильном приложении ID.Abonent.
Выбор мы сделали не случайно.
Во-первых, ABBYY — родоначальник технологий распознавания данных, у которого есть собственная исследовательская база, а продукты постоянно развиваются. Во-вторых, это стабильная международная команда, а мы со своим терминалом прицеливались на федеральный и, возможно, даже международный уровень — так что масштаб наш. В-третьих, у ABBYY есть специалисты, которые были готовы помочь нам провести интеграцию с нашей технологической инфраструктурой.
Но главное, что технологии ABBYY работают с более чем сотней различных видов документов, т.е. SDK заточен на чтение паспортов не только Российской Федерации, но и внутренних документов стран СНГ, а также международных паспортов множества других государств, которые соответствуют спецификации документов с машиносчитываемой зоной (ICAO). На данный момент можно распознавать ID 145 различных стран.
Процесс чтения паспорта на самом деле имеет массу нюансов.
Только в России у нас есть несколько типов бланков и еще больше разновидностей внутреннего паспорта, и только один из них — с MRZ-строкой, упрощающей считывание. Паспорта (российские и заграничные) содержат множество защитных элементов: фоновая сетка, водяные знаки, голограммы, типографские рисунки и так далее. У каждого бланка — свои степени защиты, в частности, изображения, проявляющиеся в УФ/ИК-диапазонах и в видимом спектре, микротекст и вязь вокруг фотографии. На все это есть определенные стандарты. И все это нужно учитывать не только для нашей страны, но и для государств, из которых к нам приезжают гости. Например, во время тестирования в терминале был распознан паспорт жителя одного из островов в Тихом океане (чтобы увидеть это государство на Google Maps, надо очень долго скроллить!). Кроме того, надписи в документе бывают недостаточно контрастными, а ламинированное изображение и голограмма могут бликовать. Словом, автоматизировать обработку паспортов непросто.
![](https://habrastorage.org/getpro/tmtm/articles/tld/images/8549312/tild6662-6330-4439-a335-333931346537__1.png)
Обеспечить качество распознаваемого изображения — это отдельная большая задача. И если в терминале мы могли контролировать качество камеры и метод съемки, то в мобильном приложении ID.Abonent пришлось пойти на хитрости.
Хотя камеры большинства современных телефонов делают неплохие фото с толстыми котами, сделать качественный снимок документа им не всегда просто. У пользователя может дрогнуть рука, на изображении появятся блики, оно окажется расфокусировано и смазано, а при плохом освещении проявятся шумы. Чтобы улучшить качество распознавания, инструменты ABBYY позволяют обрабатывать последовательность кадров, полученных от камеры устройства в режиме реального времени — при наведении смартфона на паспорт. Из них выбираются лучшие снимки, подходящие для извлечения данных. Распознавая разные кадры отдельно, а затем объединяя полученные результаты для каждого поля, можно повысить точность извлекаемых данных.
В процессе непосредственного чтения данных нам помог ABBYY PassportReader SDK, c помощью которого было реализовано распознавание документов и экспорт данных. Фактически это набор готовых шаблонов распознавания документов, удостоверяющих личность. Каждый такой шаблон указывает расположение текстовых блоков и блоков изображений на отсканированном документе. Например, шаблон для распознавания паспорта гражданина Казахстана содержит описание расположения блоков со следующими данными:
Лицевая сторона
![](https://habrastorage.org/getpro/tmtm/articles/tld/images/8549312/tild3034-6463-4963-b762-653333366462__t1.png)
![](https://habrastorage.org/getpro/tmtm/articles/tld/images/8549312/tild6334-3936-4233-b066-303231333133__tmp_1575638530998.jpg)
Обратная сторона
![](https://habrastorage.org/getpro/tmtm/articles/tld/images/8549312/tild3461-3363-4466-a236-306333303735__t2.png)
![](https://habrastorage.org/getpro/tmtm/articles/tld/images/8549312/tild3930-6538-4437-b862-343366656533__tmp_1575638528311.jpg)
ABBYY PassportReader SDK предоставляет два варианта доступа к распознанным данным:
- в виде XML-строки — для сохранения результатов в базу данных или передачи по сети.
string xmlBody = result.GetXml( ... );
string xml = string.Format( "<?xml version='1.0' encoding='UTF-8'?>(0)", xmlBody);
System.IO.File.WriteAllText( fileName, xml, Encoding.UTF8 );
- в виде набора пар «идентификатор поля — распознанное значение». Этот метод удобен для отображения результатов на экране и сохранения отдельных полей в базу данных. Именно этот вариант обработки данных мы используем в терминале.
string lastName = result.FieldValue ( "LastName", "" );
string firstName = result.FieldValue ( "FirstName", "" );
string middleName = result.FieldValue ( "MiddleName", "" );
string dateOfBirth= result.FieldValue ( "DateOfBirth", "" );
string placeOfBirth= result.FieldValue ( "PlaceOfBirth", "" );
При этом свойство Value позволяет посмотреть результат распознавания отдельного поля.
Итак, данные распознаны — время убедиться в их подлинности. Паспортные данные российских граждан сверяются по федеральным базам действующих документов. Также мы используем еще некоторые алгоритмы, позволяющие убедиться, что нас не обманули. Например, проверяем принадлежность всех страниц одному документу. Это повышает эффективность проверки паспортов.
Следующий этап — сравнить фото в паспорте с лицом человека.
Проверяем соответствие документа человеку
Вторая задача в рамках проверки подлинности документа — сверка лица человека с фотографией из паспорта при одновременной оценке вероятности, что камера видит лицо живого человека, а не распечатку, фото или видеозапись на смартфоне.
Эта задача решалась в ID.Terminal и мобильном приложении ID.Abonent по-разному.
В терминал мы имели возможность поставить любое оборудование, поэтому использовали камеру, которая на самом деле состоит из трех модулей: обычной камеры, ИК-проектора и ИК-камеры. С обычной камеры мы получаем стандартную картинку. ИК-проектор отображает на лице человека сетку в ИК-диапазоне, а ИК-камера ловит ее отражение, чтобы получить глубину. С помощью этих модулей сначала отсеиваются очевидные подделки — распечатки фотографий на глянцевой или матовой бумаге, смартфоны и планшеты (техника вообще проявляет себя особым образом в ИК-диапазоне). После этого проверяется объемная модель лица.
В терминал мы имели возможность поставить любое оборудование, поэтому использовали камеру, которая на самом деле состоит из трех модулей: обычной камеры, ИК-проектора и ИК-камеры. С обычной камеры мы получаем стандартную картинку. ИК-проектор отображает на лице человека сетку в ИК-диапазоне, а ИК-камера ловит ее отражение, чтобы получить глубину. С помощью этих модулей сначала отсеиваются очевидные подделки — распечатки фотографий на глянцевой или матовой бумаге, смартфоны и планшеты (техника вообще проявляет себя особым образом в ИК-диапазоне). После этого проверяется объемная модель лица.
![](https://habrastorage.org/getpro/tmtm/articles/tld/images/8549312/tild3031-6266-4538-a561-373730666535__ii.png)
Так терминал Goldensim «видит» лицо пользователя
Не во всех телефонах установлены ИК-камеры, поэтому для проверки используются иные технологии и математические модели. В видимом спектре тоже можно собрать довольно много данных. Это технологии Intel, сходные с разблокировкой смартфона по лицу в режиме селфи. Но только у нас используются собственные алгоритмы, основанные на мимике, моргании, расчете перекрытия областей глаз.
В зависимости от требований сотового оператора мы либо просим человека в режиме селфи выполнить определенные хаотичные действия, под которые невозможно подстроиться — например, повернуться, наклониться, моргнуть, улыбнуться, либо переходим в фоновый режим и снимаем мимику (если оператор не готов нагружать абонента дополнительными действиями). Сам алгоритм нелинейный, он состоит из нескольких этапов обработки. Каждый из этапов дает свою оценку, участвующую в итоговой. Так, приложение принимает решение, можно ли перейти на следующий шаг оформления SIM-карты.
После того как мы убедились, что перед нами живой человек, выполняется сравнение фотографии в паспорте и лица перед терминалом. Для этого мы использовали продукт компании VisionLabs — они предоставили нам свою SDK-библиотеку для отслеживания различных параметров человеческого лица.
Казалось бы, человек редко похож на свое фото в паспорте (сколько анекдотов ходит на эту тему!). Но человеческий глаз не так эффективен, как машина. В процессе взросления человека определенные признаки остаются неизменными, так что соответствие можно проверить, даже если с фото на паспорте разница в 15 лет.
Сам процесс распознавания лица разделен на три этапа:
- Получение фотоизображения лица интересующего человека;
- Извлечение из фотографии набора уникальных признаков лица — биометрического дескриптора;
- Сравнение дескрипторов, полученных с фото в паспорте, и живого лица.
![](https://habrastorage.org/getpro/tmtm/articles/tld/images/8549312/tild6264-6336-4664-b731-626166636335__s_all.png)
В рамках наших экспериментов алгоритм давал оценку соответствия до 99%. Но в данном случае 30% соответствия — уже хороший показатель, потому что когда фото и лицо принадлежат разным людям, оценка не поднимается выше 16%. Необходимый процент соответствия определяют сами операторы.
На этом этапе в работе системы участвует back-офис. Хотя терминал и мобильное приложение выполняют довольно большую часть работы, снижая нагрузку на back-офис, итоговое решение о регистрации SIM-карты принимает именно он. Так мы можем однозначно отсечь фрод.
Честно скажу, на презентациях терминала и мобильного приложения качество решения именно задачи сверки лица с документом проверяли чаще всего. Народ-то у нас талантливый: как только слышит, что есть система, проверяющая соответствие паспорту, сразу же ищет способы ее хакнуть. Но наша ставка на технологии сработала. И терминал, и мобильное приложение проходят не только через такие кустарные эксперименты, но и через проверки служб безопасности операторов.
Самым сложным вопросом остается корректное распознавание близнецов. Человек точно не сможет определить, стоит перед ним владелец паспорта или его близнец. Решения по распознаванию лиц лучше справляются с этой задачей, но пока еще есть к чему стремиться. Разработчики совершенствуют свои системы для решения этой задачи, и та компания, которая предложит лучший инструмент, получит конкурентное преимущество на рынке. На мой взгляд, это будет настоящим прорывом для индустрии.
Подписываем договор
Еще один момент, предписанный законодательством, — собственноручная или электронная подпись абонента на договоре об оказании услуг связи. Мы хотели упростить процедуру получения подписи, и нам удалось кое-что сделать.
Мы получаем подпись клиента на чувствительном сенсорном экране, что позволяет преобразовывать ее в электронную. И в нашем случае новоиспеченный абонент просто расписывается на экране. Тут вопрос больше юридический, нежели технический. Соответствующие письма Роскомнадзора и других государственных органов не запрещают такой подход.
Стек разработки и железо
Проект разрабатывала команда из 17 человек. На исследования и проектирование у нас ушло порядка трех месяцев. Спустя полгода после проектирования у нас была готовая альфа. А еще 6 месяцев ушло на тестирование продукта и презентации. Все сроки мы закладывали с учетом того, что наши специалисты уже имели опыт выпуска софта на рынок. Если бы мы набрали под этот проект новичков, в такие рамки было бы не уложиться.
Требования мы ставили себе сами. По нашей задумке аппарат должен быть компактным, т.е. борьба шла за каждый миллиметр пространства. С другой стороны, как и у банкомата, у него должны быть определенные зоны доступа, замки и антивандальное исполнение. А еще необходимо было соблюсти требования по пожарной безопасности.
Конечно же, в процессе мы столкнулись с массой подводных камней. В терминале много различного оборудования: сканер паспорта, диспенсер SIM-карт, камера, модем и т. п. Каждую из компонент необходимо было выбрать среди 2-3 возможных претендентов, протестировать, написать к ней драйвера и заставить работать должным образом.
Больше всего сложностей у нас было с модемами. Первые просто зависали. А ведь терминал не может работать в офлайне. Каждое зависание — это остановка работы, выезд техника, перезагрузка модема и ОС терминала. Так что мы выбрали промышленный модем с поддержкой двух SIM-карт и аппаратным VPN. Это сделало систему более стабильной — выезды из-за разрыва связи сократились до минимума.
Отдельная история с диспенсером SIM-карт. Считывать штрихкод с SIM-карты, чтобы занести ее данные в договор, слишком сложно и неэффективно. Штрихкоды могут читаться с ошибками или не считываться вовсе. В этом случае SIM-карта непригодна к продаже и должна быть сброшена в специальный лоток, а это влечет за собой различные бухгалтерские ошибки (проверка / сверка по бухгалтерии). Поэтому мы считываем чип SIM-карты напрямую — подаем на нее питание, заходим в каталог чипа и извлекаем необходимые данные. В итоге при подписании договора у человека уже есть конкретный номер телефона — с помощью данных с SIM-карты мы запрашиваем его на сервере, он присваивается и вставляется в абонентский договор.
По софтовой части пришлось осуществить интеграцию специализированного оборудования с GUI и заставить все это работать в едином комплексе стабильно без сбоев. Мы использовали довольно обширный стек технологий — Delphi 10 Seattle, С#, ASP.NET WebForms, JAVA, PHP и их фреймворки — и не видим в этом никаких проблем. Требования у сотовых операторов разные, как и протоколы обмена данными. А наша задача — подстраиваться.
Все, что касается работы с железом, мы писали на Delphi с различными библиотеками. И зря вы думаете, что Delphi уже умер. Если человек профессионально на нем программирует и знает вдоль и поперек, Delphi позволяет работать с железом на очень высоком уровне. Для разработки мобильного приложения использовалась Java.
С серверной стороны задействованы C#, ASP.Net, различные Web-фреймворки. При этом клиент-серверное взаимодействие проектировалось не только с прицелом на проверку документов back-офисом, но и на упрощение обслуживания терминалов. Любое изменение тарифов мобильных операторов, корректировки в юридических адресах, правовых формах и лицензиях — это повод для обновления ПО терминала. И большая часть таких функций (в том числе перевод интерфейса на иностранные языки) у нас автоматические. Достаточно подготовить данные и запустить централизованное обновление.
Тестируем
Наш ID.Terminal уже прошел «боевую» обкатку во время прошлогоднего Чемпионата мира по футболу. Тестирование началось 14 июня 2018 года. А «подопытными» стали иностранные туристы, которые могли оформить SIM-карту на понятном им языке без обращения в офис оператора. Пользователей из-за рубежа было чуть больше, чем граждан России. Если быть точными, то из России их было 43%, а иностранцев — 57%.
Кстати, язык — это еще один плюс терминала на фоне стандартного офиса продаж. Чтобы иностранцу оформить SIM-карту в офисе, ему в любом случае придется как-то коммуницировать с сотрудниками. И если есть языковой барьер, это всегда сложно. В терминале этого барьера нет. У нас поддерживается несколько языков, в том числе английский, так что иностранец может все оформить в комфортных для себя условиях.
Надо сказать, что терминал оказался популярен. Со стороны back-офиса тестирование поддерживали несколько модераторов. Большого штата тут не потребовалось, поскольку регистрация SIM-карты — это не пополнение личного счета, тут нет миллионов транзакций.
Кстати, язык — это еще один плюс терминала на фоне стандартного офиса продаж. Чтобы иностранцу оформить SIM-карту в офисе, ему в любом случае придется как-то коммуницировать с сотрудниками. И если есть языковой барьер, это всегда сложно. В терминале этого барьера нет. У нас поддерживается несколько языков, в том числе английский, так что иностранец может все оформить в комфортных для себя условиях.
Надо сказать, что терминал оказался популярен. Со стороны back-офиса тестирование поддерживали несколько модераторов. Большого штата тут не потребовалось, поскольку регистрация SIM-карты — это не пополнение личного счета, тут нет миллионов транзакций.
Терминалы уже внедрены и работают в аэропортах Москвы — Домодедово, Шереметьево, Внуково — а также в инфраструктуре РЖД. Мобильное приложение ID.Abonent можно скачать с официальных маркетов, а SIM-карты, которые активируются с его помощью, можно найти даже в Аэроэкспрессе. По данным на ноябрь 2019 года, приложение скачали несколько десятков тысяч человек в Appstore и Google Play. К проекту уже подключились Tele2, Yota, Ростелеком, Cбермобайл и Лайкамобайл, Тинькофф мобайл и еще 17 операторов.
Параллельно проект продолжает развиваться. Постоянно идут обновления по софтовой части — в программном коде всегда есть что улучшать. Также мы готовим вторую версию терминала с улучшенной функциональностью. Навскидку кажется, что логичным будет добавить возможность пополнения счета. Расширение доступных услуг планируется и в терминалах первой версии, но подробности пока оставим за кадром.
Мы убеждены, что с передачей функции регистрации SIM-карты от человека к машине «серых» подключений к сотовым операторам станет меньше. У нашей компании есть не только этот бизнес, но и сеть салонов связи. Так что мы можем сравнивать и знаем, о чем говорим. Терминал, в отличие от офисов, обеспечивает операторов совершенно «белыми» контрактами. Этот аппарат может использоваться и в других областях в рамках любых услуг, которые требуют идентификации личности по паспорту, например, в каршеринге, для открытия счета в банке, покупки авиабилетов и так далее.