Я просто написал это очень простое рукописное распознавание цифр. Here is 8kb archive со следующим кодом + десять файлов изображений .PNG. Он работает: хорошо известен как
.Простой (рабочий) рукописный распознавание цифр: как его улучшить?
Короче говоря, каждую цифру базы данных (50x50 пикселей = 250 коэффициентов) является суммированы в 10-коэффициента вектор (сохраняя 10 самых больших сингулярных значений, см Low-rank approximation with SVD).
Затем для распознавания цифры мы минимизируем расстояние с цифрами в базе данных.
from scipy import misc
import numpy as np
import matplotlib.pyplot as plt
digits = []
for i in range(11):
M = misc.imread(str(i) + '.png', flatten=True)
U, s, V = np.linalg.svd(M, full_matrices=False)
s[10:] = 0 # keep the 10 biggest singular values only, discard others
S = np.diag(s)
M_reduced = np.dot(U, np.dot(S, V)) # reconstitution of image with 10 biggest singular values
digits.append({'original': M, 'singular': s[:10], 'reduced': M_reduced})
# each 50x50 pixels digit is summarized into a vector of 10 coefficients : the 10 biggest singular values s[:10]
# 0.png to 9.png = all the digits (for machine training)
# 10.png = the digit to be recognized
toberecognizeddigit = digits[10]
digits = digits[:10]
# we find the nearest-neighbour by minimizing the distance between singular values of toberecoginzeddigit and all the digits in database
recognizeddigit = min(digits[:10], key=lambda d: sum((d['singular']-toberecognizeddigit['singular'])**2))
plt.imshow(toberecognizeddigit['reduced'], interpolation='nearest', cmap=plt.cm.Greys_r)
plt.show()
plt.imshow(recognizeddigit['reduced'], interpolation='nearest', cmap=plt.cm.Greys_r)
plt.show()
Вопрос:
код работает (вы можете запустить код в архиве ZIP), но, как мы можем улучшить ее, чтобы иметь лучшие результаты? (в основном математические методы, которые я себе представляю).
Например, в моих тестах 9 и 3 иногда путаются друг с другом.
Я получил более или менее успешный результат с искаженными и очень шумными номерами (не ручными) с этим [OCR и сходством персонажей] (http://stackoverflow.com/a/22879053/2521214), вы можете попробовать. .. Вы можете создать ссылочный шрифт с большим количеством версий на число, чтобы облегчить распознавание – Spektre