Журнал LinuxFormat - перейти на главную

LXF118:Компьютер слушает

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Читаем с листа

СРР
Как бы мы ни любили Linux, приходится признать: для автоматического ввода текста с бумаги в компьютер это пока не лучший вариант. Андрей Боровский смотрит, что можно сделать.

Распознавание текста относится к числу тех интеллектуальноемких задач, с которыми открытые системы пока не научились справляться хорошо. Позитивные сдвиги в решении проблемы наметились в 2005, когда компания Hewlett-Packard открыла исходные тексты некогда коммерческой программы Tesseract на условиях лицензии Apache License 2.0. Проект тут же поддержала компания Google, заинтересованная в открытом средстве распознавания текстов для создания своих электронных библиотек (Google также оказала поддержку некоторым смежным проектам, связанным с распознаванием текста, например, Ocropus). В 2008 году компания Congnitive Technologies выложила в открытый доступ исходные коды своего пакета распознавания текста Cuneiform.

Впрочем, те, кто на волне всеобщего энтузиазма предрекал конец эры коммерческих приложений-конкурентов, слегка поторопились. Следует помнить, что предложенные нашему вниманию программы не были лидерами рынка, иначе мы вряд ли увидели бы их исходные коды. Используемые в них технологии давно не обновлялись (развитие Tesseract в недрах HP остановилось в 1995 году). Если бы такие программы были доступны в Linux лет тринадцать назад, он был бы сегодня самой популярной офисной системой. Но сейчас эти приложения уже не соответствуют тем стандартам функциональности и удобства, к которым привыкли пользователи конторских ПК.

Немного о грустном

Признаем честно: Linux по-прежнему нельзя назвать наиболее подходящей средой для распознавания текстов. Проблемы возникают уже на уровне поддержки оборудования. Производители сканеров игнорируют Linux, а добровольцы из проекта Sane едва ли могут обеспечить работу всех моделей. Если вы собираетесь сканировать под Linux, перед покупкой устройства следует проконсультироваться на сайте Sane. Учтите при этом одну важную особенность: обычно поддержка в Linux некой периферии означает, что поддерживаются (возможно, с несколько ограниченной функциональностью) и все устройства того же модельного ряда, однако со сканерами дело обстоит иначе. Например, CanoScan LiDE 60 (производитель – компания Canon) работает, а CanoScan LiDE 70 – нет. Так что будьте бдительны.

Преимущества пользователей Windows в деле сканирования текстов не ограничиваются наличием драйверов для любого устройства. Сегодня даже самые дешевые модели сканеров поставляются с программами (обычно это «облегченный» вариант FineReader), которые прекрасно справляются со сканированием среднестатистических офисных текстов. Собственно говоря, даже появление высококачественных открытых программ распознавания текста само по себе не сделает Linux привлекательной офисной средой: здесь мы сталкиваемся с известной проблемой конкуренции между открытыми и закрытыми платформами. Успешная закрытая программа, предназначенная для конкретной закрытой платформы, становится дополнительным конкурентным преимуществом этой платформы. Успешная открытая программа не добавляет конкурентных преимуществ какой-либо конкретной платформе, так как может быть без особых усилий перенесена на любую закрытую ОС.

Стоит ли при таких обстоятельствах, когда коммерческие решения для распознавания текста дешевеют и становятся «придатком» к оборудованию, а успехи свободных программ не способствуют продвижению открытого ПО в целом, заниматься разработкой последних? Я думаю, что эта работа по-прежнему имеет смысл. Открытые программы обладают одним важным преимуществом: возможностью быстрой адаптации к специфическим потребностям пользователей. В идеале открытые программы распознавания текста должны представлять собой не законченные монолитные блоки, а наборы инструментов, которые могут быть легко приспособлены для решения специальных задач, будь то распознавание текста в особых условиях или интеграция с каким-либо нестандартным ПО.

Герои нашего времени

В данной статье мы подробно рассмотрим Cuneiform и бегло – Tesseract. Такое неравноправие объясняется очень просто: только Cuneiform поддерживает распознавание документов на русском языке; попытки русификации Tesseract пока что не увенчались приемлемыми результатами. Разумеется, список открытых проектов распознавания текста не исчерпывается перечисленными программами (есть еще, например, GOCR). Но, поскольку распознавание текстов на русском в перечень возможностей этих других приложений не входит, а среди «нерусских», по результатам многочисленных обзоров, самым успешным признан проект Tesseract, мы решили не останавливаться на альтернативах.

