LINUX.ORG.RU

OCR, один странный алгоритм

 


0

1

Наткнулся я как-то на один алгоритм, вот статья - An expert system for general symbol recognition. Зацепило что идея простая и, казалось бы, рабочая. Вот простой пример работы - имеем уже подверженный максимальному утончению символу, где 1-чёрный пиксель, 0-белый(фон) -

100000001
100000010
010000100
001000100
000101000
000010000
разбиваем его на m x n зон -
100|000|001
100|000|010
010|000|100
---|---|---
001|000|100
000|101|000
000|010|000
для наглядности точки вместо нулей -

1..|...|..1
1..|...|.1.
.1.|...|1..
---|---|---
..1|...|1..
...|1.1|...
...|.1.|...
и аппроксимируем последовательность единиц в каждой зоне в прямые линии -
\..|...|../
.\.|...|./.
..\|...|/..
---|---|---
...|...|...
...|___|...
...|...|...
Получилось 3 линии в 3 зонах. Пусть это шаблон. Если на входе будет похожий символ, в котором несколько пикселей будут отличаться, то он, возможно, аппроксимируется в идентичный шаблон и распознается на 100%. На примерах линии строятся максимум из 3 пикселей, что не даёт должной аппроксимации, но на реальных примерах количество пикселей больше и там это работает, по идее.

Но не очень понятно что делать с граничными пикселями и возможным сдвигом символов по зонам. К примеру -


001|000|100
000|101|000
001|010|000
-----------
000|100|000
001|011|000
001|000|100

..1|...|1..
...|1.1|...
..1|.1.|...
-----------
...|1..|...
..1|.11|...
..1|...|1..

...|...|...
...|___|...
...|...|...
-----------
..I|\..|...
..I|.\.|...
..I|..\|...
видно что в верхней левой зоне пикселей недостаточно чтобы аппроксимировать их в прямую линию, т.к. один лежит в другой зоне. Пример игрушечный, но на реальных входных данных пиксели могут быть серьёзно разбросаны по зонам и определить их в какую-то конкретную становится сложно. Таким образом теряется часть информации и шаблон становится не рабочим или ошибочным.

Сверка с шаблоном происходит позонно. Для большей точности в статье предлагается разбивать символ на большее количество зон, но тогда два похожих символа, отличающихся сдвигом на 1 пиксель вправо, к примеру, могут попасть в разные зоны и шаблоны будут совершенно не похожи. Вся аппроксимация коту под хвост.

Меня подкупила простота этого алгоритма и мне интересно, насколько он реально работает, как решаются описанные проблемы, применялся ли он где-нибудь реально и может кто-то слышал о нём? Я написал его реализацию и получил довольно плачевные результаты, распознаётся примерно 70% верно и 10% с ошибкой, примерно, на игрушечных примерах.

★★★

Последнее исправление: pseudo-cat (всего исправлений: 3)

expert system

идея простая

/0

anonymous
()

Такой простой алгоритм не будет работать из-за ошибок связанных с изменением размера шрифта, сдвигами, поворотами и разными начертаниями букв в шрифтах. Я как-то давно легко нагуглил описание алгоритма (в общих чертах конечно) применяемого ABBYY, если тебя там не забанили можешь прочитать что всё намного сложнее. Для начала проводится анализ на предмет возможного поворота текста, это исправляется, и так далее.

mbivanyuk ★★★★★
()
Ответ на: комментарий от mbivanyuk

но статья, но исследование, но результаты в ней. пс - там про повороты тоже есть, это уже другая проблема, меня интересует сам шаблон, ведь звучит там всё логично и работоспособно

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

Статьи писать любой дурак может, а реализовать OCR получилось только у ABBYY и ещё нескольких контор. Так вот, они используют сразу несколько классификаторов. Один из них - попиксельное сравнение с шаблонами. Другой - анализ наличия в изображении признаков того или иного символа, например замкнутый круг может быть буквой «о». Применяются и другие, это довольно сложный процесс. И в сумме они едва дают приемлемый уровень распознавания. Погугли и почитай, там сложно всё.

mbivanyuk ★★★★★
()

Но не очень понятно что делать с граничными пикселями и возможным сдвигом символов по зонам

Как идея: применять несколько разных сеток разбиений, на основе совпадений для каждой сетки считать общее совпадение (среднее арифметическое? максимум? минимум?)

vladimir-vg ★★
()

На карманном компьютере psion 5mx была программа CalliGrapher, мгновенно распознающая рукописный ввод с сенсорного экрана не только букв и слов, но и целых предложений. Процессор там всего 16 Мгц. Правда на английском. Обучение программы не требовалось, работала сразу. Вот этот алгоритм бы найти...

glibych ★★
()
Последнее исправление: glibych (всего исправлений: 1)
Ответ на: комментарий от glibych

ИМХО рукописный ввод, происходящий в реальном времени, распознать проще, чем статичную картинку с результатом этого самого рукописного ввода.

Deleted
()
Ответ на: комментарий от mbivanyuk

с равными размерами зон такое не прокатит, а с разными больше проблем чем пользы.

На самом деле у них в статье немного по-другому линии вычисляются - по числу(segment length) пикселей, и оно у них одно, то есть получается что линии по диагонали строятся по тому же числу пикселей что и горизонтальные/вертикальные. Но и в примерах у них везде маска зон наложено так, что не возникает корреляций! В общем можно строить как они и пихать результат в зону, в которую попало большее число пикселей, но это не особо спасёт от всяких артефактов.

pseudo-cat ★★★
() автор топика

Идея занятная, но только в плане получения фич (features) для дальнейшего анализа/обучения.

yoghurt ★★★★★
()

Уверен, что в каком-нибудь tesseract это уже не реализовано? Алгоритм-то довольно тривиальный.

Shadow1251
()
Ответ на: комментарий от Deleted

ИМХО рукописный ввод, происходящий в реальном времени, распознать проще, чем статичную картинку с результатом этого самого рукописного ввода.

Какая разница? Разве ты не можешь прочитать файл посимвольно, или пословно/построчно? Это будет полный эквивалент, по-идее.

terminator-101
()

Ничем не могу помочь по сабжу, но если хочется посмотреть какие-нибудь сорцы, то можешь поковырять cuneiform.

Nao ★★★★★
()
Ответ на: комментарий от yoghurt

Можешь более подробнее свои мысли высказать? Знаю несколько алгоритмов такой направленности, интересно что ты имеешь в виду

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от terminator-101

Появляется дополнительная информация

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

Извини, я не понимаю что такого нового в изложенном тобой алгориитме. То что символы надо попиксельно сравнивать с шаблонами это было понятно уже полсотни лет назад. Современные алгоритмы ушли очень далеко от таких примитивных схем, но как я понимаю тебе это не интересно.

mbivanyuk ★★★★★
()
Ответ на: комментарий от mbivanyuk

Я не тебе отвечал тем сообщением, сорри. А куда они ушли, если не секрет?

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от Deleted

Согласен, что немного легче. Но Calligrapher ни разу не ошибалась. Аналоги, распознающие на русском, и близко не валялись.. У тех в 2000 году был побуквенный ввод. И тот ошибочный в большинстве случаев. Про распознавание предложениями молчу.

Распознавалки английского языка, что текста, что речи работают на порядок точнее аналогов программ, распознающих на русском. Думаю в любом случае лучше на английских программах будет учиться.

glibych ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.