Я занимаюсь разработкой технологий, используемых в продуктах распознавания текста компании ABBYY. Самым известным продуктом (а точнее – семейством продуктов), использующим эти технологии, является FineReader.
Чем занимается программа FineReader?
Сейчас любой из настольных вариантов FineReader может проделать все самостоятельно от получения изображения со сканера, камеры или из готового файла до выдачи результата обработки в файл или в указанное приложение, так, что человек остается «за кадром». Программа сама «распознаёт» всё что нужно (в кавычках, так как при этом программа определяет места расположения текста, таблиц, картинок, OCRит обнаруженные участки с изображённым текстом, формирует документ, который сохраняет в желаемом формате с указанными настройками)
А чем занимается пользователь?
Обычно почти ничем — сперва заказывает работу, а потом её принимает. Иногда пользователя что-то не устраивает в результате автоматической обработки, но в таких случаях типичный пользователь смиренно думает «Не повезло...»
К сожалению, далеко не все знают, что помимо окна «Задача», которое показывается и при запуске, есть другие способы управлять работой программы. Они помогают с помощью человеческого интеллекта преодолеть недостатки и ограничения (иногда принципиальные) искусственного интеллекта программы.
Как научиться это делать? Есть несколько способов, при необходимости сочетаемых:
- почитать «Краткое руководство», «Полное руководство пользователя», online-Справку к программе – там конечно же много букв, но почти все они написаны по делу.
- прочитать до конца эту статью. В ней гораздо меньше букв, к тому же, автор обещает избавить читателя от страха перед программой и пробудить у него интерес к экспериментам,
- экспериментировать с программой (единственный пункт, без которого не обойтись) – даже демо-версия позволяет попробовать всё, что нужно при реальной эксплуатации.
С чего начать?
Начать нужно с привычки сохранять результат работы не только в виде документа в целевом формате, но и как документ FineReader, содержащий результаты проделанной работы. Это позволяет работать с большим документом не несколько часов подряд в один подход, а когда удобно и сколько угодно раз, возвращаться к распознанному и вычитанному документу для экспериментов с настройками сохранения и так далее. Все действия с документом FineReader собраны в Меню «Файл».
Нет ничего практичнее хорошей теории, или из чего состоит «распознавание»
Глядя на лаконичные названия задач, например, «Сканировать в PDF», трудно вообразить, сколько всего происходит в промежутке между «Сканировать» и «PDF» (то есть на месте одной буквы «в»). Давайте посмотрим, сколько.
Задача «преобразования документов из растрового представления в редактируемое» (не просто «распознавания») включает следующие основные этапы:
- Получение исходного одно- или многостраничного изображения (со сканера, фотоаппарата или в виде файла), преобразование его в специальное внутреннее представление (для упрощения и ускорения дальнейших операций). В любом случае используется подсистема обработки изображений, понимающая множество внешних форматов как на чтение, так и на запись.
- Подготовка изображения (исправление искажений разных типов, разделение книжных разворотов на отдельные страницы – всё это включаемо/отключаемо в настройках) – выполняет также подсистема обработки изображений. Узнать про некоторые элементы этого процесса чуть больше можно в этом посте.
- Сегментация, или «анализ макета страниц», когда решается, где и что нужно и не нужно распознавать, выполняется подсистемой Анализ.
- Распознавание (наконец-то) – выполняет подсистема Распознаватель (сюрприз!), она порождает строки, состоящие из фрагментов (будущих слов), состоящие из символов без форматирования (пока нет даже деления на параграфы, есть только строки). Некоторое количество информации о деталях работы распознавателя уже было написано на Хабре моим коллегой. А если вам действительно интересны технические подробности, то не лишним будет и упоминание, что распознаватель в своей работе использует кроме прочего и подсистему морфологии. В этом посте можно поучиться правильно использовать упомянутую подсистему морфологии и механизм Распознавание с обучением, позволяющий лучше распознавать декоративные шрифты или символы, о которых FineReader ничего не знает (бывает и такое).
- Синтез документа (он имеет два этапа – страничный, вызываемый сразу по завершении распознавания отдельной страницы и документный, работающий по окончании обработки всех страниц) — именно здесь определяется структура и все характеристики распознанного текста, кроме кодов символов, порождая целостный документ – выполняет подсистема Синтез. В этом посте можно попытаться осознать тяжёлую судьбу тех, кто пишет те сотни сотен эвристик, которые позволяют делать распознанный документ максимально похожим на оригинал.
- Просмотр и редактирование изображений страниц, структуры областей, результатов распознавания – выполняет Оболочка программы и подсистема Редактор в её составе (исполняемый файл FineReader.exe – это есть оболочка). В оболочке можно увидеть и отредактировать значительную часть порождаемой при обработке информации (начиная со структуры блоков). Конечно же, для пользовательского редактирования доступна не вся информация, которой оперируют разные подсистемы – в первую очередь потому, что показ всех находимых автоматикой сущностей, их свойств и взаимосвязей вызвал бы безумное усложнение пользовательского интерфейса.
- Сохранение готового документа в многочисленные внешние форматы – выполняется подсистемой Экспорт (разработкой которой занимаюсь как раз я с коллегами).
Подсистемы, работающие до экспорта, не знают выходного формата/варианта сохранения. Поэтому при синтезе документа создаются сразу несколько его представлений, которые могут потребоваться всем форматам/вариантам экспорта, а оболочка умеет их показывать аналогично тому, как результаты экспорта будут отображены в целевых приложениях. Это порождает немало трудностей при разработке, потому что слишком тесная взаимосвязь обозначенных подсистем приводит к усложнению разделения ответственности на «пограничных территориях», когда бага/фича лежит где-то между подсистемами. Но мы пока справляемся :)
Зачем так много модулей (подсистем)?
Для начала необходимо заметить, что перечислены только основные, а не все. Подсистема сканирования, например, не день и не два писалась, а многие месяцы и даже, возможно, годы. Впрочем, вернёмся к вопросу, обозначенному выше.
Во-первых, проект «Технологии распознавания» и много сложных продуктов на его основе разрабатываются уже не первое десятилетие большими коллективами людей — их работу просто необходимо делить организационно и технологически на части, чтобы разрабатывать каждую более-менее независимо — конечно же, детально описав интерфейсы и правила взаимодействия модулей, чтобы выход предыдущего модуля в цепочке стыковался со входом следующего.
Во-вторых, некоторые продукты могут использовать не все из перечисленных стадий обработки (и реализующих их подсистем), а только некоторые. Например, модуль «Распознаватель» имеет собственные подмодули для обработки печатного и рукописного текста, а его «печатный» под-модуль – ещё и свои под-под-модули для обработки языков со сложной письменностью. Похожая ситуация с модулем разпознавания штрихкодов и кодеками некоторых форматов изображений – некоторые продукты обходятся без них.
Какой результат и зачем нужен пользователю?
Не озадачившись вовремя этим вопросом, можно остаться недовольным даже полностью правильным результатом OCR в узком смысле – когда вроде все буквы найдены и правильно распознаны, но в целом что-то в результате печалит.
Перечислю некоторые из популярных сценариев использования FineReader с особенностями каждого сценария.
Преобразование архива документов-изображений в электронный вид, с максимальным сохранением внешнего вида страниц, но добавлением возможности поиска и копирования небольших фрагментов текста.
Этот сценарий обычно использует сохранение обработанного документа в PDF с видимым изображением страницы (не всегда в полностью оригинальном виде, но по возможности максимально похожим на него) и добавлением «невидимого» распознанного текста, который в PDF-просмотрщиках можно искать, выделять и копировать. На нашем жаргоне этот режим сохранения в PDF называется «Текст под изображением», он наиболее популярен, но это лишь один из 4 режимов сохранения в PDF (на остальных остановлюсь подробнее в статье про сохранение). Ценители формата DjVu также могут использовать аналогичный режим сохранения.
Важное достоинство режима «Текст под изображением» в том, что он требует минимальных знаний о структуре сохраняемого текста, привязывая символы к нужным местам результирующей страницы просто по координатам на исходном изображении. Поэтому неважно, если таблицы не были правильно автоматически детектированы в оригинале (развалившись на кучу текстовых областей), или текст немного нелогично выделился в текстовые области – в результирующем PDF найдётся всё или почти всё, лишь бы символы правильно распознались и собрались в слова.
Создание документа в формате любого из популярных текстовых редакторов (Microsoft Word или OpenOffice/LibreOffice Writer), более-менее похожего на оригинал — для последующего редактирования и/или переиспользования значительных фрагментов в новых документах.
При сохранении в форматы RTF и DOCX (для Word) и ODT (для Writer) поддержаны 4 режима сохранения, отличающихся балансом «точное сохранение вида <-> простота редактирования и копирования содержимого». Я ещё напишу подробнее об их различиях, но общим требованием для разумного вида результата обработки является разумность разметки всех элементов документа в FR — областей и их свойств.
Создание электронной книги на базе сканированной бумажной книги.
Во многом похож на предыдущий, но в силу упрощённой модели документа в форматах электронных книг, ограничений средств их редактирования и показа после FineReader, иногда требует больше внимания к некоторым мелочам.
И зачем я это теперь знаю?
Как вы, наверняка, уже догадались, понимание этих логичных, но всё-таки не очевидных моментов позволило бы пользователям доводить результат деятельности FineReader до идеального (с точки зрения пользователя) состояния с минимальными трудозатратами. В следующей части поста я дам конкретные рекомендации по решению типичных пользовательских проблем, а пока давайте вернёмся к работе.
Автор: SlaSapro