Каковы некоторые алгоритмы распознавания рукописного текста? - PullRequest
7 голосов
/ 28 ноября 2011

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

Ответы [ 3 ]

8 голосов
/ 08 декабря 2011

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

Что касается разницы между реальным символом и ожидаемым изображением, то один алгоритм, который я видел, использовался: k - алгоритм ближайшего соседа . Здесь - это статья, в которой описывается использование алгоритма k -ближайших соседей для распознавания символов (редактирование : ранее у меня была неправильная ссылка. Предоставленная мной ссылка требует от вас платить за бумагу; я пытаюсь найти бесплатную версию газеты ).

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

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

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

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

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

Удачи!

EDIT

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

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

2 голосов
/ 09 декабря 2011

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

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

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

Надеюсь, это поможет

2 голосов
/ 07 декабря 2011

Приложение

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

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

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

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

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

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

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

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

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

Обучениекакие символы «выглядят»

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

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

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

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

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

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

...