Вступление
Люди могут понять содержание изображения, просто взглянув. Мы воспринимаем текст на изображении как текст и можем его прочитать.
Компьютеры работают по-другому. Им нужно что-то более конкретное, организованное так, чтобы они могли понять.
Вот тут-то и срабатывает Оптическое распознавание символов (OCR). Будь то распознавание автомобильных номеров с камеры или рукописные документы, которые должны быть преобразованы в цифровую копию, этот метод очень полезен. Хотя это не всегда идеально, это очень удобно и делает его намного проще и быстрее для некоторых людей, чтобы сделать свою работу.
В этой статье мы углубимся в глубину оптического распознавания символов и области его применения. Мы также создадим простой скрипт на Python, который поможет нам обнаруживать символы из изображений и выставлять их через приложение Flask для более удобного средства взаимодействия.
Что такое Оптическое распознавание символов?
Оптическое распознавание символов включает в себя обнаружение текстового содержимого на изображениях и перевод изображений в кодированный текст , который компьютер может легко понять. Изображение, содержащее текст, сканируется и анализируется, чтобы идентифицировать символы в нем. После идентификации символ преобразуется в машинно-кодированный текст.
Как это действительно достигается? Для нас текст на изображении легко различим, и мы способны распознавать символы и читать текст, но для компьютера все это-серия точек.
Изображение сначала сканируется, а текст и графические элементы преобразуются в растровое изображение, которое по сути представляет собой матрицу из черных и белых точек. Затем изображение предварительно обрабатывается, где яркость и контрастность настраиваются для повышения точности процесса.
Теперь изображение разбивается на зоны, определяющие области интереса, например, где находятся изображения или текст, и это помогает запустить процесс извлечения. Области, содержащие текст, теперь могут быть разбиты дальше на строки, слова и символы, и теперь программное обеспечение может сопоставлять символы с помощью сравнения и различных алгоритмов обнаружения. Конечным результатом является текст на изображении, которое нам дано.
Этот процесс может быть не на 100% точным и может потребовать вмешательства человека для исправления некоторых элементов, которые были неправильно отсканированы. Исправление ошибок также может быть достигнуто с помощью словаря или даже обработки естественного языка (НЛП).
Теперь выходные данные могут быть преобразованы в другие носители, такие как документы Word, PDF-файлы или даже аудиоконтент с помощью технологий преобразования текста в речь.
Использование OCR
Ранее оцифровка документов осуществлялась путем ручного набора текста на компьютере. С помощью OCR этот процесс становится проще, так как документ может быть отсканирован, обработан, а текст извлечен и сохранен в редактируемой форме, такой как документ word.
Если у вас есть сканер документов на вашем телефоне, например Adobe Scan, вы, вероятно, сталкивались с технологией OCR в использовании.
Аэропорты также могут использовать OCR для автоматизации процесса распознавания паспортов и извлечения из них информации.
Другие виды использования OCR включают автоматизацию процессов ввода данных, обнаружение и распознавание автомобильных номерных знаков.
Что мы будем использовать
Для этого OCR-проекта мы будем использовать Python-Tesseract или просто PyTesseract , библиотека, которая является оболочкой для движка Google Tesseract-OCR .
Я выбрал этот вариант, потому что он полностью открыт и разрабатывается и поддерживается гигантом Google. Следуйте этим инструкциям , чтобы установить Tesseract на ваш компьютер, так как PyTesseract зависит от него.
Мы также будем использовать Flask web framework для создания нашего простого OCR-сервера, где мы можем делать снимки через веб-камеру или загружать фотографии для целей распознавания символов.
Мы также будем использовать Pipe nv , поскольку он также обрабатывает настройку виртуальной среды и управление требованиями.
Кроме того, мы также будем использовать библиотеку Pillow , которая является вилкой библиотеки Python Imaging Library (PIL) для обработки открытия и манипулирования изображениями во многих форматах в Python.
В этом посте мы сосредоточимся на PyTesseract хотя есть и другие библиотеки Python, которые могут помочь вам извлечь текст из изображений, таких как:
- Extract : который может извлекать данные из PDF-файлов, но является тяжелым пакетом.
- Pyocr : предлагает больше вариантов обнаружения, таких как предложения, цифры или слова.
Установка
Начните с установки Pipenv с помощью следующей команды через Pipe (в случае, если вам нужно настроить его, обратитесь к this ).
$ pip install pipenv
Создайте каталог проекта и инициируйте проект, выполнив следующую команду:
$ mkdir ocr_server && cd ocr_server && pipenv install --three
Теперь мы можем активировать нашу виртуальную среду и начать установку наших зависимостей:
$ pipenv shell $ pipenv install pytesseract Pillow
В случае, если вы не будете использовать Pipenv, вы всегда можете использовать подход Pip и виртуальной среды. Следуйте официальной документации, которая поможет вам начать работу с Pip и виртуальной средой :
Примечание : В этом случае вместо pipenv install Pillow
команда будет pip install Pillow
.
Реализация
Мы собираемся реализовать этот проект в 2 этапа. В первом мы создадим сценарий, а в следующем создадим приложение Flask, которое будет выступать в качестве интерфейса.
OCR Скрипт
Теперь, когда настройка завершена, мы можем создать простую функцию, которая берет изображение и возвращает текст, обнаруженный на изображении, – это будет ядром нашего проекта:
try: from PIL import Image except ImportError: import Image import pytesseract def ocr_core(filename): """ This function will handle the core OCR processing of images. """ text = pytesseract.image_to_string(Image.open(filename)) # We'll use Pillow's Image class to open the image and pytesseract to detect the string in the image return text print(ocr_core('images/ocr_example_1.png'))
Функция довольно проста, в первых 5 строках мы импортируем Изображение
из библиотеки Pillow
и нашей PyTesseract
библиотеки.
Затем мы создаем функцию and ocr_core
, которая принимает имя файла и возвращает текст, содержащийся в изображении.
Давайте посмотрим, как работает скрипт с простым изображением, содержащим некоторый текст:
И после запуска этого фрагмента кода мы встречаемся с этим:
Наш простой OCR-скрипт работает! Очевидно, это было довольно легко, так как это цифровой текст, совершенный и точный, в отличие от рукописного. Есть еще много чего, что мы можем сделать с библиотекой PyTesseract, но об этом позже в этой статье.
Давайте сначала интегрируем этот скрипт в приложение Flask, чтобы упростить загрузку изображений и выполнение операций распознавания символов.
Веб-интерфейс колбы
Наш скрипт можно использовать через командную строку, но приложение Flask сделает его более удобным и универсальным. Например, мы можем загрузить фотографии через веб-сайт и получить извлеченный текст, отображаемый на веб-сайте, или мы можем захватить фотографии с помощью веб-камеры и выполнить распознавание символов на них.
Если вы не знакомы с фреймворком Flask, то это хороший учебник , который поможет вам войти в курс дела.
Давайте начнем с установки пакета Flask:
$ pipenv install Flask
Теперь давайте определим основной маршрут:
from flask import Flask app = Flask(__name__) @app.route('/') def home_page(): return "Hello World!" if __name__ == '__main__': app.run()
Сохраните файл и запустите:
$ python3 app.py
Если вы откроете свой браузер и перейдете на 127.0.0.1:5000
или localhost:5000
, то увидите на странице “Hello World!”. Это означает, что наше приложение Flask готово к следующим шагам.
Теперь мы создадим папку templates
для размещения ваших HTML-файлов. Давайте пойдем дальше и создадим простой index.html
:
Index Hello World.
Давайте также подправим ваш app.py
для рендеринга нашего нового шаблона:
from flask import Flask, render_template app = Flask(__name__) @app.route('/') def home_page(): return render_template('index.html') if __name__ == '__main__': app.run()
Обратите внимание, что теперь мы импортировали render_template
и использовали его для рендеринга HTML-файла. Если вы перезагрузите приложение Flask, вы все равно увидите “Hello World!” на главной странице.
Этого достаточно на ускоренном курсе Flask, давайте теперь интегрируем наш OCR-скрипт в веб-приложение.
Во-первых, мы добавим функциональность для загрузки изображений в наше приложение Flask и передачи их в функцию ocr_core
, которую мы написали выше. Затем мы визуализируем изображение рядом с извлеченным текстом в нашем веб-приложении:
import os from flask import Flask, render_template, request # import our OCR function from ocr_core import ocr_core # define a folder to store and later serve the images UPLOAD_FOLDER = '/static/uploads/' # allow files of a specific type ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg']) app = Flask(__name__) # function to check the file extension def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS # route and function to handle the home page @app.route('/') def home_page(): return render_template('index.html') # route and function to handle the upload page @app.route('/upload', methods=['GET', 'POST']) def upload_page(): if request.method == 'POST': # check if there is a file in the request if 'file' not in request.files: return render_template('upload.html', msg='No file selected') file = request.files['file'] # if no file is selected if file.filename == '': return render_template('upload.html', msg='No file selected') if file and allowed_file(file.filename): # call the OCR function on it extracted_text = ocr_core(file) # extract the text and display it return render_template('upload.html', msg='Successfully processed', extracted_text=extracted_text, img_src=UPLOAD_FOLDER + file.filename) elif request.method == 'GET': return render_template('upload.html') if __name__ == '__main__': app.run()
Как мы видим в нашей функции upload_page ()
, мы получим изображение через POST и визуализируем HTML-код загрузки, если запрос GET .
Мы проверяем, действительно ли пользователь загрузил файл, и используем функцию allowed_file ()
, чтобы проверить, является ли файл приемлемым типом.
Убедившись, что изображение соответствует требуемому типу, мы передаем его в сценарий распознавания символов, созданный ранее.
Функция обнаруживает текст на изображении и возвращает его. Наконец, в ответ на загрузку изображения мы визуализируем обнаруженный текст рядом с изображением, чтобы пользователь мог увидеть результаты.
В upload.html
файл будет обрабатывать размещение изображения и рендеринг результата с помощью Jinja templating engine , который по умолчанию поставляется с Flask:
Upload Image {% if msg %}{{ msg }}
{% endif %}Upload new File
Result:
{% if img_src %} {% endif %} {% if extracted_text %}The extracted text from the image above is: {{ extracted_text }}
{% else %} The extracted text will be displayed here {% endif %}Шаблон Jinja позволяет нам отображать текст в определенных сценариях с помощью тегов {% if %} {% endif %}
. Мы также можем передавать сообщения из вашего приложения Flask для отображения на веб-странице в тегах {{}}
. Мы используем форму для загрузки изображения в наше приложение Flask.
В результате получается:
Теперь, если мы пойдем дальше и загрузим наше изображение с более раннего момента:
Да! Наше приложение Flask смогло интегрировать функциональность OCR и отображать текст в браузере. Это облегчает обработку изображений вместо выполнения команд в CLI каждый раз, когда у нас есть новый образ для обработки.
Давайте приложим еще несколько изображений для дальнейшего изучения пределов нашего сценария SimpleOCR, поскольку он будет работать не во всех ситуациях.
Например, давайте попробуем извлечь текст из следующего изображения, и результат будет выделен на изображении:
Это свидетельствует о том, что OCR не всегда точен на 100% и время от времени может нуждаться в человеческом вмешательстве.
Я также протестировал OCR-скрипт против моего почерка, чтобы посмотреть, как он будет работать, и вот результат:
Как вы можете видеть, он не может полностью извлечь текст из моего почерка, как это было с другими изображениями, которые мы видели раньше. Я решил попробовать еще раз, на этот раз с изображением из этого источника , и вот результаты:
Распознавание символов на этом изображении намного лучше, чем на том, где я использовал свой собственный почерк. Как вы можете видеть, линии на загруженном изображении толще, а контраст между текстом и фоном лучше, и это может быть причиной плохого распознавания моего почерка.
Это область для дальнейшего изучения, вы можете получить рукописные заметки от друзей или коллег и посмотреть, насколько хорошо скрипт сможет распознавать символы. Вы даже можете получить плакаты на мероприятия и попробовать сканировать их на предмет текста, возможностей предостаточно.
Другие варианты PyTesseract
Python-Tesseract имеет больше возможностей, которые вы можете изучить. Например, вы можете указать язык с помощью флага lang
:
pytesseract.image_to_string(Image.open(filename), lang='fra')
Это результат сканирования изображения без флага lang
:
А теперь с флагом lang
:
Фреймворк также оптимизирован для лучшего обнаружения языков, как видно на скриншотах. ( Источник изображения ).
Без флага lang
сценарий пропустил некоторые французские слова, но после введения флага он смог обнаружить все французское содержимое. Перевод невозможен, но это все равно впечатляет. Официальная документация Tesseract включает в себя поддерживаемые языки в этом разделе.
Ориентация и обнаружение скрипта также входят в число возможностей PyTesseract, и это помогает в обнаружении используемых шрифтов и ориентации текста на данном изображении. Если мы можем обратиться к рукописному изображению, которое мы загрузили ранее:
print(pytesseract.image_to_osd(Image.open('downloaded_handwritten.png')))
На изображении не было информации о номере страницы, поэтому это не было обнаружено. Движок Tesseract способен извлекать информацию об ориентации текста на изображении и вращении. Уверенность в ориентации-это показатель уверенности двигателя в обнаруженной ориентации, чтобы действовать как ориентир, а также показать, что она не всегда точна на 100%. Раздел сценария обозначает систему письма, используемую в тексте, и за ней также следует маркер доверия.
Если бы мы следовали за распознанными символами и их границами полей, PyTesseract достигал бы этого через pytesseract.image_to_boxes(Image.open('downloaded_handwritten.png'))
.
Это некоторые из возможностей PyTesseract, среди прочих, такие как преобразование извлеченного текста в PDF-файл с возможностью поиска или вывод HOCR.
Чего мы еще не сделали
Мы многого добились на этом посту, но еще многое предстоит сделать, чтобы усовершенствовать наш проект и подготовить его к реальному миру. Во-первых, мы можем добавить стиль на наш сайт и сделать его более привлекательным для конечного пользователя с помощью CSS. Мы также можем добавить возможность загрузки и сканирования нескольких изображений одновременно и отображения всех их выходных данных одновременно. Разве это не сделает более удобным сканирование нескольких документов?
Браузер позволяет нам подключаться к камере машины и делать снимки, разумеется, с разрешения пользователя. Это может быть очень полезно, особенно на мобильных устройствах. Вместо того чтобы пользователю приходилось захватывать и сохранять изображение, а затем загружать его на веб-сайт, если мы добавим функциональность камеры, мы можем позволить пользователю выполнять операции непосредственно из веб-приложения Flask. Это ускорит процесс сканирования.
Предположим, что приложение Flask-это не то, что вы намеревались предоставить своему OCR-сканеру, вы также можете создать инструмент CLI. Этот инструмент позволит вам выполнить команду, включающую местоположение изображения, а затем распечатать выходные данные сканера на вашем терминале или отправить их в базу данных или API. Если вы выбрали этот путь Docopt – это фантастический инструмент для создания инструментов командной строки с использованием Python.
Вывод
С помощью Tesseract и библиотеки Python-Tesseract мы смогли сканировать изображения и извлекать из них текст. Это оптическое распознавание символов, и оно может быть очень полезно во многих ситуациях.
Мы построили сканер, который берет изображение и возвращает текст, содержащийся в изображении, и интегрировали его в приложение Flask в качестве интерфейса. Это позволяет нам раскрывать функциональность в более привычной среде и таким образом, чтобы она могла служить нескольким людям одновременно.
Исходный код этого проекта доступен здесь, на Github .