Откройте возможности распознавания рукописных предложений с TensorFlow и потерей CTC. От оцифровки заметок до расшифровки исторических документов и автоматизации экзаменационных оценок

Самые продвинутые планы развития науки о данных, которые вы когда-либо видели! Поставляется с тысячами бесплатных учебных ресурсов и интеграцией ChatGPT! https://aigents.co/learn/roadmaps/intro

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

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

Исследователи разработали различные техники и методы распознавания рукописных предложений, чтобы решить эту проблему. В этом руководстве мы сосредоточимся на одном подходе: потеря TensorFlow и CTC для распознавания рукописных предложений.

Проблемы распознавания рукописного текста:

Попробуйте прочитать следующее изображение:

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

  • Изменчивость и неоднозначность штрихов от человека к человеку может затруднить точное распознавание текста моделью;
  • Несоответствие индивидуального стиля почерка, который со временем может измениться и затруднить распознавание текста моделью;
  • Шум и деформации, такие как пятна, складки или чернильные пятна, могут повлиять на процесс распознавания и затруднить идентификацию текста моделью;
  • Макет и контекст текста, например шрифт или размещение в текстовом блоке большего размера, также могут влиять на процесс распознавания.
  • Скорописный почерк затрудняет разделение и распознавание символов;
  • Рукописный текст может отображаться под разными углами, в отличие от печатного текста, который обычно расположен вертикально;
  • Приобретение высококачественного набора данных для обучения программного обеспечения по распознаванию рукописного ввода может быть дорогостоящим по сравнению с синтетическими данными.

Случаи использования:

Распознавание рукописных предложений имеет множество приложений, в том числе:

  • Оцифровка рукописных заметок. Рукописные заметки могут быть сложными для систематизации и поиска, особенно если они написаны от руки. Преобразование рукописных заметок в цифровой текст может упростить управление и поиск с помощью распознавания рукописных предложений;
  • Расшифровка исторических документов. Многие исторические записи написаны от руки, что затрудняет их чтение и понимание. Исследователи и широкая общественность могут использовать распознавание рукописных предложений, чтобы расшифровывать эти документы и делать их более доступными;
  • Автоматическая оценка экзамена. Оценку экзамена также можно выполнять с помощью распознавания рукописных предложений. Это может сократить время, затрачиваемое на административную работу, освобождая преподавателей, чтобы они могли сосредоточиться на других обязанностях.

Что такое потеря CTC?

Распознавание рукописных предложений может быть выполнено с использованием различных приемов и методов. Одним из таких методов является использование TensorFlow и потери CTC. Эту технику более подробно я объяснял в своих предыдущих уроках.

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

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

Функция потери CTC основана на «пустом» символе, специальном символе, который может быть вставлен между символами в выходной последовательности. Пустой символ используется для выравнивания входной и выходной последовательностей и позволяет модели предсказывать символы в правильном порядке, даже если во входной последовательности есть пропуски или повторения.

Предпосылки:

Прежде чем мы начнем, вам необходимо установить следующее программное обеспечение:

  • Питон 3;
  • TensorFlow (в этом руководстве мы будем использовать версию 2.10);
  • млту==0.1.5

Подготовка модели и набор данных:

TensorFlow — это созданная Google система с открытым исходным кодом для выполнения задач машинного обучения. Он широко используется для обучения и развертывания моделей машинного обучения и имеет множество встроенных инструментов и библиотек для таких задач, как распознавание изображений, обработка естественного языка и многое другое.

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

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

После загрузки этого набора данных (data/sentences.tgz) заархивируйте его в папку Datasets/IAM_Sentences. Также вам нужно будет скачать аннотации (data/ascii.tgz) и заархивировать в нужное место.

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

Этот код используется для подготовки набора данных для модели машинного обучения. Набор данных состоит из изображений рукописного текста и соответствующего текста, написанного на этих изображениях. Код сначала указывает расположение текстового файла и папку, в которой хранятся изображения. Затем он создает три пустые переменные: Dataset, vocab и max_len. Затем код открывает текстовый файл и читает все строки. Для каждой строки в текстовом файле код проверяет, начинается ли строка с «#» или является ли третье слово в строке «err»; если это так, он пропускает строку. Если нет, он берет первые три буквы и первые восемь букв первого слова в строке и использует их для создания пути к папке, в которой хранится изображение. Он также создает имя файла, добавляя «.png» к первому слову. Он также берет последнее слово в строке, которое является текстом, написанным на изображении, и удаляет символ новой строки в конце. Наконец, код добавляет путь к изображению и метку в набор данных и добавляет все символы метки в словарь. Он также отслеживает самую расширенную метку в наборе данных на данный момент.

Вот несколько изображений из набора данных:

