Распознавание шрифтов

Я работаю над приложением, которое включает распознавание шрифтов на основе бесплатных символов рисования персонажей в Android Canvas.

В этом приложении пользователю предлагается ввести некоторые предопределенные символы в предопределенном порядке (A,a,B,c). Исходя из этого, есть ли способ показать очень похожий шрифт, который соответствует написанию пользователем.

Я исследовал эту тему, нашел несколько статей и статей, но большинство из них распознает шрифт из захваченного изображения. В этом случае у них возникает много проблем путем сегментации абзацев, отдельных букв и т.д. Но в моем сценарии я знаю, какую букву пользователь рисует.

У меня есть некоторые знания в OpenCV и Machine Learning. Нужна помощь в решении этой проблемы.

Ответ 1

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

В Machine Learning это будет проблемой классификации. количество классов будет равно количеству разных шрифтов в вашей базе данных.

Вы можете решить эту проблему с помощью сверточной нейронной сети, которые широко используются для задач, связанных с распознаванием образов и видео. Если вы никогда не внедряли CNN, прежде чем я предлагаю вам изучить эти ресурсы, чтобы узнать о Torch, который представляет собой простой в использовании инструментарий для внедрения CNN. (Конечно, есть больше Рамки, такие как: Tensor Flow, Caffe, Lasagne,...)

Основным препятствием, с которым вы столкнетесь, является то, что Neural Networks нуждается в тысячах изображений (>100.000), чтобы правильно обучать их и достигать удовлетворительных результатов. Кроме того, вам нужны не только изображения, но и правильная метка для каждого изображения. Скажу, вам понадобится учебный образ, такой как рукописный символ, и соответствующий шрифт, который он соответствует самой из вашей базы данных в качестве метки.

Я бы посоветовал вам прочитать о так называемом переносе обучения, который может дать вам начальный импульс, поскольку вам не нужно настраивать CNN модель полностью одна. Кроме того, у людей есть pre-trained такая модель для связанной задачи, чтобы вам было безопасно дополнительное время, так как вам не понадобилось бы многому тренировать его на GPU. (см. CUDA)

Отличным ресурсом для начала является статья: Насколько переносимы функции в глубоких нейронных сетях?, которые могут быть полезны по указанным причинам.

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

Для доступа к множеству шрифтов и, возможно, даже для возможности создания дополнительных наборов данных вы можете взглянуть на Google Fonts.

Ответ 2

Вы можете найти эту статью очень интересной: https://erikbern.com/2016/01/21/analyzing-50k-fonts-using-deep-neural-networks/

Похоже, это довольно простая глубокая обучающая проблема, связанная с изучением.

Создайте тонну случайно деформированных образцов для букв каждого типа целевого шрифта и нарисуйте конвейн на этом наборе?

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

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

Это хорошее место для начала: https://github.com/fchollet/keras/blob/master/examples/mnist_cnn.py Цифровое распознавание букв с помощью конвертов.

Это довольно немного работы, хотя, если вы раньше не работали с этим материалом.

Ответ 3

Я бы предложил использовать библиотеку OCR tesseract. Очень хорошо развитый и зрелый. Он также поддерживает обучение на других языках, которые вы можете использовать для обучения по набору шрифтов.

Подход

Обучение: -

  • Возьмите все 26 (для каждого алфавита) изображений для n шрифтов. Поезд tessaract более 26 A, затем 26 B и скоро.

Тестирование: -

  • Возьмите предложение и разделите все символы.
  • Для каждого символа найдите определенную оценку (поддерживаемую в библиотеке) от Tesseract. Обратите внимание, что для символа "a" используйте обучаемую модель для всех "a" из разных шрифтов.
  • Для всех символов найдите лучший шрифт, используя некоторую метрику (среднюю, среднюю и т.д.). Например: вы можете суммировать определенную оценку каждого шрифта, полученного для всех символов, и использовать шрифт, который получил максимальный результат.