Распознавание рукописного текста — это проблема, которая восходит к первым автоматическим машинам, которым нужно было распознавать отдельные символы в рукописных документах. Подумайте, например, о почтовых индексах на письмах в почтовом отделении и об автоматизации, необходимой для распознавания этих пяти цифр. Безупречное распознавание этих кодов необходимо для автоматической и эффективной сортировки почты. В число других приложений, которые могут прийти на ум, входит программное обеспечение OCR (оптическое распознавание символов). Программное обеспечение OCR должно читать рукописный текст или страницы печатных книг для обычных электронных документов, в которых каждый символ четко определен. Но проблема распознавания почерка восходит еще дальше, а точнее к началу 20 века (1920-е годы), когда Эмануэль Гольдберг (1881–1970) начал свои исследования по этому вопросу и предположил, что статистический подход был бы оптимальным выбором.
Чтобы решить эту проблему в Python, библиотека scikit-learn предоставляет хороший пример, чтобы лучше понять этот метод, связанные с ним проблемы и возможность делать прогнозы.
библиотека scikit-learn:
Библиотека scikit-learn (https://scikit-learn.org/) позволяет нам подойти к этому типу анализа данных способом, который немного отличается от того, что мы использовали в предыдущем проекте. Я тесно связал анализируемые данные с числовыми значениями или строками, но также могу использовать изображения и звуки.
Цель:
Основная цель этого проекта включает в себя предсказание числового значения, а затем чтение и интерпретацию изображения, использующего рукописный шрифт.
у нас будет оценщик с задачей обучения с помощью функции fit(), и как только он достигнет степени прогностической способности (достаточно достоверной модели), он выдаст прогноз с помощью функции predict(). Затем мы обсудим обучающий набор и проверочный набор, созданный на этот раз из серии изображений.
Гипотеза, которую необходимо проверить:
Набор данных Digits библиотеки scikit-learn предоставляет многочисленные наборы данных, которые полезны для тестирования многих задач анализа данных и прогнозирования результатов. Некоторые ученые утверждают, что он точно предсказывает цифру в 95% случаев. Выполните анализ данных, чтобы принять или отклонить эту гипотезу.
Набор цифр
Библиотека scikit-learn предоставляет множество наборов данных, полезных для тестирования многих задач анализа данных и прогнозирования результатов. Также в этом случае имеется набор изображений с названием Digits. Этот набор данных содержит 1797 изображений размером 8x8 пикселей. Каждое изображение представляет собой рукописную цифру в оттенках серого.
Выполнение:
Импорт набора данных
В библиотеке scikit-learn есть пакет наборов данных. Эти наборы данных полезны для понимания алгоритма машинного обучения или библиотечной функции.
Импортируйте модуль наборов данных из библиотеки sklearn и загрузите набор данных с помощью функции load_digits().
from sklearn import datasets digits = datasets.load_digits()
Описание набора данных
После загрузки набора данных мы можем прочитать информацию о наборе данных, вызвав атрибут DESCR.
Текстовое описание набора данных, авторы, которые участвовали в его создании, и ссылки будут отображаться, как показано в выходных данных.
print(digits.DESCR) Output: .. _digits_dataset: Optical recognition of handwritten digits dataset -------------------------------------------------- **Data Set Characteristics:** :Number of Instances: 5620 :Number of Attributes: 64 :Attribute Information: 8x8 image of integer pixels in the range 0..16. :Missing Attribute Values: None :Creator: E. Alpaydin (alpaydin '@' boun.edu.tr) :Date: July; 1998 This is a copy of the test set of the UCI ML hand-written digits datasets https://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits The data set contains images of hand-written digits: 10 classes where each class refers to a digit. Preprocessing programs made available by NIST were used to extract normalized bitmaps of handwritten digits from a preprinted form. From a total of 43 people, 30 contributed to the training set and different 13 to the test set. 32x32 bitmaps are divided into nonoverlapping blocks of 4x4 and the number of on pixels are counted in each block. This generates an input matrix of 8x8 where each element is an integer in the range 0..16. This reduces dimensionality and gives invariance to small distortions. For info on NIST preprocessing routines, see M. D. Garris, J. L. Blue, G. T. Candela, D. L. Dimmick, J. Geist, P. J. Grother, S. A. Janet, and C. L. Wilson, NIST Form-Based Handprint Recognition System, NISTIR 5469, 1994. .. topic:: References - C. Kaynak (1995) Methods of Combining Multiple Classifiers and Their Applications to Handwritten Digit Recognition, MSc Thesis, Institute of Graduate Studies in Science and Engineering, Bogazici University. - E. Alpaydin, C. Kaynak (1998) Cascading Classifiers, Kybernetika. - Ken Tang and Ponnuthurai N. Suganthan and Xi Yao and A. Kai Qin. Linear dimensionalityreduction using relevance weighted LDA. School of Electrical and Electronic Engineering Nanyang Technological University. 2005. - Claudio Gentile. A New Approximate Maximal Margin Classification Algorithm. NIPS. 2000.
Каждый набор данных в библиотеке scikit-learn имеет поле, содержащее всю информацию.
Цели
Числовые значения, представленные изображениями, т. е. цели, содержатся в массиве digit.targets.
digits.target Output: array([0, 1, 2, ..., 8, 9, 8])
Форма набора данных
Размеры набора данных можно получить с помощью функции data.shape().
digits.data.shape Output: (1797, 64)
Вывод показывает, что набор данных содержит 1797 изображений размером 8x8.
Изображения рукописных цифр содержатся в массиве
Изображения рукописных цифр содержатся в массиве. Каждый элемент этого массива представляет собой изображение, представленное матрицей 8x8 числовых значений, соответствующих оттенкам серого от белого со значением 0 до черного со значением 15.
digits.images[0] Output: array([[ 0., 0., 5., 13., 9., 1., 0., 0.], [ 0., 0., 13., 15., 10., 15., 5., 0.], [ 0., 3., 15., 2., 0., 11., 8., 0.], [ 0., 4., 12., 0., 0., 8., 8., 0.], [ 0., 5., 8., 0., 0., 9., 8., 0.], [ 0., 4., 11., 0., 1., 12., 7., 0.], [ 0., 2., 14., 5., 10., 12., 0., 0.], [ 0., 0., 6., 13., 10., 0., 0., 0.]])
Визуализация массива
мы можем визуально проверить содержимое этого результата, используя библиотеку matplotlib.
- Импортируйте модуль pyplot, который находится в matplotlib, как plt.
- Функция imshow() используется для отображения данных в виде изображения; то есть на обычном двумерном растре.
- cmap = gray_rотображает изображение в градациях серого.
- interpolation= ‘nearest’ отображает изображение без попытки интерполяции между пикселями, если разрешение экрана не совпадает с разрешением изображения.
- Функция title() используется для отображения заголовка на графике.
import matplotlib.pyplot as plt plt.imshow(digits.images[0], cmap=plt.cm.gray_r, interpolation='nearest') plt.title('Visualizing an array')
Выполнив эту команду, мы получим изображение в градациях серого следующим образом.
Визуализация 10 цифр
Используя библиотеки NumPy и matplotlib, мы можем отображать каждую цифру от 0 до 9 в виде массива в виде изображений.
- Функция figure() в модуле pyplot библиотеки matplotlib используется для создания нового figure заданного размера (15,4).
- subplots_adjust(hspace=0.8) используется для настройки расстояния между строками подграфиков.
- Объедините два списка с помощью функции zip() для упрощения обработки внутри цикла построения.
- Метод enumerate() добавляет счетчик к итерируемому объекту и возвращает его. Возвращаемый объект является объектом enumerate.
- Функция subplot() используется для добавления подграфика к текущей фигуре в указанной позиции сетки.
Свести входные изображения
Входные данные представляют собой изображения в градациях серого 8x8. мы можем создать плоский массив из 64-пиксельных значений, чтобы каждый пиксель соответствовал столбцу для классификатора.
- Функция len() возвращает количество изображений в наборе данных.
- Функция reshape() возвращает массив, содержащий те же данные с новой формой.
n = len(digits.images) print(n) data = digits.images.reshape((n, -1)) Output: 1797
Сообщалось, что набор данных представляет собой обучающий набор, состоящий из 1797 изображений. Мы определили, что это правда.
Определить модель
В этом случае полезен оценщик sklearn.svm.SVC, в котором используется метод классификации опорных векторов (SVC).
«Машина опорных векторов» (SVM) – это контролируемый алгоритм машинного обучения, который в основном используется в задачах классификации.
Импортируйте модуль SVM из библиотеки scikit-learn и создайте средство оценки типа SVC, а затем выберите начальную настройку, назначив значения C и общие значения гаммы.
#Import svm model from sklearn import svm #Create a svm Classifier svc = svm.SVC(gamma=0.001, C=100.)
Разделить набор данных
как только мы определяем прогностическую модель, мы должны проинструктировать ее с помощью обучающего и тестового набора. Обучающий набор – это набор данных, в котором вы уже знаете принадлежащий класс, а тестовый набор – это вторичный набор данных, который используется для тестирования программы машинного обучения после ее завершения. прошел начальное обучение.
Импортируйте функцию train_test_split(), которая используется для разделения массивов данных на два подмножества, т. е. на обучающие и тестовые наборы.
Здесь мы разделили данные, назначив 0,01 в качестве размера теста.
from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(data, digits.target, test_size=0.01, random_state=0)
Обучите модель
мы можем обучить оценщик svc, который мы определили ранее, с помощью функции fit().
svc.fit(x_train, y_train)
Через некоторое время появится обученный оценщик с текстовым выводом.
SVC(C=100.0, gamma=0.001)
Протестируйте модель
мы можем проверить наш оценщик, заставив его интерпретировать цифры тестового набора с помощью функции predict().
y_pred = svc.predict(x_test) y_pred Output: array([2, 8, 2, 6, 6, 7, 1, 9, 8, 5, 2, 8, 6, 6, 6, 6, 1, 0])
Получаем результаты в виде массива.
Визуализируйте тестовые изображения
Мы можем построить изображения предсказанных цифр из массива, используя следующий код.
Он способен распознавать рукописные цифры и правильно интерпретировать все цифры проверочного набора.
Точность модели
Оценку точности модели можно получить с помощью функции score().
score = svc.score(x_test, y_test) Output: Accuracy Score: 1.0
Матрица путаницы и отчет о классификации модели
Матрица путаницы – это таблица, которая часто используется для описания эффективности модели классификации (или "классификатора") на наборе тестовых данных, для которых известны истинные значения.
Отчет о классификации используется для измерения качества прогнозов по алгоритму классификации.
Следующий код отображает матрицу путаницы и отчет о классификации с помощью функций confusion_matrix() и classification_report().
Classification report for SVM classifier: precision recall f1-score support 0 1.00 1.00 1.00 1 1 1.00 1.00 1.00 2 2 1.00 1.00 1.00 3 5 1.00 1.00 1.00 1 6 1.00 1.00 1.00 6 7 1.00 1.00 1.00 1 8 1.00 1.00 1.00 3 9 1.00 1.00 1.00 1 accuracy 1.00 18 macro avg 1.00 1.00 1.00 18 weighted avg 1.00 1.00 1.00 18
Вывод
Учитывая большое количество элементов, содержащихся в наборе данных Digits, мы обязательно получим очень эффективную модель, т. е. такую, которая способна распознавать с хорошей уверенностью.
Мы проверяем гипотезу, используя эти случаи, каждый случай для различного диапазона обучающих и проверочных наборов.
После выполнения анализа данных в наборе данных с тремя различными тестовыми примерами мы можем сделать вывод, что данная гипотеза верна, т. Е. Модель точно предсказывает цифру в 95% случаев.
Исходный код: GitHub
Я благодарен наставникам на https://internship.suvenconsultants.com за отличные формулировки задач и за то, что многие из нас получили опыт стажировки по программированию. Спасибо www.suvenconsultants.com
Свяжитесь со мной:
LinkedIn: https://www.linkedin.com/in/gayathri1462/
GitHub: https://github.com/gayathri1462