Обновление: эта статья является частью серии. Ознакомьтесь с полной серией: Часть 1 и Часть 2.
Самый простой метод OCR - использовать kNN. Обязательным условием использования этого метода является базовое знание Python, OpenCV и машинного обучения.
Весь процесс можно разделить на две группы.
- Обучение нашей модели машинного обучения и понимание ее эффективности.
- Загрузка модели, созданной для распознавания персонажа.
Начнем с обучающей модели.
Я собираюсь использовать это изображение для тренировки нашей модели с рукописными буквами.
Это изображение содержит 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 более подробно с большим набором данных.
Следите за мной, чтобы увидеть больше технических блогов.