В области машинного обучения и компьютерного зрения оптическое распознавание символов (OCR) и распознавание рукописного ввода (HTR) были немногими из давно изучаемых и важных тем. Эта история поможет энтузиастам компьютерного зрения получить общее руководство по распознаванию текста в изображениях документов. OCR - это не что иное, как преобразование фотографии документа или фотографии сцены в машинно-кодированный текст; тогда как HTR то же самое для рукописного текста. Я разделил эту проблему на набор более мелких задач и создал блок-схему, показанную на рис. 1.1.

Обрезать изображение до границы документа.

При обработке изображений часто требуется редактировать изображения для лучшего представления артефакта конечного изображения. Обрезка - одна из наиболее распространенных операций с изображениями, выполняемых для удаления ненужных частей изображения, а также для добавления необходимых функций к изображению. Используя OpenCV, вы можете легко найти края документа на изображении. Лучший способ найти края документа на изображении - использовать пороговое изображение. OpenCV предоставляет разные стили определения пороговых значений, и это определяется четвертым параметром функции. Поскольку первый аргумент - это исходное изображение, которое должно быть изображением в оттенках серого. ; второй аргумент - это пороговое значение, которое используется для классификации значений пикселей; Третий аргумент - maxVal, который представляет значение, которое должно быть присвоено, если значение пикселя больше (иногда меньше) порогового значения . Следующий код поможет вам найти пороговое изображение, а затем контуры по краям документа, вы можете сравнить точки контура с краем изображения и определить край документа.

# threshold image
ret, thresh = cv2.threshold(imgray, 150, 255, 0)
cv2.imwrite('thresh.jpg', thresh)
# edge contours
contours, hierarchy = cv2.findContours(thresh, 1, 2)

Обнаружение и обрезка / сегментирование всех слов в документе.

Обнаружение слов в ограниченной контролируемой среде обычно может быть выполнено с использованием эвристических подходов, таких как использование информации о градиенте или того факта, что текст обычно группируется в абзацы, а символы отображаются на прямой линии. Но недостатком эвристического подхода является то, что я обнаружил много нежелательных областей на изображении, обнаруженных как слова. Поэтому я использовал детектор EAST (эффективный и точный текст сцены) OpenCV. Я сослался на статью Адриана Роузброка о pyimagesearch, относящуюся к детектору EAST, и, чтобы улучшить ее, я следил за медиум-историей Тома Хога. Такой подход позволит с высокой точностью обнаруживать как рукописные, так и машинные отпечатки. Как только слова на изображении обнаружены, обрежьте их и сохраните каждое из них.

Предварительная обработка изображений слов

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

imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Это слово написано от руки?

Это проблема классификации, в которой мне нужно было решить, есть ли в конкретном изображении рукописное слово или слово, напечатанное машиной. Прочитав множество статей и исследовательских работ, я понял, что использование машин опорных векторов (SVM) будет лучшим решением этой проблемы. Для этого я использовал классификатор SVC из пакета sklearn. С точки зрения набора данных, используемого для классификации, набор данных IAM является лучшим маркированным набором данных, который я мог найти для изображений рукописных слов; тогда как для машинных изображений слов я собрал около 2000 изображений слов. Ниже приведены функции, используемые для прогнозирования:

  1. Средняя интенсивность пикселей.
  2. Стандартное отклонение яркости пикселей.
  3. Пороговое значение Оцу.
  4. Количество локальных максимумов на гистограмме яркости пикселей.
  5. Процент пикселей, принадлежащих верхней четверти яркости пикселей.
  6. Процент пикселей, относящихся к нижней четверти яркости пикселей.

Как видно, все особенности связаны с яркостью изображения. Теперь следующий очевидный вопрос: как найти интенсивность пикселей? Значения пикселей в изображении в оттенках серого - это не что иное, как интенсивность пикселей. Я снова использовал OpenCV и математические операции, чтобы это сделать.

HTR с использованием tenorflow.

Это была самая сложная проблема среди всех проблем, перечисленных в этой истории. После опробования различных решений (включая попытку переобучить тессеракт на рукописном наборе данных) статья Харальда Шейдла оказалась впереди. Я также использовал аналогичный подход с небольшими изменениями. Итак, я использовал здесь нейронные сети, они состоят из 5 слоев сверточной NN (CNN), 2 рекуррентных слоев NN (RNN) и слоя временной классификации Connectionist (CTC). Набор данных, используемый для обучения нейронной сети, представляет собой набор данных IAM, вы можете использовать любой другой помеченный набор данных с изображениями слов.

Входными данными для слоев CNN является изображение в оттенках серого размером 128 x 32. Выходные данные слоев CNN представляют собой последовательность из 32 элементов, содержащих 256 функций в каждой записи. Эти функции дополнительно обрабатываются слоями RNN, однако некоторые функции уже показывают высокую корреляцию с некоторыми высокоуровневыми свойствами входного изображения.

На рис. 1.3 представлена ​​визуализация выходной матрицы RNN для изображения, содержащего текст «маленький». Матрица, показанная на самом верхнем графике, содержит оценки для символов, включая пустую метку CTC в качестве последней (80-й) записи. Другие элементы матрицы, сверху вниз, соответствуют следующим символам: «!» # & ’() * +, -. / 0123456789:;? ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz».

Можно видеть, что в большинстве случаев символы предсказываются именно в том положении, в котором они появляются на изображении (например, сравните положение «i» на изображении и на графике). Не выравнивается только последний символ «е». Но это нормально, поскольку операция CTC не требует сегментации и не заботится об абсолютных позициях. Из самого нижнего графика, показывающего оценки для символов «l», «i», «t», «e» и пустой метки CTC, текст можно легко декодировать: мы просто берем наиболее вероятный символ из каждого раза -step, это формирует так называемый лучший путь, затем мы отбрасываем повторяющиеся символы и, наконец, все пробелы: «l - -ii - tt - l-… -e» → «l - -i - tt - l-… -e »→« маленький ».

Более подробную информацию о реализации можно найти в статье Herald Scheidl.

Тессеракт (OCR).

Tesseract - безусловно, лучший инструмент OCR с открытым исходным кодом для машинно-напечатанных данных. Tesseract поддерживает Unicode (UTF-8) и может распознавать более 100 языков. Он также имеет поддержку нескольких выходов, включая простой текст, PDF, TSV и т. Д. Но для того, чтобы получить лучшие результаты OCR, мне пришлось улучшить качество изображения, которое должно быть предоставлено tesseract. Отметим, что tesseract выполняет различные операции обработки изображений внутренне (с использованием библиотеки Leptonica), прежде чем выполнять собственное распознавание текста. Как правило, он работает очень хорошо, но в некоторых случаях его недостаточно, что может привести к значительному снижению точности.

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

  1. Инвертирование изображений.
  2. Изменение масштаба.
  3. Бинаризация.
  4. Удаление шума.
  5. Поворот / выравнивание.
  6. Удаление краев.

Все эти операции могут быть выполнены с использованием операций OpenCV и / или numpy в python.

Таким образом, эта история проведет вас через множество проблем и возможных решений, связанных с OCR и HTR; его реализация - это то, на что вам нужно будет обратить внимание. Я реализовал все это; Если вам нужна помощь, вы можете связаться со мной.

📝 Прочтите этот рассказ позже в Журнале.

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