В своей нынешней реализации и Cuneifrom, и Tesseract представляют собой приложения командной строки, что определенным образом ограничивает их функциональность. Важную роль в пакетах распознавания текста всегда играла интерактивность – например, возможность наглядно сопоставить распознанный фрагмент текста и соответствующий ему фрагмент исходного изображения (графический вариант Cuneiform для Windows предоставляет такую возможность). Программа, работающая по принципу фильтра (читаем исходные данные, выполняем обработку, выдаем результат) не может предоставить аналогичный уровень интерактивности (хотя в ядре Cuneiform имеются для этого все необходимые функции).

Часть 1 Cuneiform

LXF118 37 1.jpg Cuneiform для Windows — отправная точка для открытого проекта.

В отличие от программы Tesseract, за «открытием» которой стояли HP и Google, релиз исходных текстов Сuneiform был обставлен гораздо скромнее. Помимо этого, важное отличие Cuneiform от Tesseract – условия лицензирования. Разработчики Tesseract выбрали хорошо известную в мире открытого ПО лицензию Apache License 2.0 (некоторые компоненты, добавленные сторонними разработчиками, распространяются на условиях GPL). Разработчики же Cuneiform ограничились коротким текстом, согласно которому программное обеспечение может свободно распространяться в виде двоичных файлов и исходных текстов, в оригинальной или модифицированной форме, при условии сохранения уведомлений об авторских правах [это похоже на первоначальную лицензию BSD, – прим. ред.]. Малозаметное, но важное отличие заключается в том, что обычные лицензии Open Source явным образом постулируют, что открытый однажды код не может быть впоследствии «закрыт». Тот факт, что Cuneiform распространяется на условиях, несколько нестандартных для открытого ПО, может привести к тому, что программа не войдет в Linux-дистрибутивы, составители которых придерживаются строгих принципов относительно лицензий на ПО. Помимо исходных текстов, в свободный доступ была выпущена уже собранная версия Cuneiform для Windows. Дело в том, что без серьезной «обработки напильником» собрать ее из оригинальных исходников в современных версиях Microsoft Visual Studio просто не получится. Разработчики Cuneiform до сих пор не предоставили описания форматов файлов моделей, используемых программой для распознавания. Инструменты обучения Cuneiform распознаванию текстов на новых языках также отсутствуют. Отчасти этот пробел компенсируется тем, что Cuneiform уже умеет распознавать тексты практически на всех европейских языках, основанных на кириллице и латинице (досадным исключением является, соответственно, греческий).

Найдем и соберем

Cuneiform для Linux, который на момент написания этой статьи достиг версии 0.6.0, пока что не входит ни в один стабильный дистрибутив (в настоящий момент он включен в репозиторий ALT Linux Sisyphus), так что собирать приложение вам придется самостоятельно. Исходные тексты последнего релиза Cuneiform доступны по адресу https://code.launchpad.net/cuneiformlinux/+download; вы также можете взять их с LXFDVD. Отследить последние изменения можно здесь: https://code.launchpad.net/~jpakkane/cuneiform-linux/trunk, для этого вам потребуется система контроля версий Bazaar. Для сборки Cuneiform необходима система CMake (если вы пользуетесь KDE 4, она наверняка у вас уже имеется). Кроме того, перед компиляцией Cuneiform рекомендуется установить пакет преобразования графических форматов ImageMagick (http://www.imagemagick.org). Если этого не сделать, программа сможет читать исходные данные только из простых растровых файлов (BMP).

Прежде чем приступать к сборке, необходимо отредактировать файл CMakeLists.txt, расположенный в корневой директории исходных текстов Сuneiform. После строки

 cmake_minimum_required(VERSION 2.6.0)

добавьте

 set(PROJECT_BINARY_DIR builddir)

где builddir – путь к директории, в которой следует собирать двоичные файлы программы (если она еще не существует, то будет создана в процессе). Теперь в этом же каталоге скомандуйте

 cmake ./

Если все прошло успешно, можно собирать саму программу:

sudo make install

Cuneiform для Linux – консольное приложение. Работать с ним просто. В общем виде, строка вызова программы выглядит так:

cuneiform -l <language> -o <output_file> [-f <output_format>] <input_file>

где <language> – язык распознавания, например:

rus – русский,
eng – английский,
fra – французский,
ruseng – русско-английский.

