使用 TensorFlow 进行手写文本识别
- 更新 2023/2:web demo 可用
- 更新 2023/1:参见 HTRPipeline 以读取整页的包
- 更新 2021/2:识别行级别的文本(多个单词)
- 更新 2021/1:更稳健的模型,更快的数据加载器,Windows平台也可用的word beam search解码器
- 更新 2020:代码兼容 TF2
使用 TensorFlow(TF)实现的手写文本识别(HTR)系统,并在 IAM 离线 HTR 数据集上训练。该模型的输入是单词或文本行(多个单词)的图像,输出是识别的文本。验证集中四分之三的单词被正确识别,字符错误率约为10%。
运行示例
- 下载预训练模型之一
- 在单词图像上训练的模型:只处理每张图像中的单个单词,但在 IAM 词数据集上效果更好
- 在文本行图像上训练的模型:可以处理一张图像中的多个单词
- 将下载的 zip 文件中的内容放入仓库的
model
目录中 - 转到
src
目录 - 运行推理代码:
- 执行
python main.py
以在单词图像上运行模型 - 执行
python main.py --img_file ../data/line.png
以在文本行图像上运行模型
- 执行
以下显示了使用文本行模型时的输入图像和期望输出。
![test](https://yellow-cdn.veclightyear.com/2b54e442/550154d8-4633-4cef-baad-a70e6d0d42f0.png)
> python main.py
使用存储值 ../model/snapshot-13 初始化
识别结果:"word"
概率:0.9806370139122009
![test](https://yellow-cdn.veclightyear.com/2b54e442/8841a9ed-449b-406e-b674-04313672f7ac.png)
> python main.py --img_file ../data/line.png
使用存储值 ../model/snapshot-13 初始化
识别结果:"or work on line level"
概率:0.6674373149871826
命令行参数
--mode
:选择“train”,“validate”或“infer”。默认为“infer”。--decoder
:在 CTC 解码器中选择 “bestpath”、“beamsearch” 和 “wordbeamsearch”。默认为 “bestpath”。有关 “wordbeamsearch”的选项,详见下文。--batch_size
:批处理大小。--data_dir
:包含 IAM 数据集的目录(包含子目录img
和gt
)。--fast
:使用 LMDB 更快地加载图像。--line_mode
:训练读取文本行而不是单个单词。--img_file
:用于推理的图像。--dump
:将神经网络的输出转存到dump
文件夹中保存的 CSV 文件,可作为 CTCDecoder 的输入。
集成word beam search解码
word beam search decoder 可以代替 TF 附带的两个解码器。单词受到包含在字典中的单词限制,但仍然可以识别任意的非单词字符串(数字、标点符号)。下图显示了一个示例,其中 word beam search 能够识别正确的文本,而其他解码器失败。
![decoder_comparison](https://yellow-cdn.veclightyear.com/2b54e442/ebcb48b9-31a2-48c6-8047-f7e5929e6613.png)
按照以下说明集成word beam search解码:
- 克隆仓库 CTCWordBeamSearch
- 在 CTCWordBeamSearch 仓库的根目录运行
pip install .
进行编译和安装 - 在执行
main.py
时指定命令行选项--decoder wordbeamsearch
以实际使用解码器
字典在训练和验证模式下自动创建,使用包含在 IAM 数据集中的所有单词(即还包括验证集中的单词),并保存到文件 data/corpus.txt
中。此外,手动创建的单词字符列表可以在文件 model/wordCharList.txt
中找到。beam 宽度设置为 50,以符合普通 beam search 解码的 beam 宽度。
在 IAM 数据集上训练模型
准备数据集
按照以下说明获取 IAM 数据集:
- 在这个网站 免费注册
- 下载
words/words.tgz
- 下载
ascii/words.txt
- 在磁盘上为数据集创建一个目录,并创建两个子目录:
img
和gt
- 将
words.txt
放入gt
目录 - 将
words.tgz
的内容(目录a01
、a02
等)放入img
目录
运行训练
- 如果想从头开始训练,请删除
model
目录中的文件 - 转到
src
目录并执行python main.py --mode train --data_dir path/to/IAM
- IAM 数据集分为 95% 训练数据和 5% 验证数据
- 如果指定选项
--line_mode
,模型将在通过将多个单词图像组合成一个文本行图像上训练 - 在固定轮次没有改进后停止训练
预训练的单词模型在 GTX 1050 Ti 上用以下命令训练:
python main.py --mode train --fast --data_dir path/to/iam --batch_size 500 --early_stopping 15
行模型用以下命令训练:
python main.py --mode train --fast --data_dir path/to/iam --batch_size 250 --early_stopping 10
快速图像加载
即使只使用小型 GPU,从磁盘加载和解码 png 图像文件也是瓶颈。 LMDB 数据库用于加快图像加载速度:
- 转到
src
目录并运行create_lmdb.py --data_dir path/to/iam
,指定 IAM 数据目录 - 在 IAM 数据目录中创建一个名为
lmdb
的子文件夹,包含 LMDB 文件 - 当训练模型时,添加命令行选项
--fast
数据集应位于 SSD 驱动器上。
使用 --fast
选项和 GTX 1050 Ti 训练单词大约需要 3 小时,批处理大小为 500。
在文本行上训练需要更长时间。
关于模型的信息
该模型是我为我的论文 实现的 HTR 系统的简化版本。 剩下的是识别具有可接受精度的文本的最低要求。 它由 5 层 CNN、2 层 RNN(LSTM)以及 CTC 损失和解码层组成。 更多详细信息请参见这篇 Medium 文章。