Распознавание цифр, написанных от руки, с помощью Machine Learning

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

Распознавание рукописного текста – это огромная проблема, так как существует всего 10 цифр, а почерк человека может сильно варьироваться. И порой с задачей распознания рукописного текста не справляется даже сам человек, что уж говорить о почерке врача 😊

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

В этой статье я хочу рассмотреть распознавание рукописных цифр от 0 до 9, с использованием известного набора данных digits библиотеки Scikit-learn, применяя классификатор логистической регрессии.

Кратко о наборе данных digits

Область данных digits содержит некоторое множество наборов данных, которые могут быть полезны для тестирования задач анализа данных и прогнозирования результатов.

Для того чтобы работать с распознаванием рукописного текста, вам понадобятся следующие библиотеки: matplotlib, sklearn, scipy.

На примере встроенного набора данных библиотеки sklearn — digits рассмотрим выполнение распознавания цифр. Для этого импортируем его, чтобы начать использовать.

import sklearn.datasets dd = datasets.load_digits() print(dd.DESCR)
Распознавание цифр, написанных от руки, с помощью Machine Learning

Область данных digits представляет собой словарь, в котором содержатся данные, целевые объекты, изображения, а также названия объектов и описание набора данных с названиями целевых объектов и пр.

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

m_d=dd['data'] tt=dd['target'] print(len(m_d)) import matplotlib.pyplot as pltt %matplotlib inline def show_cifr(index): pltt.imshow(dd.images[index],cmap=pltt.cm.gray_r, interpolation='nearest') pltt.title('Цифра: ' + str(dd.target[index])) pltt.show() show_cifr(8)
Распознавание цифр, написанных от руки, с помощью Machine Learning

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

Классификатор опорных векторов

Задача этого алгоритма заключается в том, чтобы найти гиперплоскость в n-мерном пространстве, где n – это число признаков, чтобы проклассифицировать все точки данных.

Распознавание цифр, написанных от руки, с помощью Machine Learning
from sklearn import svm svm = svm.SVC(gamma = 0.001, C=100.) svc.fit(m_d[:1790], tt[:1790]) pr = svc.predict(m_d[1791:]) pr, tt[1791:]
Распознавание цифр, написанных от руки, с помощью Machine Learning

На выходе мы получили 100% совпадение, где 1791 значение используется для обучения, а 6 входных данных используются для тестирования.

Распознавание цифр, написанных от руки, с помощью Machine Learning

Классификатор деревьев решений

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

from sklearn.tree import DecisionTreeClassifier dt = DecisionTreeClassifier(criterion = ‘gini’) dt.fit(m_d[:1550] , tt[:1550]) pr2 = dt.predict(m_d[1551:] import sklearn.metrics.accuracy_score import sklearn.metrics.confusion_matrix confusion_matrix(tt[1551:], pr2)
Распознавание цифр, написанных от руки, с помощью Machine Learning
accuracy_score(tt[1551:], pr2)
Распознавание цифр, написанных от руки, с помощью Machine Learning

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

Классификатор случайного леса

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

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

import sklearn.ensemble.RandomForestClassifier rc = RandomForestClassifier(n_estimators = 150) rc.fit(m_d[:1400], tt[:1400]) pr3 = rc.predict(m_d[1401:]) accurace_store(tt[1401:], pr3)
Распознавание цифр, написанных от руки, с помощью Machine Learning

Таким образом, мы можем увидеть, что случайный лес отлично работает на меньшем количестве данных в сравнении с деревом решений. Оценка точности составляет 92%.

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

Удачи в кодировании! 😊

11
1 комментарий

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

Ответить