В моей многоязычной ветке Cuneiform можно также указывать языки вида rus_xxx, где xxx – обозначение второго языка документа (первый при этом – русский). Например, для распознавания текстов, содержащих русский и французский языки, надо набрать rus_fra. Ключ -o позволяет указать имя файла, в котором будут сохранены результаты распознавания. По умолчанию данные сохраняются в простом текстовом формате в кодировке UTF-8, но с помощью ключа -f можно выбрать что-то другое, например, HTML, RTF или «родной» формат Cuneiform. Значения опции -f для них выглядят как -f html, -f rtf, -f cf, соответственно. Наконец, <input_file> – имя графического файла, из которого программа читает исходные данные.

Cuneiform не справляется с распознаванием таблиц, зато понимает текст, разбитый на несколько колонок (их расположение в результирующем тексте не сохраняется, вместо этого они размещаются как абзацы – одна под другой). Впрочем, и тут не обошлось без затруднений. Нередко бывает так, что программа воспринимает пробелы, расположенные друг под другом в нескольких строках подряд, как разделитель между двумя столбцами. В результате Сuneiform находит колонки там, где их нет, что приводит к непредсказуемому изменению компоновки распознанного текста. Видимо, именно для таких случаев разработчики программы предусмотрели специальную опцию, позволяющую отключить поиск столбцов в распознаваемом тексте, однако в главной ветке Cuneiform для Linux эта функция почему-то заблокирована. Я разблокировал ее в своем варианте, и теперь вы можете подавить поиск столбцов в тексте с помощью ключа -c1. Cuneiform умеет распознавать и отдельно сохранять изображения, однако текст с обилием картинок распознается несколько хуже, чем просто текст. Буквицы также воспринимаются как картинки, и их наличие отрицательно сказывается на результате.

Проверка боем

Для тестирования качества распознавания было выбрано пять текстов: два на русском языке, один – на смешанном русско-английском и два – на английском. Все они были отсканированы на сканере Mustek 2448 TA Pro в цветном режиме с разрешением 300 точек на дюйм. Разумеется, всесторонняя оценка качества распознавания требует тестирования с использованием множества различных шрифтов, компоновок текста и параметров сканирования. Приводимые ниже данные позволяют получить лишь самое общее представление о качестве распознавания Cuneiform для Linux. Тем не менее, поскольку мне приходится постоянно тестировать программу в процессе разработки собственной ветви, я возьму на себя смелость утверждать, что представленные данные отражают общую картину.

По результатам тестирования (см. ниже) можно отметить следующие любопытные факты. Точность распознавания русского языка колеблется в пределах 96–97% и практически не зависит от цвета фона и размера шрифта (видимо, Cuneiform умеет хорошо нормализовать соответствующие искажения). Наклон строк тоже мало влияет на качество распознавания. Неплохо компенсируются искажения, возникающие при сканировании многостраничных документов в районе линии сшивки страниц. Странно, что качество распознавания английского текста оказалось существенно выше, чем качество распознавания русского. Стоит также отметить, что программа на удивление хорошо справляется с распознаванием слов, которые, скорее всего, отсутствуют во встроенном словаре (редкие имена собственные и географические названия, а также «программистские» конструкции типа AddItem). Возможно, встречая такое незнакомое слово, программа переходит в режим более тщательного «просмотра».

А вот с распознаванием чисел, встречающихся в тексте, Сuneiform справляется не очень хорошо. Еще одно чисто визуальное наблюдение: большие фрагменты текста программа распознает лучше, чем маленькие, при этом в начале текста концентрация ошибок выше, чем в конце. Это заставляет предположить, что ядро Сuneiform подстраивается под параметры конкретного текста по ходу распознавания. Непонятно, однако, что мешает программе вернуться к начальному фрагменту текста и попробовать распознать его еще раз, учитывая накопленную статистику (не исключено, что такая возможность в ядре Сuneiform действительно существует, просто разработчики Linux-версии еще не задействовали ее).

LXF118 38 1.jpg Распознанный текст с картинкой в формате HTML: некоторое сходство с оригиналом присутствует

Главное разочарование – программа оказалась бессильна распознать текст на изображении, где белая страница была окружена обширными темными полями (такое часто бывает при сканировании, если размер страницы меньше размера рабочего поля сканера). Именно поэтому в таблице и нет результатов для одного из тестовых текстов. Разумеется, черные поля можно удалить в графическом редакторе, но на это расходуется время, которое можно было бы потратить на более полезные вещи.

При использовании «богатых» форматов вывода, таких как HTML и RTF, Cuneiform старается сохранить элементы форматирования исходного текста (заголовки, выделения слов полужирным шрифтом и курсивом), а также добавить в результирующий текст обнаруженные в оригинале картинки.

