Python+OpenCV:基于KNN手写数据OCR(OCR of Hand-written Data using kNN)
OCR of Hand-written Digits
####################################################################################################
# 基于KNN手写数据OCR(OCR of Hand-written Data using kNN)
def lmc_cv_knn_ocr():
"""
函数功能: 基于KNN手写数据OCR(OCR of Hand-written Data using kNN).
"""
# 读取图像
image = lmc_cv.imread('D:/99-Research/TestData/image/digits.png')
gray_image = lmc_cv.cvtColor(image, lmc_cv.COLOR_BGR2GRAY)
# Now we split the image to 2500 cells, each 20x20 size
cells = [np.hsplit(row, 50) for row in np.vsplit(gray_image, 50)]
# Make it into a Numpy array: its size will be (50,50,20,20)
x = np.array(cells)
# Now we prepare the training data and test data
train = x[:, :25].reshape(-1, 400).astype(np.float32) # Size = (1250,400)
test = x[:, 25:50].reshape(-1, 400).astype(np.float32) # Size = (1250,400)
# Create labels for train and test data
k = np.arange(10)
train_labels = np.repeat(k, 125)[:, np.newaxis]
test_labels = train_labels.copy()
# Initiate kNN, train it on the training data, then test it with the test data with k=1
knn = lmc_cv.ml.KNearest_create()
knn.train(train, lmc_cv.ml.ROW_SAMPLE, train_labels)
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: {}\n".format(accuracy))
# Instead of finding this training data every time I start the application, I better save it.
# so that the next time, I can directly read this data from a file and start classification.
# Save the data
np.savez('knn_data.npz', train=train, train_labels=train_labels)
# Now load the data
with np.load('knn_data.npz') as data:
print("data.files: {}\n".format(data.files))
train = data['train']
train_labels = data['train_labels']
【结果】
accuracy: 88.72
data.files: ['train', 'train_labels']
OCR of the English Alphabet
####################################################################################################
# 基于KNN英文字母OCR(OCR of English Alphabet Data using kNN)
def lmc_cv_knn_ocr_english_alphabet():
"""
函数功能: 基于KNN英文字母OCR(OCR of English Alphabet Data using kNN).
"""
# Load the data and convert the letters to numbers
data = np.loadtxt('D:/99-Research/TestData/image/letter-recognition.data', dtype='float32', delimiter=',',
converters={0: lambda ch: ord(ch) - ord('A')})
# Split the dataset in two, with 10000 samples each for training and test sets
train, test = np.vsplit(data, 2)
# Split trainData and testData into features and responses
responses, train_data = np.hsplit(train, [1])
labels, test_data = np.hsplit(test, [1])
# Initiate the kNN, classify, measure accuracy
knn = lmc_cv.ml.KNearest_create()
knn.train(train_data, lmc_cv.ml.ROW_SAMPLE, responses)
ret, result, neighbours, dist = knn.findNearest(test_data, k=5)
correct = np.count_nonzero(result == labels)
accuracy = correct * 100.0 / 10000
print("accuracy: {}\n".format(accuracy))
【结果】
accuracy: 93.06