2011-11-28 3 views
7

Я думаю, что есть некоторые алгоритмы, которые оценивают разницу между нарисованным символом и ожидаемым, или что-то в этом роде. Любая помощь будет оценена :))Каковы некоторые алгоритмы распознавания рукописного ввода по символу?

+0

Существует два вида распознавания рукописного ввода: распознавание символов по мере их намотки (онлайн) и распознавание уже нарисованных символов (в автономном режиме). Существуют разные подходы к распознаванию обоих подходов. Какого из них вас больше интересует? –

+0

один раз нарисовал ОДИН символ, машина сразу распознает его и очищает ввод для следующего. – nicks

+0

Английский или неанглийский, его большая разница –

ответ

8

Вы можете реализовать простую нейронную сеть для распознавания рукописных цифр. Простейшим типом реализации является сеть передачи данных, прошедшая через обратную передачу (ее можно обучать стохастически или в пакетном режиме). Есть несколько улучшений, которые вы можете внести в алгоритм backpropagation, который поможет вашей нейронной сети быстрее учиться (импульс, алгоритм Сильвы и Алмейды, имитированный отжиг).

Что касается разницы между реальным символом и ожидаемым изображением, то один из алгоритмов, который я видел, является k-nearest-neighbor algorithm. Here - это статья, описывающая использование метода k - алгоритм поиска младшего соседа для распознавания символов (Редактирование: Раньше у меня была неправильная ссылка. Ссылка, которую я предоставил, требует, чтобы вы заплатили за бумагу, я пытаюсь найти бесплатная версия статьи).

Если вы использовали нейронную сеть, чтобы научиться распознавать символы, шаги, связанные бы:

  1. Дизайн вашей нейронной сети с соответствующим алгоритмом обучения. Я предлагаю начать с простейшего (стохастического backpropagagation), а затем улучшить алгоритм по желанию, пока вы тренируете свою сеть.
  2. Получите хороший образец данных обучения. Для моей нейронной сети, которая распознает рукописные цифры, я использовал MNIST database.
  3. Преобразование данных обучения во входной вектор для вашей нейронной сети. Для данных MNIST вам необходимо бинаризовать изображения. Я использовал пороговое значение 128. Я начал с Otsu's method, но это не дало мне результатов, которые я хотел.
  4. Создайте свою сеть. Поскольку изображения из MNIST входят в массив из 28x28, у вас есть входной вектор с 784 компонентами и 1 смещение (так 785 входов) в вашу нейронную сеть. Я использовал один скрытый слой с количеством узлов, установленным в соответствии с guidelines outlined here (наряду с уклоном). Ваш выходной вектор будет содержать 10 компонентов (по одному для каждой цифры).
  5. Случайно представляйте данные тренировки (так произвольно упорядоченные цифры со случайным входным изображением для каждой цифры) в вашу сеть и тренируйте его до тех пор, пока он не достигнет желаемого уровня ошибки.
  6. Запустите тестовые данные (данные MNIST также с этим связаны) против вашей нейронной сети, чтобы убедиться, что он правильно распознает цифры.

Вы можете проверить пример here (бесстыдного плагина), который пытается распознавать рукописные цифры. Я тренировал сеть, используя данные из MNIST.

Ожидайте провести некоторое время, чтобы ускориться по концепциям нейронной сети, если вы решите пройти этот маршрут. Мне потребовалось не менее 3-4 дней чтения и написания кода, прежде чем я понял концепцию. Хорошим ресурсом является heatonresearch.com. Я рекомендую начать с попытки внедрения нейронных сетей для имитации логических операций AND, OR и XOR (с использованием функции активации порога). Это должно дать вам представление об основных понятиях. Когда это действительно сводится к обучению вашей сети, вы можете попытаться обучить нейронную сеть, которая распознает булевский оператор XOR; это хорошее место, чтобы начать введение в алгоритмы обучения.

Когда дело доходит до построения нейронной сети, вы можете использовать существующие фреймворки, такие как Encog, но я счел, что создание самой сети гораздо более удовлетворительно (вы узнаете больше, как я думаю). Если вы хотите посмотреть на какой-то источник, вы можете проверить проект, который у меня есть на github (бесстыдный плагин), который имеет некоторые базовые классы на Java, которые помогают вам создавать и обучать простые нейронные сети.

Удачи вам!

EDIT

