OpenCV (40) --- Алгоритм K-ближайшего соседа для идентификации чисел

OpenCV
OpenCV (40) --- Алгоритм K-ближайшего соседа для идентификации чисел

Алгоритм K-ближайшего соседа

Алгоритм машинного обучения — это алгоритм, который генерирует модель из данных, то есть алгоритм обучения. Мы передаем опыт алгоритму, и он может генерировать модели на основе эмпирических данных. Столкнувшись с новой ситуацией, модель предоставит нам прогнозируемые результаты. Например, при распознавании чисел и символов для их распознавания не требуется цвет, достаточно использовать бинарные изображения, а цифровые символы бинарных изображений состоят из 0 и 1, и машинное обучение будет сопоставлять самые близкие символы в соответствии с позициями 0 и 1. или цифры, что приводит к результату. Алгоритм K-ближайшего соседа в машинном обучении наиболее подходит для распознавания текста или числовой информации на изображениях.

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

Определить номера

В первой статье руководства по разработке OpenCV-Python мы представили бинарные изображения, которые могут различать формы и приблизительные очертания объектов. Как показано ниже:

A

Изображение A здесь представляет собой матричный набор 0 и 1. Число 1 представляет место с цветом, а число 0 представляет место без цвета.

Здесь образцы данных, которые мы предоставляем для машинного обучения, представляют собой одномерный массив из 1024 элементов, предоставленный через лист Excel, а изображение представляет собой матрицу, а не одномерный массив. Следовательно, при обработке исходного изображения нам необходимо преобразовать матричные данные изображения в одномерный массив, чтобы облегчить сопоставление прогнозов машинного обучения.

Настройте изображение

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

Во-вторых, бинарное изображение, преобразованное OpenCV, представляет собой матрицу, а данные для обучения машинному обучению представляют собой одномерный массив длиной 1024. Следовательно, нам также нужно уменьшить изображение до изображения 32 * 32 пикселей, чтобы оно было преобразовано в одномерный массив с данными 1024 0, 1.

Конкретный код выглядит следующим образом:

import cv2

img = cv2.imread("40.jpg")
img = cv2.resize(img, (32, 32))
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
t, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
img[img == 255] = 1
img_array= img.reshape(1, -1)  # 转换为一维数组

Здесь мы сначала получаем изображение, а затем конвертируем его в размер 32*32 пикселя. Затем преобразуйте его в изображение в градациях серого и измените изображение на два значения 0 и 255 посредством бинаризации и, наконец, замените белую часть 255 на 1. Наконец, преобразуйте его в одномерный массив.

Построение модели алгоритма K-ближайшего соседа

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

Ниже мы конкретно реализуем, код выглядит следующим образом:

import cv2
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier as KNN

df = pd.read_excel("手写字体识别.xlsx")
# 提取特征变量,识别数字时,其特征就是1024个0,1数据,而目标变量就是1024个数字组成对应的结果数字
X = df.drop(columns="对应数字")
Y = df['对应数字']

x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=111)
knn = KNN(n_neighbors=5)
knn.fit(x_train, y_train)

answer=knn.predict(img_array)
print("图中的数字是:"+str(answer[0]))

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

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

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

После завершения моделирования одномерный массив приведенного выше преобразованного изображения можно напрямую подставить в функцию knn.predict для получения прогнозируемого результата. Фотографии, которые мы протестировали, выглядят следующим образом:

1111

После запуска получены следующие результаты:

结果

Учебный документ:нажмите, чтобы скачать