2015-12-06 9 views
2

Я просто написал это очень простое рукописное распознавание цифр. Here is 8kb archive со следующим кодом + десять файлов изображений .PNG. Он работает: enter image description here хорошо известен как enter image description here.Простой (рабочий) рукописный распознавание цифр: как его улучшить?

Короче говоря, каждую цифру базы данных (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 иногда путаются друг с другом.

+0

Я получил более или менее успешный результат с искаженными и очень шумными номерами (не ручными) с этим [OCR и сходством персонажей] (http://stackoverflow.com/a/22879053/2521214), вы можете попробовать. .. Вы можете создать ссылочный шрифт с большим количеством версий на число, чтобы облегчить распознавание – Spektre

ответ

4

Распознавание цифр может быть довольно сложной областью. Особенно, когда цифры написаны очень разными или неясными способами. В попытке решить эту проблему было предпринято много подходов, и целые соревнования посвящены этой теме. Например, см. Kaggle's digit recognizer competition. Этот конкурс основан на хорошо известном MNIST data set. На форумах, которые есть, вы найдете много идей и подходов к этой проблеме, но я дам несколько быстрых предложений.

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

Однако, как правило, алгоритма недостаточно для получения оптимальных скоростей классификации. Другим важным аспектом для улучшения ваших результатов является извлечение признаков. Идея состоит в том, чтобы вычислить функции, которые позволяют различать разные числа. Некоторые примеры функций для этого набора данных могут включать в себя количество цветных пикселей или, может быть, ширину и высоту цифр.

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

+0

Спасибо за эти ссылки. Я немного посмотрел на него. На каких данных они выполняют алгоритм K-ближайших соседей в MNIST? На вектор размера 28 * 28 = 784 коэффициентов для каждой цифры? Или они сохраняют данные с меньшим размером, например, в моем коде (с использованием приближения SVD + low rank/PCA)? – Basj

+0

@Basj, вы действительно можете сделать kNN с использованием коэффициентов 784 (то же самое верно для других алгоритмов). Вы также можете использовать его только для функций, которые вы рассчитали, или как ваши feautres, так и пиксели, если хотите. В производительности могут быть большие различия, но возможны все комбинации. –

+0

Итак, вы подразумеваете, что уменьшение размерности с помощью SVD/PCA (784 -> 40 или 10 коэффициентов) не является «необходимым» шагом в этих методах распознавания? Часто ли он используется или нет? – Basj

 Смежные вопросы

  • Нет связанных вопросов^_^