Я нашел несколько источников, которые используют к -ближайших-соседей цифры и/или распознавания символов:

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

+0

В связанной вами статье используется нейронная сеть, а не К-ближайший сосед. –

+0

@PeterO. Ты прав. Я получил ссылку неправильно. Документ, который я имел в виду, был D.Y. Lee. Название «Распознавание рукописного знака с использованием K« Ближайший сосед »,« Радиальная базовая функция »и« Непрозрачные нейронные сети ». Кажется, я не могу найти ссылку на нее, хотя по какой-то причине. Я уточню свой ответ. Спасибо, что указали это. –

+1

Ах, нейронные сети ... напоминает мне о моих годах в uni, когда я хотел работать в AI ... +1 для ностальгии, это были дни ... – Guillaume

2

Добавление

Если вы не реализовали алгоритмы машинного обучения, прежде чем вы действительно должны проверить: www.ml-class.org

Это свободный класс учил Эндрю Нг, Директор Стэнфордского центра машинного обучения. Курс представляет собой полностью онлайн-курс, посвященный внедрению широкого спектра алгоритмов машинного обучения. Это не слишком усложняет теоретические тонкости алгоритмов, а скорее учит тому, как выбирать, реализовывать, использовать алгоритмы и как их диагностировать. - Уникально в том, что ваша реализация алгоритмов проверяется автоматически! Это здорово для начала работы в машинном обучении, у вас есть мгновенная обратная связь.

Класс также включает в себя как минимум два упражнения по распознаванию рукописных цифр. (Программирование Упражнение 3: с многочленной классификацией и программированием Упражнение 4: с первичными нейронными сетями)

Класс начался некоторое время назад, но его все равно можно зарегистрировать. Если нет, новый запуск должен начаться в начале следующего года. Если вы хотите проверить свои реализации, вам нужно зарегистрироваться для «Расширенного трека».

Один из способов реализации распознавания рукописного текста

Ответ на этот вопрос зависит от ряда факторов, в том числе какого-то ограничение ресурсов у вас есть (встраиваемые платформы) и есть ли у вас хорошая библиотека правильно обозначенные символы: т.е. разные примеры рукописного письма, для которого вы знаете, какую букву они представляют.

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

Я считаю, что машина с векторным носителем будет работать быстрее всего, поскольку есть отличные библиотеки, которые обрабатывают часть кода для обучения компьютера, например. libSVM. Если вы знакомы с использованием алгоритмов машинного обучения, вам потребуется менее 30 минут.

Основная процедура, которую вы, вероятно, хотите реализовать следующим образом:

обучения, что символы «выглядеть»

  1. Binarise изображений в вашей библиотеке.
  2. Разверните изображения в векторы/1-D массивы.
  3. Передайте «векторное представление» изображений в вашей библиотеке и их ярлыки в libSVM, чтобы узнать, как покрытие пикселей относится к изображенному символу для изображений в библиотеке.
  4. Алгоритм возвращает вам набор параметров модели, которые описывают узнаваемый алгоритм распознавания.

Вы должны повторить 1-4 для каждого символа, который хотите распознать, чтобы получить соответствующий набор параметров модели.

Примечание: шаги 1-4 вы должны выполнить только один раз для своей библиотеки (но один раз для каждого символа, который вы хотите распознать). Вы можете сделать это на своей машине разработчика и включать только параметры в код, который вы отправляете/распространяете.

Если вы хотите, чтобы распознать символ:

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

Это тестирование выполняется путем повторного прохождения параметров модели и символа для проверки в развернутой форме в библиотеке SVM, которая вернет доброту соответствия тестируемой модели.

2

вы проверили, Detexify.Я думаю, что это в значительной степени то, что вы хотите http://detexify.kirelabs.org/classify.html

Это с открытым исходным кодом, поэтому вы можете взглянуть на то, как оно реализовано. Вы можете получить код здесь (если я не помню неправильно, это в Haskell) https://github.com/kirel/detexify-hs-backend

В частности, то, что вы ищете должны быть в Sim.hs

Я надеюсь, что это помогает

+0

Почему в Хаскелле? – loretoparisi

+0

Понятия не имею, что вы могли бы спросить Даниэля Кирша ([email protected]), он очень дружелюбен. – JuanPi

+0

Я * думаю * он использует ближайшего соседа в своем коде тоже. –

Смежные вопросы