Введение

Работая в ЮНИСЕФ в Нигерии в качестве специалиста по данным о полиомиелите, я столкнулся с проблемой ошибок в картах вакцинации, которые были доставлены 20 000 добровольцев от полиомиелита, и даже с большим количеством карт вакцинации, которые необходимо проверить. Простое оцифровывание и раздача всем планшетов - это не вариант. После исследования я решил использовать AI / ML и компьютерное зрение, чтобы «читать» информацию с карточек, а затем предоставить механизм обратной связи о наиболее распространенных ошибках и предсказать правильную информацию.

В этом руководстве Вы увидите, как этого добиться, каковы результаты и рекомендации для будущей оптимизации. В основном я буду использовать библиотеки Python TensorFlow и OpenCV, а также некоторые вспомогательные библиотеки.

Установка

Установка с использованием TensorFlow зависит от ОС и оборудования, которое вы собираетесь использовать. Общие инструкции см. В этой статье здесь

Для этого урока я буду использовать следующие пакеты:

ОС: Linux _X64 (Arch Linux)
Менеджер пакетов Python: Anaconda или Miniconda (инструкция по установке здесь)
CUDA 10.1.105
CuDNN 7.5.0 < br /> Python Tensorflow Api V1
Opencv-python

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

Создание среды conda

conda create -n pyocr
conda activate pyocr

Установка необходимых пакетов

conda install tensorflow
conda install opencv
conda install -c lightsource2-tag pyzbar
pip install editdistance

Сохранение версии библиотеки для будущей репликации

conda env export > <environment-name>.yml

Воссоздайте среду на другом компьютере

Чтобы воссоздать среду на другом компьютере, используйте это после создания и активации среды на другом компьютере.

conda env create -f <environment-name>.yml

Распознавание текста с помощью Tensorflow

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

Весь код руководства загружен в репозиторий GitHub. Клонируйте этот репозиторий с помощью git clone, если вам нужен окончательный код

git clone [email protected]:PiotrKrosniak/ocrbot.git pyocr

Входы

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

Получить данные обучения

  1. Получить набор данных IAM
  2. Зарегистрируйтесь по адресу: http://www.fki.inf.unibe.ch/databases/iam-handwriting-database
  3. Загрузите ascii / words.txt.
  4. Поместите words.txt в каталог data /.
  5. Скачайте words / words.tgz.
    . Создайте каталог data / words /.

а. Поместите содержимое (каталоги a01, a02,…) слова words.tgz в data / words /
i.
Для терминала linux - в папке data выполните команду linux tar xvf words.tgz -C слова)

  1. Запустите checkDirs.py для грубой проверки файлов.

Проверьте, выглядит ли структура каталога так:

data
— test.png
— words.txt
— words
— — a01
— — — a01–000u
— — — — a01–000u-00–00.png
— — — — …
— — — …
— — a02
— — …

Обучение модели

Сначала извлеките модель. Разархивируйте файл model.zip в ту же папку (‹root› / model). Затем запустите обучение в каталоге src. Скрипт здесь будет основываться на ранее обученной модели и улучшать ее точность на основе ваших данных.

python main.py — train

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

Снимки и контрольные точки будут созданы, как указано выше.

Запуск скрипта OCR

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

Запустите код в папке src (внутри терминала)

Python Demo.py

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

После завершения выполнения кода выходные данные будут присутствовать в выходной папке:

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

Однако в зависимости от ваших текущих моделей распознанный текст будет сохранен в файлах CSV с теми же именами, что и входные изображения. Эти файлы CSV можно открывать в программах для работы с электронными таблицами, таких как Microsoft Excel или Google Sheets.

Повышение точности

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

Чтобы использовать эти изображения ячеек таблицы для обучения набора данных, выполните следующие действия:

  1. Предварительно обработайте изображения, чтобы сделать их совместимыми с набором данных IAM. Это абсолютно необходимо для того, чтобы скрипт правильно обучился работе с вашими изображениями. На более высоком уровне выполняются следующие шаги:

а. Утолщение слабых линий в тексте

б. Удаление лишних пробелов вокруг слова с помощью сегментации слов (см. этот код)

