赞
踩
由于比赛的原因,接触了图像文字识别,即是对输入的图片,识别其中的文字。然而对于现实世界中随机的一张图片,首先需要文字检测,即检测出图片中文字的所在文字,然后再进行文字识别,由于比赛给出的数据不用考虑文字检测部分,所以此篇文章主要介绍文字识别算法CRNN。
CRNN算法思想很简单,架构模型为CNN+RNN,CNN用于提取图片的特征,然后转换成特征序列,作为RNN的序列输入,RNN网络用于预测序列,RNN生成的序列经过CTC与label进行校正,CTC的原理很复杂,所幸的是tensorFlow中对此算法进行封装,tf.nn.ctc_loss,所以就不深入了解CTC算法了。
虽然看着CRNN此算法很简单,但是也算是首次接触,还是遇见了数不尽的坑,其中最大的问题,就是不论是调整学习率还是CNN/RNN结构,或者label的表示方式,输出结果总是类似,两个序列之间的编辑距离不会变化,(在知乎对此问题的提问)debug期间,对着代码排查了好几遍,原以为是什么地方理解错误,最后主要发现是优化函数选择问题,论文中建议使用Adadelta优化函数,我当时手欠打成了Adam优化函数。
完整代码见:https://github.com/skloisMary/TensorFlow-CRNN
整个流程包括可概括成五步:
文件 | 作用 |
---|---|
extract.py | 提取图片标签中的字符,unique之后所有的字符构成字典,并把字典写入map.json文件中 |
TFrecorde.py | TFRecord是谷歌推荐的一种二进制文件格式,将数据集保存成tfrecorde文件 |
Model.py | 定义模型,train/test |
run.py | 主程序 |
inference.py | 使用新数据,引用模型 |
1. tf.nn.ctc_loss函数
作用:处理输出标签和真实标签之间的CTC损失
- tf.nn.ctc_loss(
- labels,
- inputs,
- sequence_length,
- preprocess_collapse_repeated=False,
- ctc_merge_repeated=True,
- ignore_longer_outputs_than_inputs=False,
- time_major=True
- )
输入参数:
输出:
2. tf.nn.ctc_beam_search_decoder函数
作用:此函数对作为输入传进来的logits进行解码
- tf.nn.ctc_beam_search_decoder(
- inputs,
- sequence_length,
- beam_width=100,
- top_paths=1,
- merge_repeated=True
- )
输入参数:
输出:
3. tf.edit_distance函数
作用:计算两个序列之间的编辑距离(Levenshtein distance),所谓编辑距离就是针对两个字符串的差异程度的量化测量,量测方式是至少需要多少次的处理才能将一个字符串变成另一个字符串
- tf.edit_distance(
- hypothesis,
- truth,
- normalize=True,
- name='edit_distance'
- )
输入参数:
输出:
参考:
[1]. Tensorflow API, tf.nn._ctc_loss
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。