手写汉字识别和多字分割

  1. 数据集准备

    HWDB1.1数据集下载地址:

下载地址
下载完后解压 有两个压缩包, 一个trn_gnt,一个tst_gnt,这两个是训练数据和测试数据,但里面的文件是gnt格式,需要转换成图片

  1. 数据集转换
    对gnt文件进行转换,具体参考这篇博客

参考
转换完成后的就是png的图片格式了

  1. 构建模型进行训练
    这里可以参考一下github上的项目
    参考github

这里需要注意的是超参数charset_size,这个是设置训练的字符集大小,可以根据自己的需要自行设置,然后将需要训练的字对应的数据集图片放到训练数据文件夹中训练;还需要根据训练的字数自行设置超参数max_steps(最大训练步数),eval_steps(评估步数)和save_steps(保存步数);

这是训练了50个字,跑了2w步的测试准确率,在测试集的准确率还是蛮高的。在实际运用时就需要对识别的字进行一些处理了…
手写汉字识别和多字分割

  1. 多字符分割和识别

训练完模型之后就可以进行识别了,在上一步github中也有识别部分。由于数据集是单个字,只能对单字进行识别,如果需要多字进行识别就需要对多字符进行分割,然后将分割后的字符逐一识别。

这里采用了投影分割的方式对多字符进行分割,因为汉字的结构复杂,有偏旁,有左右结构,有上下结构,采用这些普通的分割就很容易造成分割错误。

使用投影分割的话可以选择先进行水平投影再进行垂直投影,这样就可以避免出现对上下结构的汉字的分割错误,但是会对左右结构的汉字造成分割错误,如下图。
手写汉字识别和多字分割
在出现分割错误后可以分割后的坐标进行后处理,需要设置一个阈值将分割错误的字进行判断,然后合并错误的分割就可以解决这个问题。见下图吧。上面那部分是后处理的分割结果,下面那部分是直接进行投影分割的结果,效果还行,由于这个阈值是自行设定的,在不同的字体大小或者字体风格下就比较那啥了…
手写汉字识别和多字分割

分割完成后就可以将每个分割出来的字进行识别了…在实际使用中需要将分割完成后的图片或者需要识别的图片转成[64,64]大小,这样才可以达到测试集的效果,因为数据集和测试集的图片大小也是[64,64],这样提取出来的特征点才会正确,才能准确识别。

最后提一下,因为数据集解压出来后的文件是00001 00002这样的文件名,所以最后识别出来的也是文件夹名,为了展示出识别效果需要自己做一个映射,将文件夹名和汉字对应起来,然后将识别结果输出为对应的汉字就OK了。

最后放一下识别效果吧(左上角红字就是识别结果了),电脑上只有前50个字的模型,效果还行,3755个字的模型在实验室,跑了100w次,测试了很多相似的手写字,比如威,咸,城等等,基本可以正确的识别出来。
手写汉字识别和多字分割手写汉字识别和多字分割