Files
ocrcn_tf2/readme.md
2019-06-05 00:13:32 +08:00

40 lines
3.8 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TensorFlow 2.0 中文手写字识别
本项目实现了基于CNN的中文手写字识别并且采用标准的**tensorflow 2.0 api** 来构建!相比对简单的字母手写识别,本项目更能体现模型设计的精巧性和数据增强的熟练操作性,并且最终设计出来的模型可以直接应用于工业场合,比如 **票据识别**, **手写文本自动扫描**相比于百度api接口或者QQ接口等具有可优化性、免费性、本地性等优点。
## Data
在开始之前先介绍一下本项目所采用的数据信息。我们的数据全部来自于CASIA的开源中文手写字数据集该数据集分为两部分
- CASIA-HWDB离线的HWDB我们仅仅使用1.0-1.2这是单字的数据集2.0-2.2是整张文本的数据集我们暂时不用单字里面包含了约7185个汉字以及171个英文字母、数字、标点符号等
- CASIA-OLHWDB在线的HWDB格式一样包含了约7185个汉字以及171个英文字母、数字、标点符号等我们不用。
其实你下载1.0的train和test差不多已经够了可以直接运行 `dataset/get_hwdb_1.0_1.1.sh` 下载。原始数据下载链接点击[这里](http://www.nlpr.ia.ac.cn/databases/handwriting/Offline_database.html).
由于原始数据过于复杂我们自己写了一个数据wrapper方便读取统一将其转换为类似于Dataframe (Pandas)的格式这样可以将一个字的特征和label方便的显示也可以十分方便的将手写字转换为图片采用CNN进行处理。这是我们展示的效果
<p align="center">
<img src="https://s2.ax1x.com/2019/05/27/VeFtZq.md.png" />
</p>
其对应的label为
```
['!', '"', '#', '$', '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '、', '。', '々', '…', '', '', '“', '”']
```
关于数据的处理部分,从服务器下载到的原始数据是 `trn_gnt.zip` 解压之后是 `gnt.alz` 需要再次解压得到一个包含 gnt文件的文件夹。里面每一个gnt文件都包含了若干个汉字及其标注。直接处理比较麻烦也不方便抽取出图片再进行操作**虽然转为图片存入文件夹比较直观,但是不适合批量读取和训练**, 后面我们统一转为tfrecord进行训练。
**更新**:
实际上由于单个汉字图片其实很小差不多也就最大80x80的大小这个大小不适合转成图片保存到本地因此我们将hwdb原始的二进制保存为tfrecord。同时也方便后面训练可以直接从tfrecord读取图片进行训练。
![](https://s2.ax1x.com/2019/05/29/VKSEZt.png)
在我们存储完成的时候大概处理了89万个汉字总共汉字的空间是3755个汉字。由于我们暂时仅仅使用了1.0所以还有大概3000个汉字没有加入进来但是处理是一样。使用本仓库来生成你的tfrecord步骤如下
- `cd dataset && python3 convert_to_tfrecord.py`, 请注意我们使用的是tf2.0
- 你需要修改对应的路径等待生成完成大概有89万个example如果1.0和1.1都用那估计得double。
## Model
关于我们采用的OCR模型的构建我们大致采用的是比较先进的MobileNetV3架构同时设计了一个修改的过的MobileNetV3Big的更深网络。主要考虑模型的轻量型和表达能力。最终训练结果表明我们的模型可以在中文手写字上达到约99.8%的准确率。