Как стать автором
Обновить
46.78
Smart Engines
Обработка изображений, распознавание в видеопотоке

Распознавание банковской карты для подтверждения личности

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров913

В условиях стремительной цифровизации и активного развития дистанционных услуг подтверждение личности становится краеугольным камнем финансовых процессов. Задача быстрой и надежной идентификации актуальна во всем мире. А сегодня мы поделимся с вами красивой идеей, как можно с помощью современных технологий распознавания (на примере, естественно, продуктов 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.

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

Теги:
Хабы:
+1
Комментарии26
2

Публикации

Информация

Сайт
smartengines.ru
Дата регистрации
Дата основания
Численность
51–100 человек
Местоположение
Россия