第一次写博客,可能写的比较乱,请不要在意。

做个介绍,本程序是我的毕业设计内容,主要任务是使用神经网络识别出一行字符,包括汉字、字母和标点符号,印刷体和手写的字符都可以识别,测试结果在下面。我的训练显卡是GTX TITAN Xp (12GB)

我的训练程序架构由预处理函数 + 四层卷积神经网络(CNN) + 二层双向长短期记忆网络(BLSTM) + 一层全连接层 + CTC函数组成,编程语言为python3,使用的神经网络封装底层是keras,训练集是网上某位大佬整理分享的(十分感谢),源地址找不到了,我把我的百度网盘来分享,地址 /s/1SlvkqJMU6BhMIb8nhCNmnA,密码 p9lu(训练集内每张图片都包含一行印刷体字符)。

现在来简单说说我的思路,首先,我对训练集进行大量预处理以提高最终的识别正确率,比如将图片按比例伸缩,转为灰度值等,如果有需要还可以用数据增强,其次,用CNN进行特征提取,接着,将提取的特征送入长短期记忆网络中处理,然后,将处理后的值展平送入keras的ctc函数中,最后,用ctc解码,将得到的值对照“字典”翻译即可。为了降低过拟合,我使用了dropout和recurrent_dropout。

“字典”地址 /s/1wC72Q0MMVYcv1YMxkJk4tw,密码 ng9e。这是一个txt文件,里面是所有待预测的字符,每个字符各占一行,预处理时让程序读入该txt成为字典,最后将解码时得到的值依照字典翻译即可得到正确的结果。

我之所以使用LSTM是因为它相比于普通的循环神经网络(RNN),增加了一种携带信息跨越多个时间步的方法,能有效地解决梯度消失问题。使用双向处理是因为RNN(LSTM是RNN的一种)特别依赖顺序或时间,倘若打乱时间步的或反转时间步则会完全改变RNN从序列中提取的表示,因此,双向RNN能够捕捉到可能被单向RNN忽略的模式。最后关于CTC算法的介绍我这就不多赘述,网上很多大神都有详解,搜他们的文章来学习就好了(https://www.jianshu.com/p/0cca89f64987 这篇在简书上的文章讲的很清晰)。

由于毕业设计应该还在审核的原因,代码就先不放了,下面是部分例子,正确率差强人意。

基于人工神经网络的手写文字(字符)识别
基于人工神经网络的手写文字(字符)识别
基于人工神经网络的手写文字(字符)识别
我的邮箱:[email protected]
欢迎交流

相关文章:

  • 2021-12-01
  • 2021-06-16
  • 2022-01-07
  • 2022-12-23
  • 2022-12-23
  • 2022-01-01
猜你喜欢
  • 2021-12-27
  • 2021-12-11
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-21
  • 2021-04-19
相关资源
相似解决方案