Skip to content

Документация по Smart Text Engine ​

Smart Text Engine — это многоплатформенный автономный SDK для распознавания неструктурированных текстовых фрагментов на документах и произвольных изображениях.

Жизненный цикл ​

Жизненный цикл TextEngine состоит из следующих этапов:

  1. Создание движка распознавания.
  2. Создание сессии распознавания.
  3. Настройка сессии распознавания.
  4. Создание объекта изображения (Image).
  5. Процесс распознавания.
  6. Обработка результата распознавания.
  7. Освобождение памяти.

Создание движка распознавания ​

Из описания системы:

Движок распознавания — это объект, в котором хранятся и инициализируются все инструменты распознавания. Он создается на основе конфигурационного бандла, содержащего все возможные настройки: список документов, поддерживаемых конкретным SDK, их полей, список возможных проверок подлинности и так далее.

Примечание.

В особых случаях бандл может поставляться не отдельно, а в составе (внутри) библиотеки.

При создании данного объекта обычно указывается способ инициализации и путь до бандла (если он поставляется отдельно).

Инициализацию движка рекомендуется выполнять в единственном экземпляре. Один экземпляр позволяет создавать множество сессий распознавания.

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

Создайте экземпляр TextEngine:

C++
std::unique_ptr<se::text::TextEngine> engine(
    se::text::TextEngine::Create(configuration_bundle_path));
Java
TextEngine engine = TextEngine.Create(configuration_bundle_path);

Параметры:

  • configuration_bundle_path — путь к конфигурационному файлу (бандлу), в котором прописаны настройки textengine (файл с расширением .se);
  • булевое значение, активация “ленивой” конфигурации (по умолчанию — true). Необязательный параметр.

В каждую поставку включен один или несколько бандлов — архивов, содержащих необходимые настройки для создания объектов и конфигурирования Smart Text Engine.

Внимание!

TextEngine::Create() является фабричным методом и и возвращает указатель на выделенный в памяти и инициализированный объект. За удаление этого объекта ответственен вызывающий.

Создание сессии распознавания ​

Из описания системы:

Настройки сессии — это объект, в котором хранится:

  • список поддерживаемых документов для распознавания, сгруппированных по внутренним движкам. Их состав задается в конфигурационном бандле, с которым был создан движок (только чтение);
  • список документов, переданных на распознавание (по умолчанию — *);
  • специальные опции сессии: количество потоков для распознавания и прочее. Полный список можно найти в документации.

Создайте объект TextSessionSettings на основе сконфигурированного экземпляра TextEngine:

C++
std::unique_ptr<se::text::TextSessionSettings> settings(
    engine->CreateSessionSettings());
Java
TextSessionSettings settings = engine.CreateSessionSettings();

Внимание!

TextEngine::CreateSessionSettings() является фабричным методом и и возвращает указатель на выделенный в памяти и инициализированный объект. За удаление этого объекта ответственен вызывающий.

Настройка сессии распознавания ​

Включение языков ​

Включите язык(и) распознаваемых документов.
Поддерживаемые языки — русский (rus) и английский (eng).

C++
settings->AddEnabledLanguages("rus"); // Russian language
Java
settings.AddEnabledLanguages("rus"); // Russian language

Поддерживаемые языки ​

Язык представляет собой строку (string), описывающий алфавит, который необходимо распознать (для этого обычно используются коды ISO 639-3). Также имеются два служебных языка — digits и punct (цифры и знаки пунктуации).

Получить информацию о языках, поддерживаемых SDK Smart Text Engine, входящим в ваш пакет поставки, можно следующим способом:

C++
// Iterating through supported languages
for (auto it = settings->SupportedLanguagesBegin();
     it != settings->SupportedLanguagesEnd();
     ++it) {
  //Getting language code
  std::string lang = it.GetValue();
  //Getting the string of characters
  std::string char_str = settings->GetLanguageAlphabet(lang); 
}
Java
// Iterating through supported languages
for (StringSetIterator it = settings.SupportedLanguagesBegin();
     !it.Equals(settings.SupportedLanguagesEnd());
     it.Advance()) {
  //Getting language code
  String lang = it.GetValue();
  //Getting the string of characters
  String char_str = settings.GetLanguageAlphabet(lang);
}

Для включения нескольких языков, укажите их через двоеточие, например, eng:digits.

Инициализация сессии ​

Из описания системы:

При поставке продукта клиенту передается персональная подпись. Она содержится в файле README.html в директории /doc.

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

Проверка подписи осуществляется в оффлайн режиме. Библиотека не обращается ни к каким внешним ресурсам.

Инициализируйте сессию (объект TextSession):

