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

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

На этом этапе также на помощь приходят современные технологии автоматизации. Сегодня отдельные этапы верификации личности, включая проверки подлинности документов, живости лица и сравнение фотографий, могут выполняться с помощью искусственного интеллекта. Например, наш флагманский продукт Smart ID Engine 2.0 предоставляет в режиме on-premise возможности, которые еще недавно казались фантастикой:

  • мгновенное считывание данных из удостоверяющих документов, в том числе рукописных;

  • проверка подлинности и “живости” документов в режиме реального времени;

  • небиометрическая сверка лиц (включая проверку живости лиц);

  • одновременное распознавание паспорта и сверка фотографии с селфи и т.п.

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

У нас родилась красивая идея, поражающая своей простотой и эффективностью, которой мы готовы с вами поделиться.

Процесс подтверждения личности с помощью распознавания банковской карты

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

  1. Распознавание документа, удостоверяющего личность (ДУЛ).

  2. Распознавание банковской карты, содержащей в обязательном порядке фамилию и имя держателя карты.

  3. Сравнение селфи с фотографией из удостоверяющего документа.

  4. Сравнение фамилии и имени на карте и удостоверяющем документе.

  5. Совершение пробного платежа по реквизитам банковской карты (с обязательным указанием распознанных фамилии и имени).

Как видите, все шаги просты, реализуемы с помощью Smart ID Engine 2.0 и надежно решают задачу установления и подтверждения личности. 

Распознавание ДУЛ (это может быть паспорт, ID карта, водительское удостоверение или любой другой документ, законодательно допустимый для объявленных целей) позволяет автоматизировать процесс установления личности.

Распознавание банковской карты, на которой в обязательном порядке присутствует имя и фамилия держателя карты, играет сразу “двойную роль”: во-первых, является в некотором смысле “вторым документом”, запрос которого в процессе онбординга уже уменьшает вероятность фрода, а во-вторых, позволяет совершить впоследствии пробный платеж.

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

Сопоставление фамилии и имени на карточке и в ДУЛ решают задачу принадлежности ДУЛ и банковской карты одному и тому же человеку.

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

Давайте теперь посмотрим насколько просто реализовать эти шаги автоматически с помощью Smart ID Engine 2.0.

Реализация с помощью Smart ID Engine 2.0

Smart ID Engine 2.0 — уникальное программное решение для распознавания и обработки документов и не только. Оно поддерживает распознавание ID карт и паспортов и других удостоверяющих документов 220 юрисдикций, поддерживает более 100 языков мира.Smart ID Engine 2.0 поддерживает работу с платежными банковскими картами всех типов: кредитными (Visa, MasterCard, American Express, Discover), дебетовыми, предоплаченными (prepaid), корпоративными и даже локальными платежными системами, такими как UnionPay, JCB и МИР. Отдельным преимуществом системы является поддержка небиометрической сверки лиц. Smart ID Engine 2.0 позволяет сравнивать фотографию из документа с селфи, не выделяя биометрических дескрипторов.

Несмотря на мощный функционал, Smart ID Engine 2.0 обеспечивает простую и быструю интеграцию благодаря многоязычным SDK для популярных языков программирования (Python, C++, Java, Swift, и др.), кроссплатформенной поддержке (Windows, Linux, macOS, iOS, Android) и интуитивно понятному API. Тут, чтобы не быть голословным приведем пример на C++.

/**
  Copyright (c) 2016-2024, Smart Engines Service LLC
  All rights reserved.
*/

#include <cstring>
#include <memory>
#include <cstdio>
#include <string>

#ifdef _MSC_VER
#pragma warning( disable : 4290 )
#include <windows.h>
#endif // _MSC_VER

#include <idengine/id_engine.h>

// Here we simply output the recognized fields
void OutputRecognitionResult(const se::id::IdResult& result, 
                             const se::id::IdSessionSettings& session_settings) {
  printf("Document type: %s\n", result.GetDocumentType());
  if (strlen(result.GetDocumentType()) != 0){
    const se::id::IdDocumentInfo& doc_info = 
        session_settings.GetDocumentInfo(result.GetDocumentType());
    printf("    Description: %s\n", doc_info.GetDocumentDescription());
    if (doc_info.GetPradoLinks().GetStringsCount() > 0) {
      printf("    PRADO links:\n");
      for (auto it = doc_info.GetPradoLinks().StringsBegin(); 
          it != doc_info.GetPradoLinks().StringsEnd();
          ++it) {
        printf("        %s\n", it.GetValue());
      }
    }
  }

  printf("Text fields:\n");
  for (auto it = result.TextFieldsBegin(); it != result.TextFieldsEnd(); ++it) {
    const se::id::IdTextField& field = it.GetValue();
    std::string is_accepted =
        field.GetBaseFieldInfo().GetIsAccepted() ? " [+] " : " [-] ";
    printf("    %-25s%s (%4.3lf) %s\n",
        field.GetName(),
        is_accepted.c_str(),
        field.GetBaseFieldInfo().GetConfidence(),
        field.GetValue().GetFirstString().GetCStr());
  }

  printf("Result terminal:             %s\n",
      result.GetIsTerminal() ? " [+] " : " [-] ");
}

