我正在寻找有关识别三种手写形状(圆形,菱形和矩形)的一些建议。我尝试了不同的方法,但是它们都失败了,所以也许您可以为我指明另一个更好的方向。
我试过的
1)基于手写形状和理想形状之间的点积的简单算法。它在识别矩形时效果还不错,但是在圆形和菱形上却失败了。问题在于,即使对于理想形状,圆形和菱形的点积也非常相似。
2)相同的方法,但是使用动态时间规整作为相似性的度量。类似的问题。
3)神经网络。我尝试了一些方法-将点数据提供给神经网络(Feedforward和Kohonen)或提供栅格化图像。对于Kohonen,它始终将所有数据(事件样本用于训练)归为同一类别。带点的前馈效果更好(但与方法1和2处于同一水平),并且带有光栅化图像的前馈非常慢(我至少需要尺寸为^ 2的输入神经元,对于小尺寸的光栅圈,即使是我也无法分辨;))而且也没有成功。我认为是因为所有这些形状都是封闭的图形吗?我不是ANN的专家(他们有1个学期的类(class)),所以我可能错误地使用了它们?
4)将形状另存为Freeman Chain Code,并使用一些算法来计算相似度。尽管在FCC中,形状确实会彼此不同。这里没有成功(但是我还没有深入探索这条路)。
我正在为此构建适用于Android的应用程序,但我认为此处的语言无关紧要。
最佳答案
考虑到手写输入的可能变化,我建议采用神经网络方法。您会发现很难或不可能手动准确地对这些类进行建模。 LastCoder的尝试在一定程度上可以奏效,但是它不能应付太大的变化,也不能保证进一步的准确性。这种手工设计的方法在很久以前就被放弃了。
这些天来最新的手写字符分类结果通常是使用convolutional neural networks (CNNs)实现的。鉴于您只有3个类别,所以这个问题应该比数字或字符分类更容易,尽管从MNIST手写数字数据集的经验来看,我希望您的圆圈,正方形和菱形有时甚至对人类来说都难以分辨。
因此,如果由我决定,我将使用CNN。我会将从绘图区域获取的二进制图像输入到网络的第一层。这些可能需要一些预处理。如果绘制的形状仅占输入空间的很小一部分,您可能会受益于将它们放大(即增加线宽),从而使形状对于较小的差异更加不变。尽管pooling步骤可以减轻对此的需要,但在图像中居中放置形状也可能是有益的。
我还要指出,训练数据越多越好。人们经常面临在增加一个人的数据集大小和改善一个人的模型之间进行权衡的问题。综合更多示例(例如,通过倾斜,旋转,移动,拉伸(stretch)等)或花费几个小时绘制形状可能会比尝试同时改进模型时获得的好处更多。
祝您的应用程序好运!