【问题标题】:Simple (working) handwritten digit recognition: how to improve it?简单(工作)手写数字识别:如何改进?
【发布时间】:2016-03-11 01:11:30
【问题描述】:

我刚刚写了这个非常简单的手写数字识别。 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 and character similarity 的失真和非常嘈杂的数字(非手绘)方面或多或少取得了成功,您可以尝试一下...您可以创建每个数字具有更多版本的参考字体轻松识别

标签: python math ocr data-analysis svd


【解决方案1】:

数字识别可能是一个相当困难的领域。特别是当数字以非常不同或不清楚的方式书写时。已经采取了很多方法来尝试解决这个问题,并且整个比赛都致力于这个主题。例如,请参阅Kaggle's digit recognizer competition。本次比赛基于众所周知的MNIST data set。在那里的论坛中,你会发现很多解决这个问题的想法和方法,但我会给出一些快速的建议。

很多人将此问题视为分类问题。解决此类问题的可能算法包括,例如,kNN、神经网络或梯度提升。

但是,通常仅靠算法不足以获得最佳分类率。提高分数的另一个重要方面是特征提取。这个想法是计算可以区分不同数字的特征。该数据集的一些示例特征可能包括彩色像素的数量,或者可能是数字的宽度和高度。

虽然其他算法可能不是您想要的,但添加更多功能也可能会提高您当前使用的算法的性能。

【讨论】:

  • 感谢这些链接。我看了一点。他们在哪些数据上执行 MNIST 中的 K-最近邻算法?在每个数字大小为 28*28 = 784 个系数的向量上?或者他们是否保留了我的代码中的低维数据(使用 SVD+低秩近似/PCA)?
  • @Basj,您确实可以使用 784 个系数进行 kNN(其他算法也是如此)。您还可以选择仅在您计算的特征上运行它,或者如果您愿意,也可以在您的特征和像素上运行它。性能可能存在很大差异,但所有组合都是可能的。
  • 好的,所以您的意思是通过 SVD / PCA(784 --> 40 或 10 个系数)进行降维不是这些识别方法中的“必要”步骤?是否经常使用?
  • 这不是绝对必要的,但如果你这样做,它可以提高分类性能和执行时间。如果您有足够的数据,那么大量的维度不一定是问题,但是如果您的维度多于数据,那么您的结果通常会变得毫无用处。在 MNIST 数据的情况下,有足够的数据可以使用 784 个维度而不会得到非常糟糕的分类,但并非每个数据集都是如此。所以,不,没必要,但降维可能会用到很多(在MNIST的情况下,有很多空维度)。
猜你喜欢
  • 2011-09-02
  • 1970-01-01
  • 2021-05-21
  • 2021-02-16
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
相关资源
最近更新 更多