我部分实现了笔画宽度变换算法。我的实现很丑陋,但有些工作
我的实现给了我很多候选人(我使用一些规则来过滤它们)。但我仍然有很多非角色候选人。我想使用神经网络(或其他 ML 算法)来过滤它们。
我应该为我的分类器使用什么功能?
我可以提取均值/标准差(组件的 SW 值)和宽度/高度。
例子:
红色矩形是字符候选(实现不检测明暗字符,“路虎”的错误检测是正常的)组件过滤后的SWT图像
我部分实现了笔画宽度变换算法。我的实现很丑陋,但有些工作
我的实现给了我很多候选人(我使用一些规则来过滤它们)。但我仍然有很多非角色候选人。我想使用神经网络(或其他 ML 算法)来过滤它们。
我应该为我的分类器使用什么功能?
我可以提取均值/标准差(组件的 SW 值)和宽度/高度。
例子:
红色矩形是字符候选(实现不检测明暗字符,“路虎”的错误检测是正常的)组件过滤后的SWT图像
在实践中使用的一种方法是将所有候选者缩放到相同的尺寸(宽度 x 高度),然后将这些像素中的每一个输入到神经网络中。
然后你有每个字符的输出(返回 0 和 1 之间,表示匹配的接近程度)(可能是最后一个输出表示不匹配,尽管这可以从没有明确的候选字符得出)。
使用神经网络,您将需要相当多的训练数据,它就是这样。避免手动获取所需训练数据的选项:
神经网络和其他技术(例如 SVM)不用于过滤输入,而是用于对输入进行分类。不同之处在于过滤将根据输入是否匹配强加的规则来丢弃输入,因此它实际上不需要任何训练(更可能是一些好的阈值)。另一方面,/trained/ 分类器将一个类分配给给定的输入,这意味着您需要用预期的类和负样本充分训练分类器。因此,如果您想做前者或后者,方法会有所不同,但您在前者中使用的功能可能对后者也有用。
无论您采用何种路径,一些基本的预处理都涉及首先获得一个更清晰的组件,我的意思是删除给定示例中存在的组件内部的无关白点。在那之后,有很多选择。基本的宽度和高度测量值可用于过滤您确定与预期不匹配的组件,因此也无需对其进行分类。通过考虑连接组件的骨架,您可以获得端点和分支点,它们形成两个特征。欧拉数是另一个,事实上,有太多可能的特征需要提取,无法在此处列出。这些提到的特征的特点是它们都是尺度、旋转和平移不变的。这也意味着您需要其他特征来区分,例如,9
从 a6
中,骨架中的孔的质心就是一个这样的例子(请注意它,因为直接提取此特征对任何事物都不是不变的)。
请注意,即使是简单的特征也可以帮助分离整个字符集。例如,对于欧拉数 = 0,您将只得到 'A'、'D'、'O'、'P'、'Q'、'R'、'0'、'4'、'6'、或 '9',假设 ascii alphanum,一种行为良好的字体,以及对输入的良好预处理。
最后,还有相当多的论文可以寻找 SWT 之外的更多信息和不同的方法。例如,T-HOG是最近的一种,根据公布的结果,它比 SWT 略好。
编辑:恢复和扩展:
如果你想使用机器学习,你将需要大量的标记数据,你可以从中分离出来进行训练和测试。如果您的目标只是区分“这是一个字符”和“这不是一个字符”,并且没有充分描述后面的类(即,您几乎没有什么不是字符的示例,或者您无法表征它您可以接收的任何类型的输入),One-Class SVM 是一种选择。
对于要从单个字符中提取的特征,如前所述,它们太多,方法也很多。论文“Feature Extraction Methods for Character Recognition -- A Survey”(1995 年,根本不是最近的)讨论了其中一些(它还提到了训练数据的预期最小大小,请务必阅读),所以我包括它的部分内容在这里。
从字符中提取的可能很好的特征(灰度和二值图像):
从骨架化字符中提取的良好特征:
傅立叶描述符也可以应用于上述论文中所讨论的字符的骨架、二进制表示或图形表示。