Мои пять копеек

Стандартная версия Cuneiform для Linux может распознавать тексты на русском, английском, немецком, французском, испанском, итальянском, украинском, сербском, хорватском, болгарском, чешском, словенском, польском, датском, португальском, голландском, румынском, венгерском, латвийском, литовском, эстонском и турецком языках. По умолчанию русский язык может распознаваться только совместно с английским. Я поставил перед собой задачу добавить в Cuneiform поддержку распознавания текстов, в которых русский язык смешан с другими, поддерживаемыми программой. В ходе работы над своей веткой Cuneiform я также добавил некоторые возможности, которые упомянуты по ходу изложения. Получить новейшие исходные тексты моей ветви можно по ссылке: https://code.launchpad.net/~anb-symmetrica/cuneiform-linux/cuneiform-multilang, а также на моем сайте: http://symmetrica.net/cuneiformlinux.

Результаты тестирования Cuneiform 0.6.0

Вид текста* Общее число слов Количество ошибок
Простой русский текст (белый фон, одна колонка) 240 9 (3,5%)
Русский текст, белый фон, 2 колонки, сильный наклон строк 526 16 (3%)
Русско-английский текст, темный фон, мелкий шрифт, 3 колонки 335 13 (4%)
Английский текст, белый фон, две колонки 260 3 (1%)

* По причинам, изложенным выше, один из тестовых документов был исключен из сравнительной таблицы.

Часть 2 Tesseract

Разработка открытого варианта Tesseract пользуется поддержкой Google, что не могло не отразиться на внимании разработчиков к этому проекту самым благоприятным образом. Изначально Tesseract был предназначен исключительно для распознавания текстов на английском языке, однако благодаря общедоступным средствам обучения программы энтузиасты смогли добавить в нее поддержку других языков, основанных на латинице. Были предприняты попытки научить Tesseract распознаванию и русскоязычных текстов, однако пока что результаты более чем скромные. Отчасти это объясняется тем, что множество эвристик, справедливых только для латинского алфавита, были «зашиты» непосредственно в код программы, из которого их не так-то просто «вычистить». На этом примере мы в который раз убеждаемся в справедливости одного из основополагающих принципов разработки Unix, требующего везде, где только можно, разграничивать движок и интерфейс.

Как и Cuneiform для Linux, Tesseract представляет собой консольное приложение, не способное взаимодействовать со сканером напрямую. В Википедии утверждается, что исходными данными для Tesseract должны быть изображения в TIFF, однако мой опыт показывает, что он понимает и другие форматы, в том числе BMP.

Разработчики Tesseract заявляют, что их программа является, вероятно, лучшим открытым средством распознавания текста. Думаю, что сегодня мы можем скорректировать это утверждение. Даже при распознавании английского текста, для которого Tesseract изначально и создавался, приложение показало себя не лучше Cuneiform. Единственное (хотя и важное) преимущество – Tesseract смог распознать страницу с черными полями по краям. А вот с разделением текста на два столбца (отсканированный книжный разворот) программа не справилась.

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

Почему же, несмотря на все перечисленные особенности, Tesseract значительно более известен в мире Linux, чем Cuneiform? Причин, на мой взгляд, две, и обе они были упомянуты выше. В отличие от Cuneiform, Tesseract распространяется на условиях официальной открытой лицензии, что делает его более приемлемым в глазах «пуристов». Второе преимущество – наличие инструмента обучения программы новым языкам (русский пока в их число, к сожалению, не входит). Для упрощения тренировки Tesseract была даже создана специальная программа с красивым графическим интерфейсом. Основные параметры Tesseract и Cuneiform сведены в таблице ниже.

По результатам сравнений Cuneiform несомненно лидирует, причем, и это приятно отметить, не только за счет поддержки важного для нас русского языка, но и за счет лучшего качества распознавания и вывода результатов. Объясняется это, помимо прочего, тем, что в свое время Cuneiform был хорошо продаваемым коммерческим продуктом. Будем надеяться, что разработчики открытого ПО не только успешно завершат процесс переноса Cuneiform на открытые платформы, но и продолжат дальнейшее развитие этой программы. LXF

Таблица функций

Tesseract Cuneiform
Лицензия Apache License 2.0, GPL Своя
Распознавание европейских языков (расширенная латиница) V V
Распознавание русского языка X V
Инструменты обучения V X
Качество распознавания Хуже Лучше
Формат вывода результатов Только текст Текст или форматированный вывод
Персональные инструменты
купить
подписаться
Яндекс.Метрика