Распознавание Документов В Браузере Вашего Устройства

Привет Хабр! Те из вас, кто следит за нашими публикациями о мобильном распознавании документов, знают, что мы придерживаемся принципа распознавания документов только на самом устройстве.

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

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

Ниже мы расскажем, как мы портировали наши решения по распознаванию документов, банковских карт, штрих-кодов и всего остального для использования в Wasm. Мы уверены, что вам будет интересно.



Распознавание документов в браузере вашего устройства

WebAssembly — это формат двоичного кода виртуальной машины, в который можно скомпилировать программы C, C++, C#, Rust или Go и который браузеры могут преобразовать в собственный двоичный код для машины, на которой они выполняются.

WebAssembly разрабатывается с 2015 года и на данный момент разрабатывается такими компаниями, как Mozilla, Microsoft, Google, Apple, Intel, Red Hat и др.

В настоящее время Wasm уже поддерживается (с различными ограничениями, но об этом позже) большинством популярные браузеры: Firefox, Chrome, Microsoft Edge, Safari и другие.

Наш основной интерес к технологии Wasm связан с возможностью обработки конфиденциальной информации в браузере без участия сервера.

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

Благодаря Wasm многие тяжелые или платформенно-зависимые приложения теперь можно мгновенно развернуть на любом устройстве с доступом в Интернет и современным браузером: вместо того, чтобы скачивать и устанавливать приложение, пользователю теперь достаточно одного клика по ссылке, чтобы получить готовое приложение.

сделана система оптического извлечения данных с веб-камеры или сканера.

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

Ему удалось, по крайней мере в области намерений, найти баланс между простотой интеграции, производительностью и безопасностью, путь к которому можно проследить через Java-апплеты, Flash, Silverlight, ActiveX и другие.

Одной из идей Wasm было (и есть) выполнять вычисления в браузере со скоростью, максимально приближенной к нативному приложению.

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

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

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

Нам удалось это сделать, потому что.

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

Мы всегда создаем интерфейсные оболочки и модули для встраивания на основе C++-интерфейса нашей основной библиотеки.

Это позволяет легко интегрироваться в системы, написанные на разных языках.

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

Существует множество инструментов для переноса существующей базы кода в модуль Wasm. Для языка C++ существует проект Emscripten, включающий инструмент Эмбинд .

Он позволяет максимально простым образом обертывать классы, их поля и методы в объекты, видимые из js. В принципе, это уже позволяет создать минимальное работающее приложение или библиотеку, но Wasm постепенно обзаводится поддержкой разного рода оптимизаций, которые хотелось бы использовать по максимуму.

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

Среди них те, которые мы используем многопоточность и SIMD-инструкции.

Конечно, не все сразу получилось — процесс разработки быстро превратился в путешествие, полное чудес и новых открытий.

В первую очередь мы разобрались с отладкой и исключениями — исключения в Васме реализованы через жестокий костыль: программе разрешено «упасть», но не удаляется из памяти.

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

Для этого мне пришлось создать в модуле специальную функцию.

В будущее обещают нормальную поддержку на случай исключения.

Больше всего времени мы потратили на реализацию многопоточности.

Многопоточность в js эмулируется с помощью воркеров.

На этапе инициализации создается пул воркеров, в котором происходит параллельное выполнение разных частей кода.

Путем проб и ошибок выработалось эмпирическое правило: количество одновременно исполняемых потоков внутри системы не может превышать количество создаваемых воркеров.

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

Для себя мы решили эту проблему, приравняв количество воркеров, созданных под задачу, и количество одновременно работающих внутри библиотеки потоков к количеству потоков, доступных системе.

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

Неполная поддержка SIMD-инструкций, проблемы с указателями i64 на старых архитектурах, слабая документация — но в итоге мы победили.

Для того, чтобы наше распознавание было доступно максимальному количеству браузеров, в принципе поддерживающих Wasm, мы готовим сразу четыре варианта сборки:

  • simd.threads (simds и многопоточность);
  • simd.nothreads (симды без многопоточности);
  • nosimd.threads (многопоточность без симдс);
  • nosimd.nothreads (ну вы поняли).

Чтобы определить возможности, поддерживаемые браузером, и, соответственно, загрузить с сервера только нужную версию модуля распознавания, существуют две небольшие библиотеки с открытым исходным кодом:
  1. https://github.com/GoogleChromeLabs/wasm-feature-detect (Апач 2).

  2. https://github.com/MaxGraey/wasm-check (МИТ).

Мы рекомендуем использовать importScripts() для загрузки соответствующей сборки, поскольку новый динамический импорт (ESM) не работают у рабочих в Fire Fox без полифила.



Давайте протестируем!

Вот как это выглядит на iPhone 8 и OnePlus 8T: Основные выводы, конечно, невозможно сделать без ориентира.

Измерим производительность модуля распознавания на разных платформах с разными оптимизациями (в таблицах указаны средние значения).

симд.потоки

Устройство штрих-код карта мрз
Хром 100 включен OnePlus 8T (восьмиядерный процессор Qualcomm 865) 0,30 с 0,30 с 0,70 с
Хром 100 включен Ryzen 7 3700X 8-ядерный 0,20 с 0,25 с 0,30 с
Хром 100 включен Microsoft Surface (двухъядерный процессор Pentium 4415Y) 0,50 с 0,90 с 2.00 с
nosimd.nothreads:
Устройство штрих-код карта мрз
Chrome 100 на OnePlus 8T (восьмиядерный процессор Qualcomm 865) 0,55 с 0,35 с 1,70 с
Хром 100 включен Ryzen 7 3700X 8-ядерный 0,60 с 0,30 с 0,90 с
Safari 14 на Apple iPhone 8 0,25 с 0,45 с 1,65 с
Chrome 100 на Microsoft Surface (двухъядерный процессор Pentium 4415Y) 0,40 с 1.30 с 4.50с
В таблицах выше мы представили результаты измерений двух крайних случаев: работа с оптимизациями (SIMD, многопоточность) и без, на различных машинах.

Планшет и мобильный телефоны работали со стандартной камерой, а компьютер был подключен к Microsoft LifeCam Studio. Изображение ограничено размером 640x480 (размер холста, на который выводим видеопоток).

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

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



Заключение

В целом, Wasm зарекомендовал себя как отличное решение для безопасного межплатформенного распознавания.

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

Таким образом, все наши организации теперь имеют хороший инструмент для создания удобных веб-приложений с привычным функционалом на базе ИИ, без привязки к магазинам приложений (App Store, Google Play и т. д.).

Теги: #Машинное обучение #программирование #искусственный интеллект #WebAssembly #ocr #WASM #распознавание объектов #распознавание паспортов #распознавание штрих-кода #распознавание банковских карт

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.