Уже довольно давно признанным лидером по распознаванию текста в пользовательском сегменте является Abbyy FineReader. К тому же, она не только позволяет распознавать тексты, но, также и сканировать документы с помощью сканера. Но, речь не о ней. А о том, что в области распознавания текста может предложить Python. Давайте рассмотрим две популярные библиотеки и попробуем сравнить качество распознавания.
Если честно, то узнав, как давно разрабатывалась первоначальная версия Tesseract OCR, я был удивлен. Ее разработка велась с середины 80-х по середину 90-х годов компанией Hewlett-Packard. После была благополучно забыта аж на целых 10 лет. В 2006 году была выкуплена Google, а ее исходные тексты стали открыты для разработчиков. И, дело сдвинулось с мертвой точки. В настоящий момент существует версия 5.0, которая уже очень далеко ушла от своей библиотеки-прародительницы.
Разработка EasyOCR была представлена общественности 24 июля 2020 года. Так что, в отличие от Tesseract, эта библиотека очень молодая, но, тем не менее, подающая большие надежды. Для распознавания доступны более 40 языков, а код написан на Python с использованием фреймворка PyTorch.
Что понадобиться?
Установить easyocr. Библиотека довольно большая и в процессе установки подгружает необходимые для работы зависимости. Поэтому будьте готовы к тому, что установка займет продолжительное время. Впрочем, здесь все зависит от скорости вашего интернета и мощности компьютера. Для установки пишем в терминале:
И еще, после первого запуска она не заработает сразу же, а для начала выкачает необходимые для работы модели распознавания.
Затем установим Pillow. С его помощью мы будем открывать картинки для загрузки в tesseract.
А теперь нужно установить Tesseract OCR. Если у вас операционная система Windows, то в коде нужно будет прописывать на строчку кода больше. Установка библиотеки подробно описана
После установки основной библиотеки нужно установить модуль для Python. Пишем в терминале:
И наконец, когда уже все будет установлено, импортируем необходимые модули в скрипт:
Если вы используете ОС Windows, вам нужно будет дополнительно прописать вот такую конструкцию:
где указывается путь к исполняемому файлу.
Функция для сканирования изображения с помощью tesseract
Давайте создадим функцию для распознавания текста на изображении с помощью tesseract. Я назову ее teseract_recognition(path_img), и на входе она принимает всего лишь один параметр, это путь к файлу изображения.
Здесь, с помощью функции image_to_string распознается изображение. Оно принимает, в данном случае следующие параметры:
- Изображение для распознавания. Здесь мы сразу же открываем изображение с помощью функции Image, куда передается путь к файлу.
- Язык распознавания. В данном случае указан русский + английский. В зависимости от ваших потребностей можете установить какой-то один язык.
- Конфиг. Первый параметр, это OCR Engine Mode, режим работы «движка» для распознавания. Оставим его без изменений. А вот с psm можно поэкспериментировать. psm – это page segmentation mode, то есть режим сегментации страниц. Чуть более подробно про значения данного режима можно
И возвращаем распознанный текст туда, откуда он был вызван. По сути, в простейшем варианте, весь код уместился в двух строчках кода. А если убрать объявление функции, то уместиться и в одной.
Функция распознавания текста с помощью easyocr
Теперь давайте сделаем функцию, которая также будет распознавать текст, но уже с помощью другой библиотеки. Создадим функцию easyocr_recognition(path_img). Здесь на вход принимается только путь к файлу с изображением.
Создадим объект easyocr.Reader, в который передадим список с языками для распознавания. В нашем случае это русский. Можно указать английский и многие другие. Соответственно, если вам еще нужен один язык, укажите его обозначение через запятую. Затем вызываем функцию readtext, в которую передаем следующие параметры:
- Путь к файлу с изображением;
- Детализация. По умолчанию данный параметр равен 1 и выводит на экран, помимо текста, еще и параметры отступов и прочую служебную информацию, а также порог достоверности текста, который по умолчанию равен 0.7;
- Автоматическое разбиение текста на параграфы. В противном случае текст выводиться по словам;
- Порог достоверности текста.
Как видите, здесь также в простом варианте все уложилось в две строчки.
На самом деле, это пример не особо хорошего кода )) Не делайте так. Желательно разделить функции, хотя бы для того, чтобы ваш код можно было удобно читать. И если здесь такая строка одна, то представьте, что будет, если таких строк сотни.
Функция сохранения текста в файл
Создадим функцию сохранения распознанного текста в файл. Я назвал ее save_text(text, name). На входе она принимает текст для сохранения и название для файла с текстом.
Ну, а дальше сохраняется текст и выводиться сообщение об успешном завершении.
Ну и функция main().
Для начала запрашиваем у пользователя путь к картинке с текстом. Проверяем, существует ли файл. Думаю, что надо было бы добавить еще проверку на расширение, но в данном контексте оно излишне. И дальше предоставляем пользователю выбор, с помощью какой из библиотек он желал бы распознать текст. После чего в зависимости от выбора запускается функция, отрабатывает и распознанный текст сохраняется в файл.
Впечатления и выводы
Были опробованы обе библиотеки на разных русских текстах. В сводном виде они ниже на скриншоте:
Ну и дальше результаты:
Изображение 01:
Tesseract:
EasyOCR:
Изображение 02:
Tesseract:
EasyOCR:
Изображение 03:
Tesseract:
EasyOCR:
Изображение 04:
Tesseract:
EasyOCR:
Здесь могу сказать, что может быть у меня не оптимальные настройки. Допускаю, но в данном случае tesseract справился лучше. Причем, скорость его работы намного выше, чем easyocr. Быть может, тут сыграл значение один немаловажный фактор, что данная библиотека использует технологию CUDA, а на моем компьютере графика ее не поддерживает. И если бы она была, все работало бы быстрее. Но, что имеем, то имеем. И easyocr распознавал текст долго и зачастую не совсем верно.
Думаю, что его можно использовать, если оптимизировать скорость работы, для распознавания нужного текста. К примеру, для поиска определенного номера машины на фото. Это как заявлено у них в документации. Кстати, попробовал номер. И да, распознался более качественно, чем tesseract.
Спасибо за внимание. Надеюсь, что данная информация будет вам полезна
Если честно, то узнав, как давно разрабатывалась первоначальная версия Tesseract OCR, я был удивлен. Ее разработка велась с середины 80-х по середину 90-х годов компанией Hewlett-Packard. После была благополучно забыта аж на целых 10 лет. В 2006 году была выкуплена Google, а ее исходные тексты стали открыты для разработчиков. И, дело сдвинулось с мертвой точки. В настоящий момент существует версия 5.0, которая уже очень далеко ушла от своей библиотеки-прародительницы.
Разработка EasyOCR была представлена общественности 24 июля 2020 года. Так что, в отличие от Tesseract, эта библиотека очень молодая, но, тем не менее, подающая большие надежды. Для распознавания доступны более 40 языков, а код написан на Python с использованием фреймворка PyTorch.
Что понадобиться?
Установить easyocr. Библиотека довольно большая и в процессе установки подгружает необходимые для работы зависимости. Поэтому будьте готовы к тому, что установка займет продолжительное время. Впрочем, здесь все зависит от скорости вашего интернета и мощности компьютера. Для установки пишем в терминале:
pip install easyocr
И еще, после первого запуска она не заработает сразу же, а для начала выкачает необходимые для работы модели распознавания.
Затем установим Pillow. С его помощью мы будем открывать картинки для загрузки в tesseract.
pip install Pillow
А теперь нужно установить Tesseract OCR. Если у вас операционная система Windows, то в коде нужно будет прописывать на строчку кода больше. Установка библиотеки подробно описана
Ссылка скрыта от гостей
. При установке в Windows будьте внимательны и выберите нужные вам языки распознавания в инсталляторе. В Linux и Mac дополнительные языки скачиваются вот с
Ссылка скрыта от гостей
, после чего скачанный файл кладется в папку с tesseract.После установки основной библиотеки нужно установить модуль для Python. Пишем в терминале:
pip install pytesseract
И наконец, когда уже все будет установлено, импортируем необходимые модули в скрипт:
Python:
import os.path
import easyocr
import pytesseract
from PIL import Image
Если вы используете ОС Windows, вам нужно будет дополнительно прописать вот такую конструкцию:
Python:
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
где указывается путь к исполняемому файлу.
Функция для сканирования изображения с помощью tesseract
Давайте создадим функцию для распознавания текста на изображении с помощью tesseract. Я назову ее teseract_recognition(path_img), и на входе она принимает всего лишь один параметр, это путь к файлу изображения.
Python:
def teseract_recognition(path_img):
return pytesseract.image_to_string(Image.open(path_img), lang='rus+eng', config=r'--oem 3 --psm 6')
Здесь, с помощью функции image_to_string распознается изображение. Оно принимает, в данном случае следующие параметры:
- Изображение для распознавания. Здесь мы сразу же открываем изображение с помощью функции Image, куда передается путь к файлу.
- Язык распознавания. В данном случае указан русский + английский. В зависимости от ваших потребностей можете установить какой-то один язык.
- Конфиг. Первый параметр, это OCR Engine Mode, режим работы «движка» для распознавания. Оставим его без изменений. А вот с psm можно поэкспериментировать. psm – это page segmentation mode, то есть режим сегментации страниц. Чуть более подробно про значения данного режима можно
Ссылка скрыта от гостей
.И возвращаем распознанный текст туда, откуда он был вызван. По сути, в простейшем варианте, весь код уместился в двух строчках кода. А если убрать объявление функции, то уместиться и в одной.
Функция распознавания текста с помощью easyocr
Теперь давайте сделаем функцию, которая также будет распознавать текст, но уже с помощью другой библиотеки. Создадим функцию easyocr_recognition(path_img). Здесь на вход принимается только путь к файлу с изображением.
Python:
def easyocr_recognition(path_img):
return easyocr.Reader(["ru"]).readtext(path_img, detail=0, paragraph=True, text_threshold=0.8)
Создадим объект easyocr.Reader, в который передадим список с языками для распознавания. В нашем случае это русский. Можно указать английский и многие другие. Соответственно, если вам еще нужен один язык, укажите его обозначение через запятую. Затем вызываем функцию readtext, в которую передаем следующие параметры:
- Путь к файлу с изображением;
- Детализация. По умолчанию данный параметр равен 1 и выводит на экран, помимо текста, еще и параметры отступов и прочую служебную информацию, а также порог достоверности текста, который по умолчанию равен 0.7;
- Автоматическое разбиение текста на параграфы. В противном случае текст выводиться по словам;
- Порог достоверности текста.
Как видите, здесь также в простом варианте все уложилось в две строчки.
На самом деле, это пример не особо хорошего кода )) Не делайте так. Желательно разделить функции, хотя бы для того, чтобы ваш код можно было удобно читать. И если здесь такая строка одна, то представьте, что будет, если таких строк сотни.
Функция сохранения текста в файл
Создадим функцию сохранения распознанного текста в файл. Я назвал ее save_text(text, name). На входе она принимает текст для сохранения и название для файла с текстом.
Python:
def save_text(text, name):
with open(f'{name}.txt', 'w', encoding='utf-8') as file:
file.write(text)
print(f'[+] Распознанный текст сохранен в файл: "{name}.txt"')
main()
return
Ну, а дальше сохраняется текст и выводиться сообщение об успешном завершении.
Ну и функция main().
Python:
def main():
path_img = input('\n[+] Введите путь к картинке\n - Для выхода введите x\n >>> ')
if path_img == "x":
exit(0)
if not os.path.exists(path_img):
print('[+] Картинки не существует')
user_change = input('\n[+] Выберите библиотеку для распознавания текста:\n [1] Tesseract OCR\n '
'[2] EasyOCR\n [3] Выход\n >>> ')
if user_change == "1":
save_text(teseract_recognition(path_img), os.path.split(path_img)[1].split(".")[0])
elif user_change == '2':
save_text(easyocr_recognition(path_img), os.path.split(path_img)[1].split(".")[0])
elif user_change == "3":
exit(0)
else:
print('[+] Неопознанный ввод. Повторите все сначала')
main()
Для начала запрашиваем у пользователя путь к картинке с текстом. Проверяем, существует ли файл. Думаю, что надо было бы добавить еще проверку на расширение, но в данном контексте оно излишне. И дальше предоставляем пользователю выбор, с помощью какой из библиотек он желал бы распознать текст. После чего в зависимости от выбора запускается функция, отрабатывает и распознанный текст сохраняется в файл.
Python:
# pip install easyocr
# pip install pytesseract
# pip install Pillow
import os.path
import easyocr
import pytesseract
from PIL import Image
# путь к исполняемому файлу tesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
# распозавание с помощью pytesseract, открытие картинки PIL.Image
def teseract_recognition(path_img):
return pytesseract.image_to_string(Image.open(path_img), lang='rus+eng', config=r'--oem 3 --psm 6')
# распознавание с помощью easyocr, параметры: отключена детализация вывода,
# включены параграфы и установлена точность текста
def easyocr_recognition(path_img):
return easyocr.Reader(["ru"]).readtext(path_img, detail=0, paragraph=True, text_threshold=0.8)
# сохранение текста в текстовый файл
def save_text(text, name):
with open(f'{name}.txt', 'w', encoding='utf-8') as file:
file.write(text)
print(f'[+] Распознанный текст сохранен в файл: "{name}.txt"')
main()
return
# ввод данных и выбор библиотеки для распознавания
def main():
path_img = input('\n[+] Введите путь к картинке\n - Для выхода введите x\n >>> ')
if path_img == "x":
exit(0)
if not os.path.exists(path_img):
print('[+] Картинки не существует')
user_change = input('\n[+] Выберите библиотеку для распознавания текста:\n [1] Tesseract OCR\n '
'[2] EasyOCR\n [3] Выход\n >>> ')
if user_change == "1":
save_text(teseract_recognition(path_img), os.path.split(path_img)[1].split(".")[0])
elif user_change == '2':
save_text(easyocr_recognition(path_img), os.path.split(path_img)[1].split(".")[0])
elif user_change == "3":
exit(0)
else:
print('[+] Неопознанный ввод. Повторите все сначала')
main()
if __name__ == "__main__":
main()
Впечатления и выводы
Были опробованы обе библиотеки на разных русских текстах. В сводном виде они ниже на скриншоте:
Ну и дальше результаты:
Изображение 01:
Tesseract:
EasyOCR:
Изображение 02:
Tesseract:
EasyOCR:
Изображение 03:
Tesseract:
EasyOCR:
Изображение 04:
Tesseract:
EasyOCR:
Здесь могу сказать, что может быть у меня не оптимальные настройки. Допускаю, но в данном случае tesseract справился лучше. Причем, скорость его работы намного выше, чем easyocr. Быть может, тут сыграл значение один немаловажный фактор, что данная библиотека использует технологию CUDA, а на моем компьютере графика ее не поддерживает. И если бы она была, все работало бы быстрее. Но, что имеем, то имеем. И easyocr распознавал текст долго и зачастую не совсем верно.
Думаю, что его можно использовать, если оптимизировать скорость работы, для распознавания нужного текста. К примеру, для поиска определенного номера машины на фото. Это как заявлено у них в документации. Кстати, попробовал номер. И да, распознался более качественно, чем tesseract.
Спасибо за внимание. Надеюсь, что данная информация будет вам полезна
Последнее редактирование: