- Регистрация
- 12.04.17
- Сообщения
- 19.095
- Реакции
- 107
- Репутация
- 0
Всем привет! Как вы уже знаете, мы в SE занимаемся распознаванием текста (и не только) на разных документах. Сегодня мы хотели бы рассказать еще об одной проблеме при распознавании текста на сложных фонах — о распознавании пробелов. Вообще, мы будем говорить об имени на банковских картах, но для начала пример с «призраком» буквы Ё. Как видите, тут справа от D искажения и фон сформировали достаточно четкую Ё. При этом, если показать эту ячейку отдельно от всего остального, человек (или нейронная сеть) уверенно скажет, что буква есть.
Как видно на картинке — мы работаем на исходном изображении со сложными фонами, поэтому пробелы наши весьма разнообразны. На них бывают узоры, логотипы, а иногда и текст. Например, VISA или MAESTRO на карточках. И нам интересны именно такие «сложные пробелы», а не просто белые прямоугольники. А в своих системах мы рассматриваем именно отдельно вырезанные прямоугольники символов [1].
А в чем сложность?
Пробел — это символ без особых признаков. На сложных фонах, например, как на изображении, отдельно вырезанный пробел бывает сложно отличить даже человеку.
С другой стороны, по своей сути пробел отличается от остальных символов. Если в имени вместо ASIA распознается ABIA, то есть шанс исправить это пост-обработкой. Но, если там возникнет A IA — вряд ли уже что-то поможет.
Не нами используемые методы
Часто пробелы фильтруют с помощью статистик, посчитанных по картинке. Например, считают среднее абсолютное значение градиента по картинке или дисперсию интенсивностей пикселей и по пороговому значению делят картинки на пробелы и буквы. Однако, как видно по графикам, такие методы не годятся для серых картинок со сложными фонами. А из-за явной корреляции значений даже комбинация этих методов не справится.
Всеми любимая бинаризация тут тоже не поможет. Например, вот на такой картинке:
Итак, как же можно улучшить распознавание?
Раз человеку нужно окружение пробела, чтобы его увидеть, то логично и сети показывать хотя бы два соседних символа. Мы не хотим увеличивать вход распознающей сети, которая, в общем-то, неплохо работает (и многие пробелы распознает). Так что мы заведем еще одну сеть — попроще. Новая сеть будет предсказывать, что на картинке: два пробела, две буквы, пробел и буква или буква и пробел. Соответственно, такая сеть используется вместе с распознающей сетью. На изображении представлены используемые архитектуры: слева — архитектура распознающей сети, справа — архитектура предложенной сети. Распознающая сеть работает на картинке с одним символом, а новая — на картинке двойной ширины, содержащей два соседних символа.
А протестировать?
Для тестирования у нас было 4320 строк с именами, содержащие 130149 символов, из которых 68246 пробелов. Для начала, у нас есть два метода. Базовый метод: нарежем строку на символы и распознаем каждый символ по отдельности. Новый метод: также нарежем строку символы, найдем все пробелы новой сетью, а оставшиеся символы распознаем обычной. Из таблицы видно, что качество распознавания пробелов, как и общее качество, растет, но качество распознавания букв слегка проседает.

Как видно на картинке — мы работаем на исходном изображении со сложными фонами, поэтому пробелы наши весьма разнообразны. На них бывают узоры, логотипы, а иногда и текст. Например, VISA или MAESTRO на карточках. И нам интересны именно такие «сложные пробелы», а не просто белые прямоугольники. А в своих системах мы рассматриваем именно отдельно вырезанные прямоугольники символов [1].
А в чем сложность?
Пробел — это символ без особых признаков. На сложных фонах, например, как на изображении, отдельно вырезанный пробел бывает сложно отличить даже человеку.

С другой стороны, по своей сути пробел отличается от остальных символов. Если в имени вместо ASIA распознается ABIA, то есть шанс исправить это пост-обработкой. Но, если там возникнет A IA — вряд ли уже что-то поможет.
Не нами используемые методы
Часто пробелы фильтруют с помощью статистик, посчитанных по картинке. Например, считают среднее абсолютное значение градиента по картинке или дисперсию интенсивностей пикселей и по пороговому значению делят картинки на пробелы и буквы. Однако, как видно по графикам, такие методы не годятся для серых картинок со сложными фонами. А из-за явной корреляции значений даже комбинация этих методов не справится.

Всеми любимая бинаризация тут тоже не поможет. Например, вот на такой картинке:

Итак, как же можно улучшить распознавание?
Раз человеку нужно окружение пробела, чтобы его увидеть, то логично и сети показывать хотя бы два соседних символа. Мы не хотим увеличивать вход распознающей сети, которая, в общем-то, неплохо работает (и многие пробелы распознает). Так что мы заведем еще одну сеть — попроще. Новая сеть будет предсказывать, что на картинке: два пробела, две буквы, пробел и буква или буква и пробел. Соответственно, такая сеть используется вместе с распознающей сетью. На изображении представлены используемые архитектуры: слева — архитектура распознающей сети, справа — архитектура предложенной сети. Распознающая сеть работает на картинке с одним символом, а новая — на картинке двойной ширины, содержащей два соседних символа.

А протестировать?
Для тестирования у нас было 4320 строк с именами, содержащие 130149 символов, из которых 68246 пробелов. Для начала, у нас есть два метода. Базовый метод: нарежем строку на символы и распознаем каждый символ по отдельности. Новый метод: также нарежем строку символы, найдем все пробелы новой сетью, а оставшиеся символы распознаем обычной. Из таблицы видно, что качество распознавания пробелов, как и общее качество, растет, но качество распознавания букв слегка проседает.
Пробелы | Буквы | Итого |