NLP 之自然场景文字识别 2 CRNN tensorflow

这篇博客主要讨论CRNN 的工作原理, 主要讨论的论文是 An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition

https://arxiv.org/abs/1507.05717

使用的开开源代码如下

https://github.com/solivr/tf-crnn

这里讨论这篇PAMI 的文章主要的原因有两个

1. 端到端的训练, 而且模型非常通俗易懂

2. 性能比较好,而且模型小 (参数少)

这个模型作为一个基础的入门 自然场景文字识别 是非常好的, 涉及的方方面面也很全。  接下来就会讨论模型+代码复现。

CRNN 的模型介绍



图上的Figure 1, 是从下往上看的。 输入是截好图的 图片, 然后通过卷积, 卷积层, 再输入到两层的bi-directional  LSTM, 然后是 transcription 层, 把多余的字母融合成一个。 这个模型会和对应的开源 代码一起讨论。

卷积层

这个卷积层的实现并不复杂, 就从源代码 model.py 里截图做简短说明

这个卷积 层的实现和VGG 基本一样, 就是3x3 kernel, 然后激活函数, 然后pool。

RNN 层

RNN 层的实现也是中规中矩, 很容易理解。 但是这里有个重点就是RNN 需要有时间方向的信息, 但是我们输出的结果其实是  一个 image features 的张量 (tensor)。这个张量的维度是 batch, width, height, features. 在这里, 作者 将  height , features 融合在一起, 把 width 当做LSTM 的时间 time steps,  这样就变成了 [batch, width, height*features] 对应LSTM 的输入 [batch_size, n_steps, n_input]. 这个假设是有代价的。

这个代价要从 作者提出的神经网络里来计算。 下图就是详细的神经网络架构。


Table 1. Network configuration summary. The first row is the top layer. ‘k’, ‘s’ and ‘p’ stand for kernel size, stride and padding size respectively

看见四个 max pooling 了嘛, 他们会导致 张量的维度变化。 而卷积层,因为有padding 的存在, feature map 的大小是不变的. 当然, 有个例外, 这个就是L13  层, padding 是0 ,所以维度有一点点变化。 batch normalizaiton 就更不会导致维度的变化了。

按照这篇论文, 图片的大小都被re-scale 100 X 32 的大小, 其中32 大概相当于图片中文字的高度。  这样一个神经网络输出的维度 就如 Table 1 的第三列了。

这里高亮了, L14 层的输出, 因为这个是有物理含义的。 相当于有24 个单词 (包含CTC 中的空格), 每个单词的word vector  512.  根据CTC loss 的工作原理, 输出的sequence label 的长度必须小于或等于 input sequence 的长度。 所以  安装目前的网络, 最多能识别的单词长度 就是 24 个。 当然了, 一个英文单词长度超过24 的也很少了。

Transcription 层

Transcription  就是把每个width 的预测 (per-frame prediction) 变成 标记序列。 这里边有两个方法。

1. 没有词库的方法

2. 有词库的方法

没有词库的话, 这个过程就是 Connectionist Temporal Classification (CTC) Loss 计算的过程。我以前的博客有详细讨论这个 loss function.

https://www.jianshu.com/p/e073c9d91b20

有词库呢,  就会把预测的结果 和词库中相似的词一一计算概率, 然后选择概率最大的那一个。 但是这个方法实在太简单粗暴了,  当词库的单词很多的时候, 就会花很多时间来计算概率。 而paper作者发现, 可以先用没有词库的方法, 也就是CTC loss 算出一个sequence label,  然后寻找最相近的方法来确定单词 (search the nearest neighbour hood method)。

CRNN 的 代码复现

数据集

CRNN 训练使用的数据集是 Synthetic Word Dataset, 链接如下

http://www.robots.ox.ac.uk/~vgg/data/text/

这个数据集解压后 大概35 G 的大小 。 先截个图让大家感受一下 他的样子。

每个图的名字就是他的label, 然后前面有标号。

但是这个数据集有坑。

这个数据集里的 label 并不是完全正确的, 很有可能图片里写着 I am very happy,  然而label 里却只写着happy.

这种情况我想到了一个比较简单的筛选方法, 就是比较图片的宽度(W)和 label sequence 的长度 L。 如果L * 100/24  > W,  就说明这个图片的宽度是足够预测对应的文字的。 其中100, 24 , 有在模型 RNN 层中解释。

开源代码 解读

这个github 的开源代码 我本身是跑过的。 代码写的非常棒, 这里主要解释了模型如何训练。 首先是输入数据, 读者需要自己准备一个csv 文件。  这个文件的内容就是图片路径+图片文字(label), label 需要用 “|” 隔开。



其次是要设计 configuration file,就是config_template.json , 截图如下

这个文件比较好理解, 里面确定了 learing_rate,  还有其他。 其中csv_files_train, csv_file_test 就是我们上面讨论的csv 文件。    还有一件文件 lookup_letters_digits_symbols.json 没介绍。这个很好理解, 就是用数字做label, 给每个字母和数字。 


CRNN 的 代码复现

最后放一个我跑的训练结果, 用ICDAR 2003 做测试 集, 用  Synthetic Word Dataset 做训练集。

我的准确率 用了四个 GPU 训练了三天, 没用词库, 达到大约 86.5%的准确率, CER 0.055。 这里边准确率 是指成功预测 一个sequence lable,  而 CER 就是character error rate.

原稿笔记链接如下

https://shimo.im/docs/oDFzLoOXmYsAypwR/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容