int main(int argc, char **argv) {
#ifdef _MSC_VER
  SetConsoleOutputCP(65001);
#endif // _MSC_VER

  // 1st argument - path to the image to be recognized
  // 2nd argument - path to the configuration bundle
  // 3rd argument - document types mask, "*" by default
  if (argc != 3 && argc != 4) {
    printf("Version %s. Usage: %s <image_path> <bundle_se_path> "
           "[document_types]\n",
           se::id::IdEngine::GetVersion(), argv[0]);
    return -1;
  }

  const std::string image_path = argv[1];
  const std::string config_path = argv[2];
  const std::string document_types = (argc >= 4 ? argv[3] : "*");
  if (image_path != "list") {
    printf("Smart ID Engine version: %s\n", se::id::IdEngine::GetVersion());
    printf("image_path = %s\n", image_path.c_str());
    printf("config_path = %s\n", config_path.c_str());
    printf("document_types = %s\n", document_types.c_str());
    printf("\n");
  }
  OptionalFeedback optional_feedback;

  try {
    // Creating the recognition engine object - initializes all internal
    //     configuration structure. Second parameter to the ctor is the
    //     lazy initialization flag (true by default). If set to false,
    //     all internal objects will be initialized here, instead of
    //     waiting until some session needs them.
    std::unique_ptr<se::id::IdEngine> engine(
        se::id::IdEngine::Create(config_path.c_str(), true));

    // Before creating the session we need to have a session settings
    //     object. Such object can be created only by acquiring a
    //     default session settings object from the configured engine.
    std::unique_ptr<se::id::IdSessionSettings> settings(
          engine->CreateSessionSettings());

    // Print all supported documents
    printf("Supported modes:\n");
    for (auto modeIterator = settings->SupportedModesBegin(); 
          !modeIterator.Equals(settings->SupportedModesEnd());
          modeIterator.Advance()) {
      std::string modeName = modeIterator.GetValue();
      printf("Mode name is: %s\n", modeName.c_str());
      settings->SetCurrentMode(modeName.c_str());


      settings->SetCurrentMode("default");

      // For starting the session we need to set up the mask of document types
      //     which will be recognized.
      settings->AddEnabledDocumentTypes(document_types.c_str());

      // Creating a session object - a main handle for performing recognition.
      std::unique_ptr<se::id::IdSession> session(
          engine->SpawnSession(*settings, ${put_yor_personalized_signature_from_doc_README.html}));

      // Creating an image object which will be used as an input for the session
      std::unique_ptr<se::common::Image> image(
          se::common::Image::FromFile(image_path.c_str()));

      // Performing the recognition and obtaining the recognition result
      const se::id::IdResult& result = session->Process(*image);

      // Printing the contents of the recognition result
      // Passing session settings object only to output document info
      OutputRecognitionResult(result, *settings);
    }
  } catch (const se::common::BaseException& e) {
    printf("Exception thrown: %s\n", e.what());
    return -1;
  }

  return 0;
}

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

iOS и Android

Как мы выше сказали, хотя библиотека распознавания написана на С++ для достижения максимальной производительности, для использования с различными языками программирования у нас есть версии интерфейсов библиотеки на C++, C, C#, Objective-C, Java.

С точки зрения программного интерфейса, библиотека распознавания имеет все те же сущности. Последовательность работы тоже совпадает: конфигурируем движок распознавания, подаем входные изображения и обрабатываем результат распознавания. Однако есть свои особенности (правила создания приложений и работы с камерой) которые мы уже тоже разбирали: ищите детали для iOS тут, а для Android - тут.

WebAssembly (WASM)

Интеграция Smart ID Engine 2.0 в WebAssembly (WASM) открывает широкие возможности для разработки современных веб-приложений. Поддержка всех современных браузеров (Chrome, Firefox, Safari, Edge) и возможность работы на любых платформах делают продукт идеальным выбором для масштабируемых веб-приложений. Минимальные зависимости, интуитивно понятный API и готовность к оффлайн-работе позволяют разработчикам быстро внедрить решение в проекты, не затрачивая значительных ресурсов. 

А как интегрировать Smart ID Engine 2.0? Про это мы уже тоже писали на Хабре: тут концептуально, с описанием всех возможных тонких моментов, а тут приведен живой код реализации сканера кодифицированных объектов на базе движка Smart Engines.

REST API

Хотя мы, скорее, приверженцы нативной интеграции, мы понимаем, что интеграция системы распознавания документов как нативной библиотеки с прямым программным вызовом – не всегда самый оптимальный путь. Это привело нас к тому, чтобы сделать вариант взаимодействия пользователя с системой распознавания как с простой локальной REST службой.
API REST-службы системы распознавания документов, удостоверяющих личность, Smart ID Engine 2.0, устроен максимально просто. Он обладает тремя группами методов:

  1. Служебные и информационные методы