C++
const char* signature = "... YOUR SIGNATURE HERE ..."; //Подпись, используемая для запуска сессии распознавания Smart ID Engine
std::unique_ptr<se::text::TextSession> session(engine->SpawnSession(*settings, signature));
Java
String signature = "... YOUR SIGNATURE HERE ..."; //Подпись, используемая для запуска сессии распознавания Smart ID Engine
TextSession session = engine.SpawnSession(settings, signature);

Создание объекта Image ​

Из описания системы:

Для работы распознавания системе необходимо передать изображение специального класса se.common.image. Создать его можно из следующих форматов:

Поддерживаемые форматы:

  • jpeg, png;
  • tiff (✔️TIFF_LZW, ✔️TIFF_PACKBITS,✔️TIFF_CCITT);
  • base64 (форматы из пунктов выше);
  • файловый буфер с предварительным указанием цветовой схемы, ширины\высоты\количества каналов.

Максимально допустимый размер изображения по умолчанию 15000x15000px. Предельный размер изображения может быть увеличен пользователем.


Работа с HEIC

Работа с HEIC в мобильных SDK не отличается от работы с другими форматами изображений. Чтение HEIC осуществляется системными средствами.

В серверных SDK необходимо самостоятельно открыть HEIC формат сторонними средствами и конвертировать либо в один из поддерживаемых нами форматов, либо передать непосредственно сырые пиксели в виде RGB буфера (рекомендуется).

Работа с PDF

PDF с предварительной конвертацией в растровые форматы. По запросу клиента Smart Engines предоставляет такой конвертер под выбранную архитектуру.

Создайте объект изображения (Image) для последующей обработки:

C++
std::unique_ptr<se::common::Image> image(
    se::common::Image::FromFile(image_path)); // Загрузка из файла
Java
Image image = Image.FromFile(image_path); // Загрузка из файла

Справка

Для передачи любых изображений в движок необходим объект класса se.common.Image.

Список актуальных методов:

  • Image.FromFile(imagePath) — принимает локальный путь к файлу;
  • Image.FromFileBuffer(data) — принимает прочитанный в буфер файл;
  • Image.FromBase64Buffer(data) — принимает прочитанный в буфер файл, обернутый в base64;
  • Image.FromBufferExtended(raw_data, width, height, stride, pixel_format, bytes_per_channel) — эффективный способ создать объект Image из сырых пикселей;
  • Image.FromYUV(planeY, planeU, planeV, yuvDimensions) — позволяет создать Image из YUV_420_888.

Внимание!

Image::FromFile() является фабричным методом и и возвращает указатель на выделенный в памяти и инициализированный объект. За удаление этого объекта ответственен вызывающий.

Процесс распознавания ​

Вызовите метод ProcessImage(...) для обработки изображения документа:

C++
session->ProcessImage(*image);
Java
session.ProcessImage(image);

Обработка результата распознавания ​

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

Для получения результата рапознавания, выполните:

C++
const se::text::TextResult& result = session->GetCurrentResult();
java
TextResult result = session.GetCurrentResult();

Для получения информации об объекте TextScene, содержащим результаты распознавания, вызовите метод GetCurrentScene():

C++
const se::text::TextScene& scene = result.GetCurrentScene();
Java
TextScene scene = result.GetCurrentScene();

Для итерации по фрагментам распознанного текста, опысываемых коллекцией экземпляров TextChunk, получите объект TextIterator из объекта TextScene:

C++
 std::unique_ptr<se::text::TextIterator> chunk_iterator;
 chunk_iterator.reset(scene.CreateIterator("default"));
    for (; !chunk_iterator->Finished(); chunk_iterator->Advance()) {
      //Getting text chunk value (UTF-8 string representation)
      std::string chunk_str = chunk_iterator->GetTextChunk().GetOcrString().GetFirstString().GetCStr();
    }
Java
TextIterator chunk_iterator = scene.CreateIterator("default");
    for (; !chunk_iterator.Finished(); chunk_iterator.Advance()) {
      //Getting text chunk value (UTF-8 string representation)
      String chunk_str = chunk_iterator.GetTextChunk().GetOcrString().GetFirstString().GetCStr();
    }

Освобождение памяти ​

Несмотря на то, что сборка мусора присутствует и работает, рекомендуется вызывать метод obj.delete() для наших объектов API вручную, поскольку они являются обертками памяти, выделенной в куче. Размер кучи неизвестен сборщику мусора, что может привести к задержке удаления объектов и, следовательно, высокому общему потреблению памяти.

Некоторые классы Smart Text Engine SDK содержат фабричные методы, возвращающие указатели на объекты, выделенные в куче.  Необходимо удалять такие объекты.

Рекоментации.

  • в C++:
    Для простоты управления памятью и предотвращения ее утечек пользуйтесь умными указателями std::unique_ptr<T>.

  • в Java API:
    Удаляйте ненужные объекты с помощью метода .delete().

Интерфейс библиотеки ​