c. Улучшение контраста с помощью техники пороговой обработки

  1. Переименование и копирование изображений в папке данных в формате, используемом модулем Dataloader.py:

Например, файл c01–009–00–00.png должен быть сохранен в следующей иерархии папок.

| Words
| — a01
| — — c01–009
| — — — c01–009–00–00.png

Однако вы можете изменить эти иерархии папок / соглашения об именах файлов, отредактировав модуль DataLoader.py

3. Отредактируйте файл words.txt в модуле данных, чтобы включить эти изображения.

Следующий код выполняет операции 1a и b.

import numpy as np
import cv2
# read
img = cv2.imread(‘in.png’, cv2.IMREAD_GRAYSCALE)
# increase contrast
pxmin = np.min(img)
pxmax = np.max(img)
imgContrast = (img — pxmin) / (pxmax — pxmin) * 255
# increase line width
kernel = np.ones((3, 3), np.uint8)
imgMorph = cv2.erode(imgContrast, kernel, iterations = 1)
# write
cv2.imwrite(‘out.png’, imgMorph)

Чтобы записать файл words.txt, следуйте соглашениям в формате ниже, применимым к вашим изображениям:

Линия отбора проб: a01–000u-00–00 ok 154 1 408 768 27 51 AT A

  • a01–000u-00–00 - ›идентификатор слова для строки 00 в форме a01–000u. Это также имя файла изображения, которое вы сопоставляете.
  • ок - ›результат сегментации слов
  • хорошо: слово было правильно
  • э: сегментация слова может быть плохой
  • 154 - ›graylevel, чтобы преобразовать строку, содержащую это слово, в двоичную форму. Это шаг растяжения контраста / порогового значения.
  • 1 - ›количество компонентов для этого слова
  • 408 768 27 51 - ›ограничивающая рамка вокруг этого слова в формате x, y, w, h
  • AT - ›грамматический тег этого слова, см.

файл tagset.txt для объяснения

  • A - ›транскрипция этого слова, описывающего текстовое содержимое изображения.

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

Объяснение подхода

Код выполняет три основных шага:

  1. Совместите шаблон и поверните изображение
  2. Распознавать строки в таблице и обрезать
  3. Распознавать текст с помощью python-tenorflow

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

Он состоит из 5 уровней CNN, 2 уровней RNN (LSTM) и уровня потерь и декодирования CTC.

  • Входное изображение представляет собой изображение с оттенками серого и имеет размер 128x32.
  • 5 слоев CNN сопоставляют входное изображение с последовательностью признаков размером 32x256
  • 2 слоя LSTM с 256 единицами распространяют информацию через последовательность и отображают последовательность в матрицу размером 32x80. Каждый матричный элемент представляет собой оценку для одного из 80 символов на одном из 32 временных шагов.
  • Уровень CTC либо вычисляет значение потерь с учетом матрицы и достоверного текста (при обучении), либо декодирует матрицу до окончательного текста с наилучшим декодированием пути или декодированием поиска луча (при выводе)
  • Размер партии установлен на 50

Рис 5: Механизмы, задействованные на этапе OCR с использованием тензорного потока

Заключение

Следуя этому руководству, теперь у вас есть способ автоматизировать оцифровку рукописных текстов в таблицах табличного формата. Можно сэкономить бесчисленное количество часов, если научить модель распознавать ваш почерк и настраивать ее в соответствии с вашими потребностями. Однако будьте осторожны, так как распознавание не является точным на 100%. Таким образом, после создания электронной таблицы может потребоваться этап высокоуровневой корректуры, прежде чем вы будете готовы поделиться окончательной таблицей.

Ссылка:

  1. Ссылка на код: https://github.com/PiotrKrosniak/ocrbot
  2. Распознавание рукописного ввода с помощью Google TensorFlow: https://towardsdatascience.com/build-a-handwritten-text-recognition-system-using-tensorflow-2326a3487cd5
  3. Обработка крайних случаев: https://towardsdatascience.com/faq-build-a-handwritten-text-recognition-system-using-tensorflow-27648fb18519
  4. Набор данных для начала: http://www.fki.inf.unibe.ch/databases/iam-handwriting-database
  5. Https://github.com/githubharald/SimpleHTR