Computer vision, Machine Learning, Python

Анализ изображения с помощью фреймворка Easyocr

Время прочтения: 3 мин.

Сама модель распознавания состоит из 3 основных компонентов:

  1. Извлечение признаков(resnet)
  2. Маркировка последовательности (LSTM)
  3. Декодирование (CTC)
Рис.1

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

Далее я разберу пример работы данного фреймворка на простом примере извлечения текста из изображения.

Для запуска необходимо установить torch

!pip install torch torchvision

 Easyocr

!pip install easyocr

И импортировать его

import easyocr

Для начала анализа изображения нужно загрузить модель чтения для определенных языков в память

reader = easyocr.Reader(['en','ru'], gpu = True)

После этого делаем ссылку на файл данные с которого хотим прочитать. Для данной демонстрации я использовал изображение в формате jfif и jpg, но фреймворк также поддерживает и png.

bounds = reader.readtext('image.jfif')
Print(bounds)

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

[([[241, 24], [801, 24], [801, 67], [241, 67]], 'САМАРСКий нАционАльный', 0.03654395043849945),
 ([[172, 57], [865, 57], [865, 101], [172, 101]], 'исследовательский университет', 0.2935549318790436),
 ([[184, 95], [866, 95], [866, 144], [184, 144]], 'ИМЕНИ АКАДЕМИКАС П. КоролёвА', 0.014805505983531475), 
([[790, 452], [824, 452], [824, 458], [790, 458]], '1461829', 1.0422037455271038e-08)]
Рис.2

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

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

import PIL
im = PIL.Image.open('image.jfif')

def  draw_boxes(image,bounds,color='yellow',width=2):
 	   draw = ImageDraw.Draw(image)
 	    for bound in bounds:
     			   p0, p1, p2, p3 = bound[0]
        			draw.line([*p0,*p1,*p2,*p3,*p0], fill=color,width=width)
    	  return image.show()
draw_boxes(im,bounds)
Рис.3

Что меня порадовало в данном фреймворке? Он довольно неплохо воспринимает записи под углом, как в данном случае.

Рис.4
[([[9.922678669848631, 103.19792908321288], [254.75835768399057, -17.79794114156195], [288.0773213301514, 72.80207091678712], [43.24164231600943, 194.79794114156195]], 'ЧУДЕСА', 0.48184075951576233)]

При работе с данным фреймворком довольно важно качество анализируемого изображения, т.к., в противном случае, не исключены ошибки в анализе и опечатки. Из довольно частых ошибок, которые я встречал, это ошибочная подстановка буквы Д вместо А или же наоборот. На мой взгляд данный фреймворк не очень подходит для работы с документацией или с изображениями с объемным текстом, скорее это оцифровка каких-то небольших фрагментов изображения, таких как машинные номера, дорожные знаки, содержащие текст, маркировка и тому подобное. 

Ссылка разработчика на github: https://github.com/JaidedAI/EasyOCR

Советуем почитать