Обновление: эта статья является частью серии. Ознакомьтесь с полной серией: Часть 1 и Часть 2.

Самый простой метод OCR - использовать kNN. Обязательным условием использования этого метода является базовое знание Python, OpenCV и машинного обучения.

Весь процесс можно разделить на две группы.

  1. Обучение нашей модели машинного обучения и понимание ее эффективности.
  2. Загрузка модели, созданной для распознавания персонажа.

Начнем с обучающей модели.

Я собираюсь использовать это изображение для тренировки нашей модели с рукописными буквами.

Это изображение содержит 5000 рукописных цифр по 500 каждая. Вы можете сохранить этот файл как «digits.png» в каталоге вашей программы.

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

import cv2
import numpy as np 
#Load the training image 
img = cv2.imread("digits.png")
#Convert this Image in gray scale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# Now we split the image to 5000 cells, each 20x20 size
cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]
# Make it into a Numpy array. It size will be (50,100,20,20)
x = np.array(cells)

# Now we prepare train data and test data.
train = x[:,:50].reshape(-1,400).astype(np.float32)   # Size = (2500,400)

test = x[:,50:100].reshape(-1,400).astype(np.float32) # Size = (2500,400)
# Create labels for train and test data
k = np.arange(10)
train_labels = np.repeat(k,250)[:,np.newaxis]

test_labels = train_labels.copy()
# Initiate kNN, train the data, then test it with test data for k=5
knn = cv2.ml.KNearest_create()
knn.train(train, cv2.ml.ROW_SAMPLE, train_labels)

С помощью этого небольшого фрагмента кода мы обучили нашу модель kNN. Теперь могу проверить его точность. Если вы использовали тот же процесс, точность модели будет около 92%. Так что это хорошая привычка сохранять как минимум 20% вашего набора данных для целей тестирования, чтобы узнать точность вашей модели машинного обучения.

ret,result,neighbours,dist = knn.findNearest(test,k=5)
# Now we check the accuracy of classification
# For that, compare the result with test_labels and check which are wrong
matches = result==test_labels
correct = np.count_nonzero(matches)
accuracy = correct*100.0/result.size
print accuracy

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

# save the kNN Model
np.savez('knn_data.npz',train=train, train_labels=train_labels)

Теперь начинается вторая часть этой программы, где мы можем загрузить обученную модель и протестировать собственное изображение.

Я буду использовать это изображение для предсказания, что вы можете сохранить его как «test.jpg» в своем рабочем каталоге.

#Load the kNN Model
with np.load('knn_data.npz') as data:
    print data.files
    train = data['train']
    train_labels = data['train_labels']
 
knn = cv2.ml.KNearest_create()
knn.train(train, cv2.ml.ROW_SAMPLE, train_labels) 
  
test_img=cv2.imread("test.jpg")
test_img =cv2.cvtColor(test_img,cv2.COLOR_BGR2GRAY)
test_img =cv2.resize(test_img, (20, 20)) 
x = np.array(test_img)
test_img = x.reshape(-1,400).astype(np.float32)
ret,result,neighbours,dist = knn.findNearest(test_img,k=1)
#Print the predicted number 
print int(result)

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

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

Следите за мной, чтобы увидеть больше технических блогов.