Система распознавания шрифта Брайля. Читаем написанное белым по белому / Хабр
В 2018 году мы взяли из детдома в семью слепую девочку Анжелу. Тогда я думал, что это чисто семейное обстоятельство, никак не связанное с моей профессией разработчика систем компьютерного зрения. Но благодаря дочери через два года появилась программа и интернет-сервис для распознавания текстов, написанных шрифтом Брайля — Angelina Braille Reader.
Сейчас этот сервис используют сотни людей и в России, и за ее пределами. Тема оказалась хайповой, сюжет о программе даже показали в федеральных новостях на ТВ. Но что важнее — за свою многолетнюю карьеру в ИТ ни в одном проекте я не получал столько искренних благодарностей от пользователей.
Ниже расскажу о том, как делалась эта разработка и с какими трудностями пришлось столкнуться. Более развернутое описание приведено в публикациях [1,2].
Возможно, кто-то захочет внести в проект свой вклад.
Лень — двигатель прогресса
Вы все видели брайлевские символы в лифте и в поликлинике. Каждая буква задана выпуклыми точками. Брайль разработал свою азбуку в 1824 году, и ничего лучше для чтения и письма с тех пор не придумали.
Сейчас слепые активно используют компьютеры и смартфоны с голосовым помощником, свободно перемещаются по всему миру без сопровождения, устраиваются на работу, требующую высокой квалификации. Представление о том, что слепые сидят дома и плетут на заказ авоськи, давно устарело.
Но слепые школьники до сих пор читают и пишут на Брайле. Все как у обычных людей. Когда вы последний раз писали страницу текста от руки? А школьники делают это ежедневно, и пропустить этот этап нельзя.
Когда мы отдавали дочь в первый класс, то думали, что будет непросто выучить шрифт Брайля. Но это оказалось ерундовой задачей, не труднее, чем выучить любой незнакомый язык в объеме «алфавит в совершенстве».
А вот дальше сложнее. Дело в том, что брайлевские книги — это выдавленные на белой бумаге пупырышки («точки»), никак не выделенные цветом. Слепые тратят год начальной школы на то, чтобы научиться их нащупывать. У нас такая чувствительность пальцев не развивается за ненадобностью, поэтому 99% брайлевских педагогов и родителей читают это глазами.
Более того! Как и обычная книга, брайлевская книга обычно двусторонняя. Вместе с выступающими точками, которые надо читать, на той же странице есть точки, выдавленные в обратную сторону. Пальцы слепого эти впуклости не замечают, а глаза зрячего видят, и все это вместе превращается в абсолютную кашу. Вообразите, что вы читаете текст на неродном языке, напечатанный светло-серым на прозрачной пленке с двух сторон.
Фрагмент брайлевской книги с двусторонней печатью (вверху). На нижнем фото отмечены те точки, которые надо читать. Остальные точки — это текст с обратной стороны страницы, на них можете не обращать внимание (если сможете).Рукописный брайлевский текст обычно односторонний, читать его несколько легче, но все равно непросто. В Союзе педагоги приспособились тереть работы школьников копиркой, чтобы сделать точки заметнее, но это решает проблему только отчасти.
Вставка для любопытных: как пишут брайлевским шрифтом вручнуюДля письма брайлевским шрифтом вручную используется специальный прибор: планшет, состоящий из 2 металлических пластин, между которыми закладывается лист бумаги. В верхней пластине сделаны прямоугольные прорези, одна ячейка — одна буква. Металлическим грифелем (шилом) продавливают бумагу в углах прорези или в середине боковой стороны, всего 6 мест под точки. В этих местах в нижней пластине сделаны углубления, таким образом получаются выдавленные брайлевские точки. Пишут справа налево в зеркальном отражении. А чтобы прочитать текст, бумагу надо вынуть из прибора и перевернуть.
За время обучения дочки в первом классе мы, оба родителя, так замучились таким чтением, что стали весьма мотивированы что-то с этим делать. Мы решили, что приспособить к чтению Брайля компьютер — намного более полезное занятие для папы в свободное время, чем решать конкурсы на Каггле. Потом оказалось, что это нужно не только моей семье, а буквально всем, кто работает со слепыми.
Хочешь сделать хорошо — сделай сам
Разумеется, я был не первым человеком, который занялся компьютерным распознаванием шрифта Брайля на изображении. Есть даже устойчивый термин: OBR (Optical Braille Recognition). Поэтому для начала я попытался найти готовое решение. Напрасно! В открытом доступе имеются только экспериментальные поделки, непригодные для практического применения. Из коммерческих разработок существует специализированный аппаратно-программный комплекс компании ЭлекЖест размером со стол. Это явно не то решение, о котором я мечтал, цену я даже не уточнял.
Система оптического распознавания Брайля от компании ЭлекЖестПопадались программы для распознавания, но они требовали отсканировать лист, причем со специальным светофильтром. Не слишком удобно, тем более что в стандартный сканер А4 брайлевский учебник не помещается. Но хуже то, что даже со сканером и светофильтром у меня не получилось получить приемлемый результат.
После фиаско с поиском готового решения пришлось переключиться на изучение литературы. Статей по оптическому распознаванию Брайля написано много. Во всех статьях процесс распознавания разбивался на этапы, обусловленные ключевым отличием шрифта Брайля от обычных алфавитов в разных языках.
В обычном письме буквы представлены связанными линиями, а в письме по Брайлю — комбинацией от 1 до 6 точек, расположенных в узлах воображаемой сетки. Группировка точек в буквы определяется привязкой к этой сетке.
Кодирование букв латинского алфавита шрифтом БрайляВне привязки к сетке, образуемой всеми брайлевскими буквами в целом, точки не имеют смысла. Так, если мы видим на пустом листе бумаги букву А, то мы легко понимаем, что это буква А. Если мы видим одинокую брайлевскую точку, нельзя определить, что это такое: буква А, запятая (она обозначается единственной точкой, но в другом узле сетки) или просто дефект бумаги.
Вследствие этого, для описанных в литературе алгоритмов OBR практически стандартом оказывается следующий набор шагов (см. обзоры [3,4]):
Найти брайлевские точки.
Восстановить воображаемую сетку.
Сопоставить найденные точки с узлами сетки.
Распознать брайлевские символы.
Конвертировать последовательность брайлевских символов в обычный текст.
Разные авторы используют разные методы нахождения точек и, главное, отделения точек лицевой и обратной стороны: динамический порог, детектор окружностей на основе преобразования Хафа, HOG, LBP, SVM, признаки Хаара и алгоритм Виолы-Джонса, — в общем, практически весь джентльменский набор методов классического компьютерного зрения. В более поздних работах нейросетки тоже применяют.
После этого для восстановления сетки используют линейную регрессию, преобразования Хафа, изменения гистограмму распределения координат точек при пошаговом повороте листа…
Не буду приводить подробный обзор литературы (его можно найти в [1,3,4]). Важно, что при таком подходе требуется единая на весь лист воображаемая сетка, к которой привязаны брайлевские точки. Именно поэтому страница должна быть не просто сфотографирована, а отсканирована. Только в этом случае на всем листе точки расположены на параллельных линиях сетки. На случай, если страница при сканировании покосилась, описаны методы нахождения необходимого поворота страницы в исходное положение.
Я не нашел никаких методов для компенсации перспективных искажений (а без них фотографию не сделаешь). Еще сложнее, если сфотографирован не одиночный лист, а страница раскрытой книги. Брайлевские книги толстые и плотные, полностью расправить страницу невозможно. Линии сетки превращаются в дуги. Так что по всему выходило, что для применения опубликованных методов нужен сканер, причем специальный — обычный бытовой мал.
А хотелось сделать так, чтобы достаточно было сделать фото на смартфон и — вжух! — получить расшифрованный текст. Пришлось делать самому.
У нее внутре нейронка
Когда я начинал эту работу (2019г), нейронные сети уже вовсю покоряли задачи компьютерного зрения. В литературе по распознаванию Брайля тоже говорилось об их использовании. Но весьма ограниченном, не выходя за пределы описанного выше шаблона: или для поиска точек, или для разделения точек лицевой и обратной стороны, или для распознавания отдельного символа после того, как будет восстановлена сетка и точки поделены на символы.
И это при том, что уже несколько лет как были опубликованы one step детекторы типа YOLO[5] и SSD[6], которые решали задачу поиска объектов на изображении за один шаг, совмещая одновременно несколько функций — детекции, классификации, регрессии ограничивающего прямоугольника. Можно было ожидать, что нейросеть справится одновременно с задачей поиска точек, восстановления брайлевской сетки в окрестности каждого символа и распознавания символа за один проход. Это позволяло отойти от требования наличия единой сетки для всего листа и, соответственно, обрабатывать изображения искривленных листов и изображения с небольшими перспективными искажениями.
За основу я взял RetinaNet[7] с некоторыми изменениями по сравнению с исходными настройками: с учетом того, что мы ищем символы примерно известного размера и пропорций, был изменен набор «якорей» и другие параметры.
В конце концов этот подход дал результат, который я считаю весьма успешным. Но его применение упиралось в серьезную проблему.
Где взять данные, или Мойдодыр спешит на помощь.
Как хорошо известно, для решения обучения нейросети требуется много обучающих данных. И если при решении частных задач вроде поиска и классификации точек или даже отдельных символов каждая страница текста порождает множество обучающих примеров, то для обучения object detection сети необходимы достаточно большие фрагменты текста. Поэтому требуется множество размеченных изображений брайлевских страниц.
Сделать фотографии сотни-другой страниц в разных условиях — несложно. А вот разметка… Как выглядят эти страницы, было показано на рисунке выше, трудоемкость разметки можете себе представить. Идея разметить прямоугольниками каждую букву на сотнях таких страниц совсем не вызывала энтузиазма.
В сети удалось найти единственный публично доступный подходящий датасет: DSBI, опубликованный китайскими товарищами. Он включает 114 размеченных страниц брайлевских текстов. Тексты там на китайском, но это как раз неважно (сами по себе брайлевские символы одинаковы во всех языках). Хуже то, что изображения получены с помощью сканера с идеально плоского листа (это позволило авторам упростить процедуру разметки) и очень мало отличаются друг от друга. Поэтому качественно обучить на нем нейросеть для решения поставленной задачи было невозможно. RetinaNet, обученная на этих данных, выдала на реальных фотографиях брайлевских книг более чем скромный результат — от четверти до половины правильно распознанных символов.
Лучшего я и не ждал. Однако надо же было с чего-то начать! А дальше на помощь пришел подход Active Learning[8].
Идея традиционного Active Learning состоит в том, что мы обучаем нейросеть на имеющихся данных, применяем ее к неразмеченным данным, оцениваем результат (вручную или автоматически с помощью какого-либо критерия), отбираем неразмеченные примеры, которые распознались хуже всех, размечаем их вручную и повторяем обучение на расширенной выборке. И так несколько раз. Тем самым экономятся трудозатраты на разметку тех примеров, с которыми нейросеть и так справляется. Однако в этой задаче я применил полностью противоположный подход. Дело в том, что разметить страницу, состоящую сплошь из ошибок, гораздо сложнее, чем исправить несколько ошибок там, где существенная часть текста внятно распознана.
Особенностью задачи было то, что для многих неразмеченных страниц можно было найти напечатанный там текст в привычном нам виде. Текст, написанный прозой, сопоставить с изображением брайлевской страницы сложно, а вот со стихами все намного проще. Разбивка текста на строки известна, и если в распознанном тексте распознана хотя бы часть символов, которая позволяет идентифицировать строки, то недостающие и ошибочные символы можно восстановить, используя оригинальный текст. Причем лучше использовать даже не стихи, а детские стишки: написанные короткими строками, чтобы не возникало неожиданных переносов строки.
Поэтому первыми русскими текстами, на которых обучалась нейронная сеть, оказались сказки про Мойдодыра, Телефон, Чудо-дерево. Мысль, что иногда автор относится к своему проекту как к собственному ребенку, заиграла новыми красками.
Когда после нескольких итераций активного обучения качество распознавания достаточно повысилось, можно было включить в обучающий набор прозаические тексты. Сопоставлять их с оригинальным текстом так же, как стихи, было уже слишком сложно, но результаты распознавания можно было преобразовать в плоский текст и проверить спелл-чекером. Большая часть ошибок распознавания при этом подсвечивается, так что разметка радикально облегчается.
Описанный подход привел к идее сделать дальнейший процесс полностью автоматическим. Есть известный метод дообучения нейросети на неразмеченных данных — pseudo labeling[9]. Основная идея метода состоит в том, что результаты распознавания тех неразмеченных данных, где нейросеть показала высокую степень уверенности, включают в обучающий набор в дополнение к исходным размеченным данным, и обучение повторяется.
В описываемой работе в этот цикл я включил этап, на котором учитывается, что найденные нейросетью символы существуют не сами по себе, а должны подчиняться определенным правилам. В первую очередь, можно скорректировать положения символов так, чтобы символы образовывали ровные строки, а также проверить получившиеся слова спелл-чекером и исключить те результаты, которые такую проверку не проходят. Такой подход я предложил назвать «семантически усиленной псевдо-разметкой». В общем случае это — включение в процедуру псевдо-разметки этапа, когда автоматически полученная разметка оценивается и корректируются, используя внешние соображения о допустимости полученных результатов. Это дает существенное улучшение результатов по сравнению с обычной псевдо-разметкой (см. [2]). Возможность вытаскивать самого себя за волосы, обучая нейросеть на ее собственных результатах, заканчивается достаточно быстро и ограничена примерами из того же домена, что и исходные размеченные данные. При семантически усиленной псевдо-разметке в процесс обучения включается дополнительная объективная информация. Это не только позволяет использовать больший объем неразмеченных данных, но и дообучить сеть на неразмеченных данных из домена, отличного от того, к которому относятся исходная размеченная обучающая выборка [2].
Обычная (а) и семантически-усиленная (б) псевдо-разметка.В результате применения описанных подходов получалось программное решение, дающее менее 0.5% ошибочных символов при использовании достаточно качественных изображений (хорошая камера, правильное освещение). Я написал простенький сервис на Flask и развернул на домашнем компьютере сервис, которым стал пользоваться я сам и некоторые наши знакомые по сообществу родителей слепых детей.
Кроме того, в результате этой работы получился «наш ответ Китаю»: датасет Angelina Braille Dataset из 240 размеченных фотографий брайлевских текстов. Существенно более сложный и разнообразный по сравнению датасетом DSBI, опубликованным китайскими разработчиками.
Искусство — в массы
Итак, первое время сервис работал на моем домашнем компьютере и количество пользователей прибывало методом сарафанного радио.
В 2021 описываемый сервис стал одним из победителей конкурса World AI & Data Challenge, который проводит Агентство Стратегических Инициатив. В конкурсе участвуют решения самых разных социльных проблем, построенные с помощью AI и Data science. То, что мой проект занял 2-е место в этом конкурсе, привело к двум важным практическим результатам.
Во-первых, АСИ обеспечило информационную поддержку: в специализированные школы по обучению слепых было направлено официальное письмо с поручением ознакомиться с сервисом и дать отзыв. Организовало несколько zoom-конференций с преподавателями-тифлопедагогами. В результате я получил множество очень мотивирующих отзывов. Самый короткий и емкий прозвучал на одной из видеовстреч: «мы ждали эту программу всю жизнь». Но, самое важное — потенциальные пользователи узнали о программе, преодолели «порог вхождения». Только сарафанным радио достичь такого результата было бы невозможно.
Во-вторых, компания Яндекс выделила победителям конкурса грант на использование вычислительных мощностей Яндекс-облака. Я мог больше не держать сервис на своем домашнем компьютере, а разместить его на выделенной машине Яндекса.
Подробное описание опыта работы с облачной структурой Яндекса заслуживает отдельной статьи. Приведу основной вывод, к которому я пришел. Облачная структура Яндекса очень хороша для масштабных вычислений. Возможность запустить сразу несколько серверов с Tesla V100 — это прекрасно. Однако пока там нет возможности развернуть бюджетный слабонагруженный сервис, если для работы требуется GPU. Выделенная машина с Tesla V100 для данной задачи — сильный «оверкилл за оверпрайс». Надеюсь, что со временем и для этой ниши будет предложено подходящее решение.
Решить проблему помог грант Фонда Президенских Грантов, предоставленный АНО «Ангелина» (для эксплуатации сервиса была создана некоммерческая организация). Такие гранты выделяются на различные социальные проекты. В данном случае грант был выдан на приобретение выделенного сервера и размещение его в дата-центре. Пока это оказывается более доступным способом развертывания малонагруженного интернет-сервиса, требующего GPU, чем облачная структура.
Так что, проблема решена?
До сих пор я говорил о проблеме оптического распознавания письма на Брайле. И за кадром осталась задача преобразования шрифра Брайля в обычный текст.
Дело в том, что в брайлевской азбуке всего 63 символа. Нет привычных зрячим людям подчеркиваний, курсива, верхних и нижних индексов и т.п. Буквы разных языков, цифры, математические знаки кодируются одними и теми же символами. Например, символы б, Б, b, β, 2 — это один и тот же брайлевский символ ⠃. Значение зависит от контекста. Например, перед числом ставится специальный числовой знак ⠼. Т.е. ⠼⠃⠃ — это «22». Другие правила сложнее. А полное описание использования шрифта Брайля, включая математические уравнения, дроби, использование различных языков, символов №, %, $, синтаксический и грамматический разбор предложения и т.п. занимает десятки страниц и очень напоминает Драконий Покер Р.Асприна. Кроме того, в английском языке существует система сокращений, когда длинные распространенные слова заменяются более короткими (вместо immediate пишут imm, а вместо friend — fr и т. д.).
Сейчас в сервисе эти правила реализованы в минимальном объеме, достаточно прямолинейно: в виде проверки различных условий и переключения в зависимости от них на на различные словари трансляции. Вряд ли разумно дальше развивать этот подход. И не только потому, что исходный код станет совсем нечитаемым. Многие соглашения используются неформально, предполагают контекст. Так, есть специальный символ, обозначающий переход с русского языка на английский. Но иногда он может применяться к отдельному слову, иногда ко всему следующему тексту, пока не встретится знак перехода на русский. Иногда его не ставят вовсе, если фразы вроде «O, yes, — только и смог сказать сыщик» читают интуитивно.
Существует open source библиотека Liblouis для конвертации между Брайлем и обычным плоским письмом, но в основном она применяется для преобразования плоского письма в Брайль, эта задача намного проще. Обратный перевод там реализован плохо, особенно для русского языка.
Думаю, для решения задачи перевода брайлевского текста в обычный нужно применять подходы, основанные на машинном обучении. Но тут снова мы упираемся в вопрос, где взять обучающую выборку.
Так что проблем еще хватает. Описанная — главная, но не единственная. Есть что улучшить и в оптическом распознавании, и в веб-интерфейсе. Проект открытый, буду рад сотрудничеству. Репозитории на GitHub:
Собственно система распознавания Angelina Braille Reader
Angelina Braille Dataset
Веб-интерфейс
Литература
1. Ovodov I. G. Optical Braille Recognition Using Object Detection Neural Network //Proceedings of the IEEE/CVF International Conference on Computer Vision. – 2021. – С. 1741-1748.
2. Ovodov I. G. Semantic-based annotation enhancement algorithm for semi-supervised machine learning efficiency improvement applied to optical Braille recognition //2021 IEEE Conference of Russian Young Researchers in Electrical and Electronic Engineering (ElConRus). – IEEE, 2021. – С. 2190-2194.
3. A review on software algorithms for optical recognition of embossed braille characters / V. Udayashankara [и др.] // International Journal of computer applications. — 2013. — Т. 81, № 3. — С. 25—35.
4. Isayed, S. A review of optical Braille recognition / S. Isayed, R. Tahboub //2015 2nd World Symposium on Web Applications and Networking (WSWAN). — IEEE. 2015. — С. 1—6.
5. Joseph Redmon, Santosh Divvala, Ross Girshick, and Ali Farhadi. You only look once: Unified, real-time object detection. In Proceedings of the IEEE conference on computer vision and pattern recognition, pages 779–788, 2016
6. Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, Scott Reed, Cheng-Yang Fu, and Alexander C Berg. Ssd: Single shot multibox detector. In European conference on computer vision, pages 21–37. Springer, 2016
7. Tsung-Yi Lin, Priya Goyal, Ross Girshick, Kaiming He, and Piotr Dollar. Focal loss for dense object detection. In ´ Proceedings of the IEEE international conference on computer vision, pages 2980–2988, 2017
8. Settles B. Active learning literature survey. University of Wisconsin //Computer Science Department. – 2010.
9. Lee D. H. et al. Pseudo-label: The simple and efficient semi-supervised learning method for deep neural networks //Workshop on challenges in representation learning, ICML. – 2013. – Т. 3. – №. 2. – С. 896.
Распознавание гарнитуры шрифта
Распознавание гарнитуры шрифтаВсем знакома проблема, когда необходимо подобрать шрифт, идентичный образцу. Как ни странно, хотя эта задача програмно решается гораздо проще и требуется даже чаще, чем распознавание текста, программ для распознавания текста множество, а для распознавания шрифта — практически нет. Существующие программы распознавания текста (FineReader и т.д.) гарнитуру распознанного текста распознают очень убого. Лично для меня задача осложняется еще и тем, что обычно в данный момент из всех шрифтов, имеющихся на компьютере, подключено только несколько необходимых, а остальные тысячи шрифтов разбросаны по множеству шрифтовых папок. Поэтому приходится часами сидеть и подбирать руками шрифт через ATM или FontLister. Можно, конечно, написать вопрос в шрифтовую эху или MyFonts, но какой смысл, если подскажут шрифт, которого в наличии нет, а задача состоит именно в том, чтобы подобрать максимально похожий шрифт из имеющихся на компьютере? Облазив весь интернет, я обнаружил, что лучше всего для решения данной проблемы подходит программа
Font Expert. Программа очень сырая, до коммерческого вида, судя по всему, так и не была доведена. Похоже, проект провалился десять лет назад. И тем не менее, ничего более подходящего для автоматического подбора шрифтов я не нашел, хотя есть море фонтменеджеров, просмотрщиков и каталогизаторов шрифтов а так же OCR программ.В Font Expert можно выделить отдельный символ на растровом изображении, задать ему в соответствии символ из таблицы, после чего, нажав на кнопку Result, получить список шрифтов, подходящих для этого символа с процентом соответствия и тут же просмотреть их. Затем, при желании, выбирая несколко характерных символов из шрифта, уточнить распознанный результат. Несмотря на то, что программа была написана еще в 1996 году на 16-битном Delphy 1.0, алгоритм распознавания достаточно мощный, я проверял на базе из 3000 шрифтов гарнитура распознается мгновенно и практически безошибочно. Основной недостаток лежащей в интернете демоверсии в том, что к ней прилагается шрифтовая база из практически бесполезных 17 шрифтов, а возможность генерировать собственную базу отсутствует. Это подвигло меня на написание такого конвертера, который, имея на входе каталог со шрифтами ( TrueType или Type1) создает шрифтовую базу под программу Font Expert, при помощи которой можно автоматически подбирать шрифт из этого каталога. Возможно создать несколько баз для разных шрифтовых каталогов и подключать их к программе Font Expert по очереди. Ниже я постараюсь описать процесс инсталляции, создание шрифтовой базы и распознавание шрифтов при помощи данных программ. Инсталляция программ. Демо версию программы Font Expert можно взять на сайте производителя, кому лень искать, можно скачать отсюда. Это обычный ZIP архив, его достаточно распаковать в любой каталог. Как я уже говорил, это практически бесполезная демоверсия программы, шрифтовая база которой содержит 17 шрифтов, русские символы отсутствуют. Чтобы она полноценно работала, для нее нужно создать шрифтовую базу из имеющихся на компьютере шрифтов. Для этого и создана программа Font base creator. Ее достаточно просто переписать на компьютер безо всякой инсталляции. Для работы ей требуется стандартная MFC библиотека MFC42.DLL, которая практически у всех установлена, а если и нет, то легко находится в интернете. Создание шрифтовой базы. Запустите t1.exe. Интерфейс достаточно прост. Для выбора каталога со шрифтами нужно нажать кнопку Fonts folder. Выбирать надо любой файл из каталога содержащего шрифты TTF или пары PFM-PFB файлов. После выбора список доступных шрифтов из каталога появится в левом окне. Для выбора програмного каталога Font Expert нужно нажать кнопку Fexpert folder. При этом выбирается файл fontexpt.exe. После выбора он прописывается в реестр и повторно выбирать его уже не требуется. Для создания шрифтовой базы необходимо нажать кнопку Make base, предварительно выбрав шрифтовой каталог. Для генерации базы в каталоге должен быть как минимум один доступный шрифт. Программа запросит каталог для создания базы — необходимо выбрать любой файл из такого каталога. Если в таком каталоге уже есть база (она находится в подкаталоге FEXDATA) то программа спросит, добавлять ли шрифты в существующую базу. При ответе Yes шрифты добавляются в конец базы, при ответе No база перезаписывается заново, имеющиеся там шрифты теряются, при ответе Cancel можно выбрать другой каталог, в котором базы нет. База генерируется достаточно долго, но эту операцию нужно проделать всего один раз для каждого каталога, последующее подключение каталогов и распознавание практически мгновенно. Советую перед добавлением шрифтов в существующую базу сохранить старую (весь каталог FEXDATA), потому как, если во время добавления в базу произойдет сбой, то база испортится. Процесс генерации базы отображается двумя ползунками внизу, верхний — обработка текущего шрифта, нижний — весь каталог шрифтов. В принципе, можно переписать все шрифты, имеющиеся на компьютере в один каталог, и потом использовать для распознавания базу, сгенерированную на основе него. Какого-то ограничения на количество шрифтов в шрифтовой базе я не заметил, однако в программе-генераторе максимальное количество шрифтов 5000. На скорость распознавания количество шрифтов в базе тоже практически не влияет, разве что, необходимо приблизительно прикинуть место на диске, занимаемое базой, потому что каждый шрифт прибавляет к базе примерно 50 килобайт. То есть, база, состоящая из 1000 шрифтов, будет занимать на диске около 50 мегабайт. В конце процесса программа спросит, индексировать ли сгенерированую базу. При индексации в базе упорядочиваются шрифты и выбрасываются одинаковые. Какие именно шрифты были выброшены в ходе этого процесса, подробно можно посмотреть по завершению, в файле index.log, который создается в корне выбранного каталога. Подключить уже сгенерированую шрифтовую базу к программе Font Expert можно кнопкой Select base. При этом нужно выбрать каталог FEXDATA базы, в котором находится файл fontlist.all. Этот каталог просто скопируется на соответствующее место в программу Font Expert. При этом в рабочем каталоге программы Font Expert создается и русская версия программы Fontexru.exe, распознающая только кириллические символы, о которой речь пойдет ниже. Следует заметить, что создание и выбор базы, а так же создание русской версии возможно для приведенной здесь версии программы Font Expert 2.0 E Demo размером 568976 байт. Для других версий программа будет выдавать ошибку «Unknown version FEXPERT». Программа Font Expert Я не буду переводить здесь полное руководство пользователя по программе Font Expert, кто хочет, может найти его на сайте производителя или в програмном каталоге (файл manual.wri), а просто приведу свои краткие рекомендации по распознаванию шрифта. Как я уже говорил, принцип работы в следующем: загружается растровое изображение, на нем выбирается символ, ему ставится в соответствие символ из таблицы, после чего появляется список более-менее подходящих шрифтов с процентом соответствия. Для уточнения списка выбирается следующий символ и вся процедура повторяется, пока не подберется шрифт, более-менее подходящий под все требуемые символы. Интерфейс программы выглядит так: Сверху на панели Tools видны следующие инструменты для выбора символа (слева направо-сверху вниз): Волшебная палочка. Ей удобнее всего выбирать символ, если он стоит отдельно от других и ни с чем не соприкасается, в противном случае будет выделен и соприкасающийся с ним кусок и распознавание будет неточным. Криволинейное выделение. Выделение произвольного фрагмента изображения не прямоугольной формы. Выделение прямоугольного фрагмента. При всех трех приведенных выше способах выделения текста клавиша Shift работает аналогично Photoshop, при удерживаемом Shift можно выделять одновременно несколько не связанных фрагментов растрового изображения, что удобно, скажем, при выборе символов «i» или «ы». Резинка. Ей можно удалять лишние фрагменты с выделяемого изображения. Инверсия. Этим инструментом удобно пользоваться при распознавании белого текста на темном фоне или при распознавании изображения не в монохромном формате, об этом будет написано ниже. Поворот изображения на произвольный угол. Практически бесполезная опция, к тому же работает крайне медленно. Проще повернуть изображение в Photoshop или другой программе перед тем, как поместить его в Font Expert. Просмотреть подключенную к программе базу базу шрифтов можно, выбрав пункт меню Window->Database. В окне отображается список шрифтов с картинкой на каждый. Можно перейти на нужный шрифт по первым буквам названия, используя кнопку Search: Загрузка растрового изображения в программу Font Expert. Создатели программы довольно небрежно отнеслись к этому моменту. Теоретически, через пункт меню File->Open можно открывать растровые файлы форматов BMP,JPG,GIF и PCX, однако, у меня реально получилось нормально загружать только монохромные BMP файлы, остальные выдают какую-то странную ошибку. Конвертировать каждый файл в монохромный BMP для загрузки в Font Expert довольно неудобно, поэтому я даже собирался переделать программу в виде Plugin к Photoshop, но, к счастью, программа может работать с клипбоардом. То есть, если в любой графической программе выделить фрагмент изображения, сделать ему Copy, затем перейти в программу Font Expert и сделать Edit->Paste (которое почему-то разработчики назвали Pate ;-), то искомый фрагмент появится в окне распознавания, которое даже размер свой под него изменит. Это касается и векторного изображения. Скажем, бывают случаи, когда текст переведен в кривые, но необходимо узнать, каким шрифтом был набран этот текст изначально. Для этого необходимо сначала в исходной программе увеличить текстовый размер до 5-7 сантиметров в высоту и скопировать в клипбоард. После этого необходимо перейти в программу Font Expert и сделать Edit->Paste. Но тут есть небольшая сложность. Как видно из рисунка, даже если исходный фрагмент был монохромным, переноска через клипбоард делает его цветным. Визуально это видно плохо, однако на панели Tools в этом случае не активны кнопки прямоугольного и кривоугольного выделения и поворота. Беда не велика, но и текст в этом случае не однородно черный, и при попытке выделить его волшебной палочкой, буквы рассыпаются. Тут нам и пригодится инструмент «негатив». Выбираем его и тыкаем в любое место на белом фоне: Как видно, изображение практически не испортилось, но стало монохромным. Проделаем эту операцию еще раз и текст можно смело распознавать. Для более корректного распознавания шрифта необходимо правильно задать размер. Как я уже говорил, для векторных символов оптимальной является высота 5-7 сантиметров. Для растрового изображения вполне достаточно сканирования текста с разрешением 300-600 dpi, но после этого, для лучшего распознавания неплохо увеличить изображение так, чтобы каждая буква была высотой 150-200 пикселов. К сожалению, гарнитура не распознается, если шрифт был каким-то образом искажен (сжат, растянут, сдвинут, повернут) или каким-то другим способом изменены его пропорции. Процесс распознавания гарнитуры шрифта. После того, как фрагмент был помещен в программу Font Expert и нужный символ был выделен волшебной палочкой или каким-либо другим способом, ему надо поставить в соответствие символ из таблички, нажав на соответствующую клетку: В данном примере мы распознаем русские символы, поэтому используется программа Fontexru. exe. Это русская версия программы, которая создается в програмном каталоге Font Expert при выборе шрифтовой базы. Она отличается от Fontexpt.exe панелью выбора символов: Как видно, на ее панели только русские символы, в то время как на панели Fontexpt.exe только английские символы и цифры: Нажав на кнопку Result мы получаем искомый шрифт и процент соответствия, в данном случае это однозначно Baltica — вариант практически идеальный. Не стоит пугаться, что нет 100% соответствия, как показывает практика, лучшее соответствие — максимум 97-98%. Гораздо чаще встречаются варианты, когда текст или слишком плохого качества или у него каким-то способом испортились пропорции или выбран нехарактерный символ или же просто шрифт отсутствует в базе, но отдельные символы разбросаны по разным шрифтам. В данном примере выбранному символу «Э» лучше всего соответствует шрифт, отличный от того, которым этот текст был набран. Используя кнопку «Simular fonts» выбираем шрифт из похожих: Список похожих шрифтов может быть достаточно длинным, следует помнить, что шрифты с соответствием менее 91% скорее всего совершенно не подходят. Насколько я понимаю, сравнение любого шрифта с любым не дает соответствия ниже 50%. Однако, не стоит сбрасывать со счетов и шрифты менее 91%, бывает так, что искомый шрифт лежит именно в этой области. Вообще, очень ускоряет процесс распознавания выбор символов с очень характерным начертанием (наличие засечек, декоративных элементов в необычных для стандартных символов местах). Чаще всего именно на этих символах гарнитура распознается с первой попытки. Если же шрифт сам по себе мало отличается от многих подобных (например Arial, Pragmatica и т.д.), то распознанный шрифт надо уточнять по другим символам. В нижеприведенном примере по символу «В» шрифт распознается с очень хорошим соответствием, как PragmaticaKMM: Однако, если продолжить процесс и распознать букву «А», то по этим двум буквам шрифт правильно распознается, как Arial: К распознаванию гарнитуры нужно подходить творчески — программа если даже и не распознает гарнитуру, то сужает список шрифтов для поиска, попутно подсказывая в количественном отношении процент «похожести» данного шрифта, предоставляя пользователю самому судить, подходит данный шрифт ему или нет. Свои вопросы и пожелания пишите мне на [email protected].
Как мы создали механизм распознавания шрифтов | by pixolution
Photo by DREW GILLIAM on UnsplashДа, мы в pixolution, естественно, больше любим изображения, чем шрифты. Но у нас был интересный проект с поставщиком программного обеспечения из Портленда Extensis, который специализируется на управлении активами шрифтов и бренд-менеджменте.
В этом конкретном случае Extensis попросила нас обучить модель ИИ, способную классифицировать шрифты. Идея заключалась в том, чтобы создать сервис, в котором пользователи могли загрузить изображение с текстом, выбрать одно или два слова и определить тип шрифта. Процесс создания этой модели был настолько интригующим и сложным, что было бы позором не поделиться им с вами.
Работа с большими даннымиМы обучили нейронную сеть, способную классифицировать используемый тип и вариант шрифта во входном изображении — из 370 изученных типов шрифтов. Модель нуждается только в одном или двух словах в качестве образца ввода и не зависит от языка, от конкретного слова, фона, цвета и размера.
Кроме того, нам пришлось реализовать конвейер предварительной обработки для нормализации пользовательского ввода перед идентификацией шрифта.
Как всегда, при обучении моделей ИИ самое главное — иметь разумные данные для обучения. Таким образом, создание достаточно большой базы данных для обучения глубокой сверточной сети с нуля было наиболее сложной задачей. В общем 90% работы — создание и улучшение обучающих данных при разработке модели ИИ. Поскольку мы могли генерировать наши обучающие данные вместо их сбора, мы смогли обучить модель с нуля.
Сначала мы собрали из Интернета списки слов на английском и немецком языках, в общей сложности 450 000 слов. Мы реализовали скрипт Python, который случайным образом выбирает 1-2 слова из этого объединенного списка слов и отображает их в файле изображения. Идея использования настоящих слов вместо случайных букв заключалась в том, чтобы отразить различные вероятности появления — а значит, важность определенных букв — в текстах реального мира. Тем не менее, мы вставили несколько случайных букв, чтобы модель не научилась буквосочетаниям.
1. Почему проваливаются проекты корпоративного ИИ?
2. Как ИИ будет способствовать следующей волне инноваций в здравоохранении?
3. Машинное обучение с использованием регрессионной модели
4. Лучшие платформы обработки данных в 2021 г., кроме Kaggle
Для каждого шрифта мы создали 3000 изображений со случайными словами. И для каждого из этих изображений мы сгенерировали 20 дополненных версий. В сумме это составляет до 60 000 обучающих образцов для каждого шрифта и около 23 миллионов изображений в целом.
Было важно, чтобы все слова отображались с одинаковой высотой пикселя, чтобы сеть по ошибке не научилась различать шрифты по размеру.
Затем мы дополнили эти визуализированные изображения различными модификациями, чтобы сделать модель более устойчивой к шуму и отвлекающим визуальным элементам, таким как цвета фона, тени, перекрытия, кадрирование и т. д. Отличной средой для увеличения изображений является imgaug. Мы использовали его для увеличения каждого образца 20 раз.
Несколько случайных выборок, используемых в качестве входных данных для обучения.Получив данные для обучения, мы перешли к обучению модели GoogLeNet. Фаза тестирования была очень приятной, так как точность валидации составила более 98%. Неплохо, правда?
Пользователи службы распознавания шрифтов загружают изображение и выбирают область из одного или двух слов. Затем это субизображение классифицируется моделью ИИ. Конечно, реальные пользователи не будут предоставлять идеальные входные данные. Они могут содержать несколько строк текста с разным шрифтом и размером изображения. Чтобы избежать потери точности, мы внедрили конвейер предварительной обработки для нормализации ввода.
Нормализация пользовательского вводаВо-первых, мы применяем ядро эрозии для создания маски связанных областей, которая приблизительно представляет строки текста. Мы определяем самую большую область и вычисляем ее ограничивающую рамку. Если мы нашли такую область, мы обрезаем входное изображение до этой ограничивающей рамки, чтобы удалить несколько строк и смещений из входного изображения и получить одну строку с текстом.
Шаги обработки для нормализации входного изображенияЗатем мы применяем адаптивный порог (алгоритм CLAHE) для автоматического выравнивания цветовых каналов. После увеличения резкости изображение масштабируется до фиксированной высоты с сохранением соотношения сторон. Мы обрезаем ширину до фиксированной ширины и центрируем полученное изображение в квадратном изображении (256×256 пикселей). Теперь изображение нормализовано и используется в качестве входных данных для модели классификации.
Мы с гордостью можем сказать, что достигли всех целей проекта с Extensis и обязательно продолжим нашу работу в области распознавания шрифтов.
Есть несколько вещей, которые мы можем улучшить. В настоящее время система не может работать с повернутым текстом, и вход модели должен быть изменен, поэтому нам не нужны квадратные изображения. Мы многому научились и с нетерпением ждем масштабирования системы для распознавания сотен тысяч шрифтов.
Если вам также нужна индивидуальная модель ИИ, просто свяжитесь с нами. Нам любопытно, куда наше путешествие приведет нас в следующий раз.
Ван разрабатывает систему распознавания шрифтов для Adobe | Электротехника и вычислительная техника
03.12.2015
Ашиш Валентайн, ECE ILLINOIS
Дизайнер, работающий в рекламной фирме-бутике, пытается выбрать идеальный шрифт для своего нового баннера. Размышляя над проблемой по дороге домой на автобусе, она вдруг замечает на улице афишу концерта, на которой изображен только шрифт.
Автобус останавливается на несколько секунд, чтобы выпустить пассажира, и она достает свой телефон, фотографируя плакат. Приложение немедленно отвечает названием шрифта, и она в тот же вечер вставляет его в свою рекламу.
Ван (8-й слева) на летнем мероприятии Adobe. Это программное обеспечение, которое главный научный сотрудник Adobe Хайлин Джин на конференции MAX назвал «Shazam для шрифтов», — это DeepFont. Более того: это не гипотетическая технология — она уже поставляется с последними версиями Adobe Photoshop и Typeset.
DeepFont был проектом аспиранта Чжанъяна «Атлас» Вана с тех пор, как он проходил стажировку в Adobe Research в 2014 году, и он горд тем, что наконец-то получил его вместе с флагманскими продуктами компании.
Снимки экрана из DeepFont, идентифицирующие шрифт, наиболее близкий к рукописному тексту. Пользователь фотографирует текст, затем приложение анализирует его и предлагает список шрифтов, которые, возможно, соответствуют тексту. Перед его выпуском демонстрация программного обеспечения была представлена аудитории профессионалов дизайна на конференции MAX под бурные аплодисменты. С тех пор DeepFont получил несколько одобрений от дизайнеров и фирм по всему миру, лишь некоторые из которых видны в его быстро растущем хэштеге в Твиттере.
Распознавание шрифтов крайне необходимо дизайнерам, которые традиционно полагаются на профессионалов, которые взимают высокую плату и в среднем тратят от 45 минут до часа на надежное определение шрифтов.
«Я рад удовлетворить потребность, которую дизайнерское сообщество так долго ощущало», — сказал Ван. «Определенно есть чувство выполненного долга, когда людям нравится то, что вы разработали, это прекрасное чувство».
Само программное обеспечение работает с использованием нового типа машинного обучения, называемого глубоким обучением, целью которого является создание алгоритмов, имитирующих человеческий мозг, путем непрерывного обучения, распознавания закономерностей и улучшения их производительности.
Atlas WangWang и его команда начали с создания базы данных реальных изображений с текстом и обучения алгоритма основам распознавания шрифтов. Они разработали алгоритм для работы с этим обучением, подавая ему новые примеры и позволяя ему распознавать закономерности. Он будет постоянно совершенствовать свои способности распознавания.
В недавно опубликованной статье команда Ванга также продемонстрировала свою способность учитывать текст, сфотографированный под углом или частично закрытый тенями. Алгоритм является дополнением к продуктам Adobe, таким как Photoshop, и имеет достаточно небольшой размер, чтобы работать на мобильных телефонах.
«У меня была невероятная возможность поработать с Adobe над DeepFont, это определенно была одна из лучших стажировок, которые у меня были», — сказал Ван. «Помимо того, что наша разработка меняет правила игры, люди в Adobe всегда были очень дружелюбны и увлечены своей работой. Команды были небольшими и достаточно специализированными, чтобы я мог регулярно встречаться за обедом с руководителем разработки Photoshop. Она могла точно сказать мне, как она хочет, чтобы DeepFont выглядел и чувствовал себя, и я мог внедрить ее спецификации в тот же день».
С выпуском DeepFont Ван надеется на еще более широкое распространение своей технологии распознавания шрифтов и, в конечном итоге, на завершение своего образования и продолжение карьеры в академических кругах. Его советник, почетный профессор и профессор-исследователь Томас С. Хуанг, впечатлен его производительностью и исследовательскими способностями, особенно его способностью сбалансировать разработку DeepFont и одновременное проведение других направлений исследований.