При использовании Tesseract для распознавания текстов в изображениях часто допускаются ошибки в выборе режима сегментации страниц, либо вообще не делается выбор, а используется режим по умолчанию, что сильно снижает качество распознавания. Давайте разберемся, что же это такое PSM Tesseract, как выбрать нужный режим и когда использовать каждый из этих режимов, чтобы получить максимальный результат.
Чтобы получить полный список режимов необходимо выполнить команду tesseract –help-psm. Результатом будет список из 14 режимов с их кратким описанием::
$ tesseract --help-psm
Page segmentation modes:
0 Orientation and script detection (OSD) only.
1 Automatic page segmentation with OSD.
2 Automatic page segmentation, but no OSD, or OCR. (not implemented)
3 Fully automatic page segmentation, but no OSD. (Default)
4 Assume a single column of text of variable sizes.
5 Assume a single uniform block of vertically aligned text.
6 Assume a single uniform block of text.
7 Treat the image as a single text line.
8 Treat the image as a single word.
9 Treat the image as a single word in a circle.
10 Treat the image as a single character.
11 Sparse text. Find as much text as possible in no particular order.
12 Sparse text with OSD.
13 Raw line. Treat the image as a single text line,
bypassing hacks that are Tesseract-specific.
Вы можете применить необходимый режим PSM, указав соответствующее значение в аргументе –psm.
Например, предположим, что у нас есть входное изображение с именем input.png и мы хотим использовать PSM 7, который используется для распознания одиночной текстовой строки. Таким образом, наш вызов tesseract будет выглядеть следующим образом:
$ tesseract input.png stdout --psm 7
Разберем каждый из режимов PSM и посмотрим какие входные данные от ожидает и какой вывод дает.
PSM 0. Определение ориентации (Orientation and script detection (OSD) only)
Режим --psm 0 не выполняет распознания документа Система определения ориентации изучает входное изображение, но вместо того, чтобы возвращать реальный текст OCR, OSD возвращает два значения:
- Как ориентирована страница, в градусах, где угол = {0, 90, 180, 270}.
- Тип шрифта (т. е. графических знаков/системы письма), например, латиница, хань, кириллица и т. д.
Лучше всего OSD видно на примере. На рисунке представлены три примера изображений. Первое - это абзац текста. Второе - тот же абзац текста, но повернутый на 90◦ по часовой стрелке, а последнее изображение содержит иероглифы.
Давайте посмотрим на вывод, если скормить tesseract-у первое изображение, с нормальным текстом:
$ tesseract normal.png stdout --psm 0
Page number: 0
Orientation in degrees: 0
Rotate: 0
Orientation confidence: 11.34
Script: Latin
Script confidence: 8.10
Tesseract определил, что это входное изображение не повернуто (т. е. 0◦) и что шрифт распознан как латинский.
Теперь на очереди текст, повернутый на 90◦.
$ tesseract rotated_90.png stdout --psm 0
Page number: 0
Orientation in degrees: 90
Rotate: 270
Orientation confidence: 5.49
Script: Latin
Script confidence: 4.76
Tesseract определил, что входное изображение было повернуто на 90◦, и для того, чтобы исправить его, нужно повернуть его на 270◦. И шрифт распознается как латинский.
Усложним задачу.
$ tesseract han_script.jpg stdout --psm 0
Page number: 0
Orientation in degrees: 0
Rotate: 0
Orientation confidence: 2.94
Script: Han
Script confidence: 1.43
Tesseract определил, что входное изображение содержит текст на китайском (ханьском) языке.
Режим --psm 0 можно рассматривать как режим “метаинформации”, в котором Tesseract предоставляет вам язык, на котором составлен текст, и поворот входного изображения - при применении этого режима Tesseract не распознает текст и не возвращает его вам.
PSM 1. Автоматическая сегментация страниц с распознанием (Automatic page segmentation with OSD)
Документация плохо описывает режим –psm 1, предполагается, что tesseract сам принимает решение в том, как распознается текст, главное выдать результат.
$ tesseract example.png stdout --psm 1
Our last argument is how we want to approximate the
contour. We use cv2.CHAIN_APPROX_SIMPLE to compress
horizontal, vertical, and diagonal segments into their end-
points only. This saves both computation and memory. If
we wanted all the points along the contour, without com-
pression, we can pass in cv2. CHAIN_APPROX_NONE; however,
be very sparing when using this function. Retrieving all
points along a contour is often unnecessary and is wasteful
of resources.
Все эксперименты показывали, что результат, которые дает этот режим не на много лучше, а порой хуже, чем все остальные режимы.
PSM 2. Автоматическая сегментация страниц, но без распознания
Тут все просто, tesseract сам говорит, что этот режим не реализован.
$ tesseract --help-psm
Page segmentation modes:
...
2 Automatic page segmentation, but no OSD, or OCR. (not implemented)
...
PSM 3. Полностью автоматическая сегментация страниц (Fully Automatic Page Segmentation, But No OSD)
Это режим работы по умолчанию, если вы запустите tesseract без параметра psm, то будет выбран этот режим.
В этом режиме tesseract:
- автоматически попытается сегментировать текст, рассматривая его как “страницу” текста с несколькими словами, несколькими строками, несколькими абзацами и т. д.
- после сегментации Tesseract распознает текст и вернет его вам.
Однако важно отметить, что tesseract не будет выполнять определение ориентации/шрифта. Чтобы получить эту информацию, вам нужно запустить tesseract дважды:
- один раз с режимом --psm 0, чтобы собрать информацию.
- а затем еще раз с режимом --psm 3 для распознавания фактического текста.
$ tesseract example.png stdout --psm 0
Page number: 0
Orientation in degrees: 0
Rotate: 0
Orientation confidence: 11.34
Script: Latin
Script confidence: 8.10
$ tesseract example.png stdout --psm 3
Our last argument is how we want to approximate the
contour. We use cv2.CHAIN_APPROX_SIMPLE to compress
horizontal, vertical, and diagonal segments into their end-
points only. This saves both computation and memory. If
we wanted all the points along the contour, without com-
pression, we can pass in cv2. CHAIN_APPROX_NONE; however,
be very sparing when using this function. Retrieving all
points along a contour is often unnecessary and is wasteful
of resources.
PSM 4. Предполагается наличие одного столбца текста переменного размера (Assume a Single Column of Text of Variable Sizes)
Хорошим примером использования --psm 4 является ситуация, когда вам нужно распознать данные в столбце и требуется объединить текст в строку (например, данные, которые можно найти в электронной таблице, таблице или чеке).
Например, на рисунке показан чек из продуктового магазина. Попробуем распознать это изображение, используя режим по умолчанию (--psm 3):
$ tesseract receipt.png stdout
ee
OLE
YOSDS:
cea eam
WHOLE FOODS MARKET - WESTPORT,CT 06880
399 POST RD WEST - (203) 227-6858
365
365
365
365
BACON LS
BACON LS
BACON LS
BACON LS
BROTH CHIC
FLOUR ALMOND
CHKN BRST BNLSS SK
HEAVY CREAM
BALSMC REDUCT
BEEF GRND 85/15
JUICE COF CASHEW C
DOCS PINT ORGANIC
HNY ALMOND BUTTER
wee TAX
.00
BAL
NP 4.99
NP 4.99
NP 4.99
NP 4.99
NP 2.19
NP 91.99
NP 18.80
NP 3.39
NP. 6.49
NP 5.04
ne £8.99
np £14.49
NP 9.99
101.33
aaa AAAATAT
ie
Не самый лучший результат. Используя стандартный режим --psm 3, tesseract не может сделать вывод о том, что мы рассматриваем данные в столбцах и что текст, расположенный в одной строке, должен быть связан вместе.
Чтобы решить эту проблему, мы можем использовать режим --psm 4:
$ tesseract receipt.png stdout --psm 4
WHOLE
FOODS.
cea eam
WHOLE FOODS MARKET - WESTPORT,CT 06880
399 POST RD WEST - (203) 227-6858
365 BACONLS NP 4.99
365 BACON LS NP 4.99
365 BACONLS NP 4.99
365 BACONLS NP 4,99
BROTH CHIC NP 2.19
FLOUR ALMOND NP 91.99
CHKN BRST BNLSS SK NP 18.80
HEAVY CREAM NP 3.39
BALSMC REDUCT NP 6.49
BEEF GRND 85/15 NP 6.04
JUICE COF CASHEW C NP £8.99
DOCS PINT ORGANIC NP 14,49
HNY ALMOND BUTTER NP 9,99
wee TAX = 00 BAL 101.33
Гораздо лучше. Tesseract понимает, что текст должен быть сгруппирован по строкам, что позволяет нам распознавать элементы в чеке.
PSM 5. Предполагается, что имеется один однородный блок вертикально выровненного текста (Assume a Single Uniform Block of Vertically Aligned Text)
Документация, связанная с --psm 5, говорит, что мы хотим распознать один блок вертикально выровненного текста. Проблема в том, что существует некоторая двусмысленность относительно того, что на самом деле означает “вертикально выровненный текст” (поскольку в tesseract нет примера вертикально выровненного текста).
На мой взгляд, вертикально выровненный текст располагается либо вверху страницы, либо в центре страницы, либо внизу страницы. На рисунке приведен пример текста, выровненного сверху (слева), посередине (в центре) и снизу (справа).
Для эксперимента возьмем чек и повернем его на 90◦.
Для начала попробуем режим по умлочанию -–psm 3:
$ tesseract receipt_rotated.png stdout
WHOLE
FOODS.
(mM AR K E T)
WHOLE FOODS MARKET - WESTPORT,CT 06880
399 POST RD WEST - (203) 227-6858
365 BACON LS
365 BACON LS
365 BACON LS
365 BACON LS
BROTH CHIC
FLOUR ALMOND
CHKN BRST BNLSS SK
HEAVY CREAM
BALSMC REDUCT
BEEF GRND 85/15
JUICE COF CASHEW C
DOCS PINT ORGANIC
HNY ALMOND BUTTER
eee TAX =.00 BAL
ee
NP 4.99
NP 4.99
NP 4,99
NP 4.99
NP 2.19
NP 1.99
NP 18.80
NP 3.39
NP 6.49
NP 8.04
NP £8.99
np "14.49
NP 9.99
101.33
aAnMAIATAAT AAA ATAT
ie
Результат не радует несмотря на то, что tesseract может корректировать вращение, у нас нет элементов квитанции, расположенных в ряд.
Теперь режим --psm 5:
$ tesseract receipt_rotated.png stdout --psm 5
Cea a amD
WHOLE FOODS MARKET - WESTPORT, CT 06880
399 POST RD WEST - (203) 227-6858
* 365 BACONLS NP 4.99 F
* 365 BACON LS NP 4.99 F
* 365 BACONLS NP 4,99 F*
* 365 BACONLS NP 4.99 F
* BROTH CHIC NP 2.19 F
* FLOUR ALMOND NP 1.99 F
* CHKN BRST BNLSS SK NP 18.80 F
* HEAVY CREAM NP 3.39 F
* BALSMC REDUCT NP 6.49 F
* BEEF GRND 85/1§ NP {6.04 F
* JUICE COF CASHEW C NP [2.99 F
*, DOCS PINT ORGANIC NP "14.49 F
* HNY ALMOND BUTTER NP 9,99
wee TAX = 00 BAL 101.33
Очень хороший результат.
PSM 6. Предполагается, что текст является единым блоком (Assume a Single Uniform Block of Text)
Этот режим очень хорошо работает на простых страницах с однородным текстом, выполненным одним шрифтом, без каких-либо вариаций. На пример страница романа.
Смотрим режим по умолчанию --psm 3:
$ tesseract sherlock_holmes.png stdout
CHAPTER ONE
we
Mr. Sherlock Holmes
M: Sherlock Holmes, who was usually very late in the morn-
ings, save upon those not infrequent occasions when he
was up all night, was seated at the breakfast table. I stood upon
the hearth-rug and picked up the stick which our visitor had left
behind him the night before. It was a fine, thick piece of wood,
bulbous-headed, of the sort which is known as a “Penang lawyer.”
Just under the head was a broad silver band nearly an inch across.
“To James Mortimer, M.R.C.S., from his friends of the C.C.H.,”
was engraved upon it, with the date “1884.” It was just such a
stick as the old-fashioned family practitioner used to carry--dig-
nified, solid, and reassuring.
“Well, Watson, what do you make of it2”
Holmes w:
sitting with his back to me, and I had given him no
sign of my occupation.
“How did you know what I was doing? I believe you have eyes in
the back of your head.”
“L have, at least, a well-polished, silver-plated coffee-pot in front
of me,” said he. “But, tell me, Watson, what do you make of our
visitor's stick? Since we have been so unfortunate as to miss him
and have no notion of his errand, this
accidental souvenir be-
comes of importance, Let me hear you reconstruct the man by an
examination of it.”
Вроде и результат не плохой, но… Текст рваный, очень много лишних разрывов строк.
Теперь выберем режим --psm 6 и сравним результат:
$ tesseract sherlock_holmes.png stdout --psm 6
CHAPTER ONE
SS
Mr. Sherlock Holmes
M Sherlock Holmes, who was usually very late in the morn
ings, save upon those not infrequent occasions when he
was up all night, was seated at the breakfast table. I stood upon
the hearth-rug and picked up the stick which our visitor had left
behind him the night before. It was a fine, thick piece of wood,
bulbous-headed, of the sort which is known as a “Penang lawyer.”
Just under the head was a broad silver band nearly an inch across.
“To James Mortimer, M.R.C.S., from his friends of the C.C.H.,”
was engraved upon it, with the date “1884.” It was just such a
stick as the old-fashioned family practitioner used to carry--dig-
nified, solid, and reassuring.
“Well, Watson, what do you make of it2”
Holmes was sitting with his back to me, and I had given him no
sign of my occupation.
“How did you know what I was doing? I believe you have eyes in
the back of your head.”
“T have, at least, a well-polished, silver-plated coflee-pot in front
of me,” said he. “But, tell me, Watson, what do you make of our
visitor’s stick? Since we have been so unfortunate as to miss him
and have no notion of his errand, this accidental souvenir be-
comes of importance. Let me hear you reconstruct the man by an
examination of it.”
6
Гораздо меньше ошибок, текст собран в единые блоки.
PSM 7. Рассматривает изображение как одну текстовую строку (Treat the Image as a Single Text Line)
Режим --psm 7 следует использовать, когда вы работаете с одной строкой однородного текста.
Например, предположим, что мы создаем систему автоматического распознавания номерных знаков (ANPR) и нам нужно распознать номерной знак на рисунке.
Для начала пробуем режим по умолчанию --psm 3:
$ tesseract license_plate.png stdout
Estimating resolution as 288
Empty page!!
Estimating resolution as 288
Empty page!!
Результат нулевой, tesseract не нашел ничего.
Теперь пробуем режим одиночной строки –psm 7:
$ tesseract license_plate.png stdout --psm 7
MHOZDW8351
Результат!
PSM 8. Рассматривает изображение как одно слово (Treat the Image as a Single Word)
В этом режиме происходит поиск одиночного блока текста в изображении, на пример витрина магазина:
Пробуем режим по умолчанию --psm 3:
$ tesseract designer.png stdout
MS atts
Получили тарабарщину.
Попробуем режим сегментации, рассматривающий изображение как одно слово --psm 8:
$ tesseract designer.png stdout --psm 8
Designer
Режимы --psm 7 и --psm 8 очень похожи, по этому только тесты с одним и другим помогут сделать окончательный выбор между ними.
PSM 9. Одно слово в круге (Treat the Image as a Single Word in a Circle)
Еще один очень странный режим, можно предположить, что он нацелен на изображения вида:
- текст находится внутри круга (слева).
- текст обернут вокруг невидимой круговой/дуговой области (справа).
Второй вариант больше подходит, но все тесты с этим режимом сегментации не дали каких-то стабильных результатов.
PSM 10. Обработка изображения как одного символа (Treat the Image as a Single Character)
Обработка изображения как одного символа должна выполняться, когда вы уже извлекли из изображения каждый отдельный символ.
Возвращаясь к нашему примеру с распознанием автомобильных номеров (ANPR), скажем, что вы нашли номерной знак на входном изображении и затем извлекли каждый отдельный символ на номерном знаке - вы можете пропустить каждый из этих символов через Tesseract с параметром --psm 10 для их распознания.
Пробуем режим по умолчанию --psm 3:
$ tesseract number.png stdout
Estimating resolution as 1388
Empty page!!
Estimating resolution as 1388
Empty page!!
Tesseract пытается применить методы автоматической сегментации страниц, но из-за отсутствия реальной “страницы” текста стандартный параметр --psm 3 не срабатывает и возвращает пустую строку.
Проблему можно решить, рассматривая входное изображение как один символ с помощью режима --psm 10:
$ tesseract number.png stdout --psm 10
2
PSM 11. Разрозненный текст: поиск как можно больше текста без определенного порядка (Sparse Text: Find as Much Text as Possible in No Particular Order)
Обнаружение разреженного текста может быть полезно, когда на изображении много текста, который нужно извлечь. При использовании этого режима вам, как правило, важен не порядок/группировка текста, а сам текст.
Эта информация полезна, если вы занимаетесь информационным поиском (т. е. системой поиска по тексту), распознавая весь текст, который можно найти в наборе изображений, а затем создавая систему поиска по тексту с помощью алгоритмов информационного поиска (tf-idf, инвертированные индексы и т. д.).
На рисунке показан пример разреженного текста. Здесь мы видим скриншот со страницы “Начало работы” на PyImageSearch. На этой странице представлены учебники, сгруппированные по популярным темам компьютерного зрения, глубокого обучения и OpenCV.
Пробуем режим по умолчанию --psm 3:
$ tesseract website_menu.png stdout
How Do | Get Started?
Deep Learning
Face Applications
Optical Character Recognition (OCR)
Object Detection
Object Tracking
Instance Segmentation and Semantic
Segmentation
Embedded and lol Computer Vision
Computer Vision on the Raspberry Pi
Medical Computer Vision
Working with Video
Image Search Engines
Interviews, Case Studies, and Success Stories
My Books and Courses
Хотя Tesseract может распознать текст, в нем есть несколько неправильных группировок строк и дополнительные пробельные символы. Дополнительные пробельные символы и новые строки являются результатом работы алгоритма автоматической сегментации страниц tesseract - в данном случае он пытается вывести структуру документа, хотя на самом деле структуры документа нет.
Чтобы обойти эту проблему, мы можем рассматривать входное изображение как разреженный текст с помощью режима --psm 11:
$ tesseract website_menu.png stdout --psm 11
How Do | Get Started?
Deep Learning
Face Applications
Optical Character Recognition (OCR)
Object Detection
Object Tracking
Instance Segmentation and Semantic
Segmentation
Embedded and lol Computer Vision
Computer Vision on the Raspberry Pi
Medical Computer Vision
Working with Video
Image Search Engines
Interviews, Case Studies, and Success Stories
My Books and Courses
На этот раз результат на много лучше.
PSM 12. Разреженный текст с мета информацией (Sparse Text with OSD)
Режим -–psm 12 по сути идентичен -–psm 11, но теперь добавляет метаинформацию об ориентации и шрифте документа (аналогично -–psm 0).
На практике не получилось заменить комбинации --psm 0 + --psm 11 одним вызовом в режиме --psm 12 и получить схожий результат.
PSM 13. Сырая строка: Изображение рассматривается как одна текстовая строка, обходя хаки, специфичные для Tesseract (Raw Line: Treat the Image as a Single Text Line, Bypassing Hacks That Are Tesseract-Specific)
Бывают случаи, когда определение метаинформации, сегментация и другие внутренние методы предварительной обработки, специфичные для tesseract, снижают производительность распознания, либо вообще приводят к нулевому результату.
Обычно это происходит, если фрагмент текста сильно обрезан, текст сгенерирован/стилизован каким-либо способом, или это шрифт, который tesseract не может распознать автоматически. В этом случае используйте --psm 13 в качестве “последнего средства”.
Возьмем изображение с текстом, стилизованным под заголовок старой газеты.
Попробуем режим по умолчанию --psm 3:
$ tesseract the_old_engine.png stdout
Warning. Invalid resolution 0 dpi. Using 70 instead.
Estimating resolution as 491
Estimating resolution as 491
Tesseract не справляется с распознаванием изображения, возвращая пустую строку.
Теперь воспользуемся режимом --psm 13, минуя все алгоритмы сегментации страниц и функции предварительной обработки tesseract, рассматривая изображение как одну необработанную строку текста:
$ tesseract the_old_engine.png stdout --psm 13
Warning. Invalid resolution 0 dpi. Using 70 instead.
THE OLD ENGINE.
В этот раз мы получили удовлетворительный результат, но не стоит считать, что так будет всегда, этот режим очень непредсказуем.