(GET) /doc - документация службы в виде HTML (Swagger)
(GET) /help - документация службы в виде JSON (OpenAPI)
(GET) /diagnostics - информация о статусе службы в виде JSON
(GET) /version - информация о версии Smart ID Engine
  1. Простое распознавания одного изображения

(POST) /api/recognize/simple - производит распознавания заданного изображения
  1. Методы, связанные с сессионным распознаванием

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

Подождите.. А про что была эта статья?

Статья получилась очень длинной, что ставит под угрозу главное - смысл! А он на удивление очень простой и формулируется буквально двумя утверждениями:

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

  2. Такой процесс легко и быстро автоматизируется с помощью Smart ID Engine 2.0.

На этом все. Спасибо за внимание.

Комментарии (26)


  1. a-tk
    26.12.2024 07:17

    А CVV тоже присылать вместе с фото карты?


    1. ilyamodder
      26.12.2024 07:17

      И каждый код из смс, иначе верификацию отзовут.


    1. SmartEngines Автор
      26.12.2024 07:17

      Вы, наверное, нас с кем-то путаете (с кем, кстати?). Мы не сервис, мы не HITL, мы не собираем миллионы данных для обучения нейросетевых моделей. Мы делаем ИИ-решения для безопасного распознавания: весь процесс происходит на стороне клиента, а результат есть только у вас и вашего банка или платежной системы.


      1. a-tk
        26.12.2024 07:17

        А это уже неважно. Факт показа карточки - красный флаг, который заражает всех, кто даже рядом с ним постоял.


  1. aamonster
    26.12.2024 07:17

    Увольте CMM-щика. Как только любая контора потребует карту "для подтверждения личности" – эта контора мгновенно будет зачислена в скамеры.


    1. anaxita
      26.12.2024 07:17

      Тогда пора переставать пользоваться гитлабом)

      Требовал карту для верификации


      1. ilyamodder
        26.12.2024 07:17

        Прям вот фотографию карты, серьезно?


        1. SmartEngines Автор
          26.12.2024 07:17

          Речь идет не про фотографирование, а распознавание карты. В видеопотоке. Без сохранения изображений и передачи данных за пределы вашего телефона.


          1. kuzzdra
            26.12.2024 07:17

            Без сохранения изображений и передачи данных за пределы вашего телефона.

            Мамой клянус!


          1. a-tk
            26.12.2024 07:17

            Это вы прокурору потом доказывать будете.


          1. ilyamodder
            26.12.2024 07:17

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

            А, и вы, конечно же, сертифицированы по стандарту PCI DSS, верно?


      1. kuzzdra
        26.12.2024 07:17


    1. SmartEngines Автор
      26.12.2024 07:17

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


    1. aborouhin
      26.12.2024 07:17

      Внезапно легально сдать металлолом в Московской области (не вдавался, но, по-моему, это региональное регулирование) можно только предъявив карту на своё имя, переводом на которую Вам за него заплатят. И паспорт. И всё это заносится в какую-то очередную ГИС. Буквально вчера отвёз центнер старых аккумуляторов от ИБП, поразился, насколько там всё теперь сложно.
      Так что подсказываю авторам статьи перспективный рынок - сейчас суровые мужики в бытовках на металлоприёмках всё это вручную с планшета заносят.


      1. SmartEngines Автор
        26.12.2024 07:17

        Металлолом давно с нами сотрудничает


        1. kuzzdra
          26.12.2024 07:17

          Любопытно, зачем оно им ;) Если так необходимо чтобы люки не воровали - паспорта должно хватать.


  1. Spellinger
    26.12.2024 07:17

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


  1. unreal_undead2
    26.12.2024 07:17

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


    1. kuzzdra
      26.12.2024 07:17

      Это не для банков, это для ростовщиков микрофинансовых организаций.


      1. unreal_undead2
        26.12.2024 07:17

        И таким тёмным личностям предлагается показывать скан паспорта и карты?


        1. SmartEngines Автор
          26.12.2024 07:17

          Оформление практически любых финансовых услуг требует предъявление паспорта. Наш софт распознает реквизиты документа с помощью ИИ прямо на телефоне, без передачи фото в сторонние сервисы и краудсорсинговые компании. Скачайте демо-приложение (AppStore, Google Play, RuStore), включите авиарежим и убедитесь сами.


  1. Wijey
    26.12.2024 07:17

    Совершение пробного платежа по реквизитам банковской карты (с обязательным указанием распознанных фамилии и имени).

    А имя-фамилия с карты реально хоть где-то в каких-то платежах учитывается? Там можно в процессе оплаты что угодно написать, хоть card holder, и оплата спокойно пройдёт, проверено многократно


    1. a-tk
      26.12.2024 07:17

      Более того, карты бывают обезличенные.


      1. a-tk
        26.12.2024 07:17

        del


    1. SmartEngines Автор
      26.12.2024 07:17

      Это зависит от платежной системы, банка-эквайера и настроек процессинга.


    1. a-tk
      26.12.2024 07:17

      А что если в качестве имени пользователя указать ';DROP TABLE users;'-- ? :)