Общие классы ​

Общие классы, например, Point, OcrString, Image и т.д., находятся в пространстве имен se::common в директории secommon.

Это следующие заголовочные файлы C++:

Заголовочный файлОписание
<secommon/se_export_defs.h>Содержит определения экспорта в библиотеках Smart Engines
<secommon/se_exceptions_defs.h>Содержит определения исключений в библиотеках Smart Engines
<secommon/se_geometry.h>Содержит классы и процедуры, описывающие геометрию (Point, Rectangle, и т.п.)
<secommon/se_image.h>Содержит классы и процедуры обработки изображений
<secommon/se_string.h>Содержит классы строк (MutableString, OcrString, и т.д.)
<secommon/se_string_iterator.h>Содержит определение итераторов строк
<secommon/se_serialization.h>Содержит вспомогательные классы, связанные с сериализацией объектов (не используется в Smart ID Engine)
<secommon/se_common.h>Вспомогательный заголовок, который включает в себя все вышеперечисленное

Аналогичные Java API содержатся в модуле com.smartengines.common:

Java
import com.smartengines.common.*; // Импорт классов пакета se::common classes

Основные классы ​

Основные классы Smart Text Engine содержатся в пространстве имен se::text в директории textengine:

Заголовочный файлОписание
<textengine/text_chunk_info.h>Предоставляет информацию о фрагментах текста
<textengine/text_engine.h>Содержит класс textengine
<textengine/text_session_settings.h>Содержит определение класса textSessionSettings
<textengine/text_ session.h>Содержит определение класса textSession
<textengine/text_result.h>Содержит определение класса textResult
<textengine/text_feedback.h>Содержит интерфейс обратной связи text_Feedback и связанные с ним контейнеры
<textengine/text_forward_declarations.h>Служебный заголовок, содержащий предварительные декларации
<textengine/text_iterator.h>Содержит определение класса TextIterator
<textengine/text_scene.h>Содержит определение класса text_scene

Аналогичные классы Java API содержатся в модуле com.smartengines.:

Java
import com.smartengines.text.*; // Импорт всех классов se::text classes

Обработка исключений ​

C++ API может выдавать исключения подклассов se::common::BaseException при неверном вводе данных, некорректных вызовах и других ошибках.

Поддерживаются следующие подклассы исключений:

ИсключениеОписание
FileSystemExceptionВыдается при попытке чтения из несуществующего файла или другой ошибке ввода-вывода, связанной с файловой системой
InternalExceptionВыдается, если возникает неизвестная ошибка или ошибка возникает во внутренних компонентах системы
InvalidArgumentExceptionВыдается, если метод вызывается с недопустимыми входными параметрами
InvalidKeyExceptionВыдается при попытке доступа к ассоциативному контейнеру о с недействительным или несуществующим ключом или доступа к списку с недопустимым индексом или индексом, выходящим за пределы допустимого диапазона
InvalidStateExceptionВыдается, если в системе возникает ошибка из-за неправильного внутреннего состояния системных объектов
MemoryExceptionВыдается при попытке выделения объектов при недостаточном объеме оперативной памяти
NotSupportedExceptionВыдается при попытке доступа к методу, который с учетом текущего состояния или переданных аргументов не поддерживается в текущей версии библиотеки или не поддерживается вообще
Uninitialized Object ExceptionВыдается при попытке доступа к несуществующему или неинициализированному объекту

При возникновении исключений, выводятся сообщения, понятные пользователю, с помощью метода e.what().

Примечание.

se::common::BaseException не является подклассом std::exception. Интерфейс Smart ID Engine не имеет зависимостей от STL.

Оберткой для исключений Java API является общий класс java.lang.Exception.
Тип исключения включен в текст сообщения.

Распознавание PDF ​

PDF поддерживается для распознавания серверными SDK. Поддержка PDF реализована посредством предварительного преобразования документов PDF в растровые изображения (например, PNG).

Преобразование PDF в растровые изображения может выполняться с помощью библиотеки с открытым исходным кодом PDFium через утилиту командной строки pdfium_cli.

Утилита преобразования PDF предоставляется по запросу, чтобы уменьшить размер дистрибутива SDK.

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

ПараметрОписаниеПо умолчанию
-i, --inputПуть к входному файлу PDF—
-o, --outputКаталог выводаresult
-p, --prefixПрефикс имени файла для выходных файловpage_
-d, --dpiРазрешение рендеринга в DPI300
-r, --pagesДиапазон страниц для рендеринга, например «1-3,5,7» или «all»all
-g, --grayscaleРендеринг страниц в оттенках серого (меньший размер файла PNG)—
-h, --helpВывести сообщение справки—

Примеры:

shell
./pdfium_cli -i file.pdf
shell
./pdfium_cli -i file.pdf -o out -d 150 -r 1-5