И это лишь несколько примеров из тысяч!

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

  • IAM: набор данных IAM представляет собой набор рукописных текстовых изображений, предоставленных Институтом анализа документов и распознавания образов Базельского университета. Набор данных состоит из 1539 страниц рукописного текста на английском, немецком и французском языках и содержит более 6000 строк текста. Он широко используется в исследованиях машинного обучения и компьютерного зрения;
  • Бентам: набор данных Бентама представляет собой собрание рукописей, написанных английским философом, юристом и социальным реформатором Джереми Бентамом. Он содержит более 600 рукописей и разделен на четыре категории: политические работы, юридические работы, психологические работы и разные работы. Рукописи варьируются от коротких записных книжек до переплетенных томов, и каждый включает введение, оглавление и подробные описания отдельных работ;
  • Rimes: Rimes — это большой набор данных рукописного текста на французском языке с более чем 1 миллионом аннотированных слов. Он был разработан для исследования распознавания рукописного текста, включая отдельные символы и строки текста. Набор данных содержит различные уровни сложности с точки зрения размера букв, стиля письма и качества почерка;
  • Вашингтон: набор данных Вашингтона представляет собой набор из 1800 изображений рукописного английского текста. Он был создан для распознавания рукописного ввода и исследований в области машинного обучения и содержит отдельные символы и текстовые строки. Набор данных разделен на три категории: легкий, средний и сложный, с различными уровнями сложности;
  • Saint Gall: набор данных Saint Gall представляет собой коллекцию из 6000 изображений рукописного латинского текста с 8 по 10 века. Этот набор данных является ценным ресурсом для анализа исторических документов и распознавания почерка, поскольку он состоит из рукописей, хранившихся веками. Он также использовался для обучения моделей обработки естественного языка.

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

Затем набор данных должен быть предварительно обработан и подготовлен для использования в модели. Это может включать в себя такие задачи, как чтение изображений, преобразование изображений рукописных предложений в подходящий формат, индексирование меток, заполнение меток и разделение набора данных на наборы для обучения и тестирования. Точно так же, как и раньше, я делаю эти шаги с пользовательским объектом DataProvider:

Кроме того, при обучении моделей машинного обучения крайне важно применять методы увеличения данных для достижения лучших результатов обучения. В этом уроке я использую усилители RandomBrightness, RandomErodeDilate и RandomSharpen для объекта поставщика обучающих данных:

Определение архитектуры модели:

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

  1. Мы определяем входной и выходной слои: входной слой модели должен быть четырехмерным тензором с размерами [размер пакета, ширина, высота, каналы], где размер пакета — это количество изображений в пакете, ширина и высота — это размеры изображений, а каналы — количество цветовых каналов в изображениях (1 для оттенков серого, 3 для RGB);
  2. Добавьте слои CNN: слои CNN модели должны отвечать за извлечение функций из изображений. Типичная архитектура для слоев CNN заключается в использовании комбинации сверточных, объединенных и полносвязных (плотных) слоев;
  3. Добавьте слои RNN: слои RNN модели должны отвечать за обработку последовательности функций и прогнозирование символов в тексте. Распространенным типом RNN для этой задачи является сеть с долговременной кратковременной памятью (LSTM);
  4. Наконец, мы компилируем модель: после определения слоев CNN и RNN модель можно скомпилировать с использованием функции потерь CTC и оптимизатора, такого как Adam.

Вот базовая архитектура модели, используемой в этом руководстве:

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

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

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

Для оценки эффективности обучения модели распознавания рукописных предложений можно использовать несколько показателей. Но два из них наиболее популярны для задач, связанных с извлечением текста. Мы можем проверить их с помощью обратного вызова TensorBoard (tensorboard --logdir Models/04_sentence_recognition/202301131202/logs), используемого при обучении модели.

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

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

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

Этот график Word Error Rate показывает еще большую разницу между данными обучения и проверки. Но цель состояла в том, чтобы увидеть общее улучшение во время тренировки, что мы и сделали!

Показатели CER и WER в основном используются в системах OCR и помогают оценить точность модели.

Тестирование модели:

После обучения модель готова к тестированию на новых данных. Для тестирования модели вам потребуется:

  1. Предварительно обработайте тестовые данные: тестовые данные должны быть предварительно обработаны так же, как и обучающие данные.
  2. Оцените модель на тестовых данных. Производительность модели на тестовых данных можно оценить с помощью потерь CTC и любых дополнительных показателей, которые вы определили во время обучения.

Но нет смысла проверять это, пока мы уже получили графики CER и WER выше из процессов обучения и оценки. Итак, давайте проведем вывод на уже обученной модели, которая была преобразована в модель .ONNX. Для этого я написал скрипт:

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

Этикетка: «письма Бетти без чрезмерного акцента»

Предсказание: «Беттис пишет без чрезмерного акцента»

CER: 0,046511627906976744; Вер: 0,4

Этикетка: «затруднил достижение корпораций»

Прогноз: «Корпорациям стало трудно действовать»

CER: 0,061224489795918366; Вер: 0,375

Этикетка: «схема питания».

Предсказание: «схема питания».

CER: 0,07692307692307693; ВЕР: 0,33333333333333333

Этикетка: «малейший эффект».

Прогноз: «малейший эффект».

КЕР: 0,0; Вер: 0,0

Этикетка: «из фруктов».

Предсказание: «фрукты».

CER: 0,09090909090909091; ВЕР: 0,33333333333333333

Метка: «обычные средства правовой защиты, которым он подвергался»

Предсказание: «обычные средства правовой защиты, которым он был подвергнут»

CER: 0,038461538461538464; Вер: 0,125

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

Заключение:

В этом руководстве было рассмотрено создание модели для распознавания рукописных предложений с использованием TensorFlow и функции потери CTC. Мы обсудили проблемы и варианты использования распознавания рукописных предложений и рассмотрели различные методы и приемы решения этой проблемы. Мы также обсудили показатели, которые можно использовать для оценки производительности модели, и представили несколько наборов данных, которые можно использовать для обучения и оценки. Наконец, мы рассмотрели способы повышения производительности модели и обсудили важность предварительной обработки данных и выбора образцовой архитектуры модели.

Создание модели для распознавания рукописных предложений с помощью TensorFlow — увлекательная и захватывающая задача!

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

Полный код руководства на GitHub.

Первоначально опубликовано на https://pylessons.com/handwriting-sentence-recognition