CRNN网络结构详解
一. CRNN概论
重点:原论文一定要得看!!!英语好的直接看原论文,不懂的地方查资料。英语不好的(比如笔者),先看中文资料,然后再看原论文。
简介
CRNN全称是:An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition说自己是端到端的的网络,其实严格意义根本不是的,而是一种识别网络而已。
严格意义端到端的网络:Fast Oriented Text Spotting with a Unified Network
请看下图为CRNN网络的输入,得检测到文字之后才能去识别文字。
不严格的端到端是啥意思呢?
下图1-2所示为传统的文字识别,还得把每个文字分割再去识别(这方面的东西不进行说明,很简单的传统方法)
而CRNN直接输入上图得到结果。
网络
CRNN网络结构入下图1-3所示:
- 特征提取
正常的图像提取,提取到的特征以序列方式输出,这里不懂的读者可以去看RNN训练手写数字识别
- BLSTM
特征输入到BLSTM,输出每个序列代表的值(这个值是一个序列,代表可能出现的值),对输出进行softmax操作,等于每个可能出现值的概率。
- CTC
相当于一个LOSS,一个计算概率到实际输出的概率,具体后面章节介绍。
- 创新点
- 使用双向BLSTM来提取图像特征,对序列特征识别效果明显
- 将语音识别领域的CTC—LOSS引入图像,这是质的飞越
- 不足点
- 网络复杂,尤其是BLSTM和CTC很难理解,且很难计算。
- 由于使用序列特征,对于角度很大的值很难识别。
二. CRNN局部之特征提取
假设上图2-1为提取到的特征(特征是一块一块的,这肯定不是特征图,为了看着舒服)
图像经过VGG的特征提取之后就是普通的feature map,然后进行上述的划分,形成特征序列!
如果你的文字很斜或者是纵向的,那就得把特征竖向划分序列了!
三. CRNN局部之BLSTM
基本原理不懂读者可以看看这个教程
懂了原理这部分还是比较简单的(理解简单,实现太难了),笔者这里只介绍几个使用过程难理解的点
- RNN输入序列数量
从上图可以得到的是X1---X6,总共6个序列
- RNN的层数
从上图3-2可以看出,是由五层网络构成
- RNN神经元数量
这里引用知乎大神的一个图,上图中序列为4,层数为3层(当然不加输入和输出也可以说是1层,这里按正常CNN去说就是3层了)
从图中可以看出每个序列包含一个CNN,图中的隐藏层神经元数量为24个,由于RNN使用权值共享,那么不同的神经元个数就为6个。
- 单个序列长度
以上图知乎大神的图为例子,每个输入序列长度8
假设这个网络是一个RNN识别手写数字识别的图,那么图像的宽为4,高为8
注意:输入序列的数量和输入序列的长度和神经元个数无关!!!这里想象RNN即可理解
- BLSTM
笔者只是推导了单向的LSTM网络,而没有推导BLSTM网络。
其实无论RNN如何变种,像现在最好的GRU等,无非都是在单元(unite)里面的trick而已。
具体公式推导,就是链式求导法则!建议先推RNN、然后LSTM、最后不用推导BLSTM都明白了
四. CRNN局部之CTC
关于CTC的描述网上很多,也讲解的比较清楚了,这里主要是说一下我笔者看原理时候的几个难点(弄了好久才想明白)
关于CTC是什么东西?
- 让我们来看一下正常分类CNN网络:
这是鸢尾花分类网络,其中输入一张图像,输出是经过softmax的种类概率。
那么这个网络标签是什么???
标签的制作都是需要经过Incode(分类的种类经过数字化编码),测试过程需要Encode(把输出的数字解码成分类的种类)
这很简单,读者应该都理解,代码为了计算机能看懂,编码就是神经网络能看懂。
- 那么RCNN如何编码呢?
假设有26个英文字母要识别,那么种类数=27(还有一个空白blank字符)
假设CNN输出以50个序列为基准(读者这里看不懂就去看RNN识别手写数字识别),序列太大训练不准,识别结果会漏字母。序列太小训练不准,识别会多字母。
- 打个小比喻
假设CTC是一个黑盒子,它能把输出那么多序列变化为一个序列,这样就能和CNN分类一样计算Loss了。当然不会那么简单,CTC还是比较复杂的,后面具体看这个黑盒子如何工作的。。。。
CTC理论基础
注释:这里笔者就不进行详细的描述了,感觉别人比我写的更好:非常详细的CTC力理论
在这一章,主要针对笔者遇到的重难点进行介绍:
- 训练--前向后相传播
本来还去看了马尔科夫的前后向传播的理论,没怎么看懂(数学基础太差)
针对本文的CTC前后向传播还是比较简单理解的
其实这里可以理解为动态规划的方式进行的,因为其使用递归的方式,以一个点为中心,向前和向后进行递推,以动态规划的方式理解就很简单了。。。。不懂的读者可以刷leetcode,做几题就有感觉了
- 测试--CTC Prefix Search Decoding和CTC Beam Search Decoding
最简单的搜索追溯算法:
每个都列举最后计算,可以看出来是指数级搜索,效率肯定不行的
贪婪算法+动态规划---CTC Prefix Search Decoding:
第一步是进行合并操作:
第二步输出最大概率:
扩充CTC Prefix Search Decoding算法---CTC Beam Search Decoding
- CTC Prefix Search Decoding属于贪心算法,为什么可以得到最优解?
仔细看我上面的标题,CTC Prefix Search Decoding特意加了一个动态规划,动态规划是属于最优解的算法。
因为CTC算法的前提是序列相互独立,所以当前的序列最大,那么整体的序列最大。
注意:得合并之后的序列最大,而不是单个序列的最大!!!,如果是单个序列最大,那这就是单独的贪心算法了。
- 为什么CTC序列之间相互独立还可以计算有序列的文字,文字之间肯定有序列的啊?
这都得重新看网络了,网络用到了BLSTM,序列这个东西已经使用过了,到达CTC已经是使用序列之后的输出了。
不得不佩服设计网络的人RNN+CTC,语音是使用最早的。
其实回头想一下,如果CTC是有序列的,那么前向和后项概率根本不能使用马尔科夫模型(前提相互独立)了,也不能使用CTC Prefix Search Decoding,只能使用最简单的追溯算法,那效率那么低,怎么广泛使用呢?
五. 参考文献
CRNN网络结构详解的更多相关文章
- Transformer各层网络结构详解!面试必备!(附代码实现)
1. 什么是Transformer <Attention Is All You Need>是一篇Google提出的将Attention思想发挥到极致的论文.这篇论文中提出一个全新的模型,叫 ...
- 【OCR技术系列之七】端到端不定长文字识别CRNN算法详解
在以前的OCR任务中,识别过程分为两步:单字切割和分类任务.我们一般都会讲一连串文字的文本文件先利用投影法切割出单个字体,在送入CNN里进行文字分类.但是此法已经有点过时了,现在更流行的是基于深度学习 ...
- Resnet-50网络结构详解
解决的问题: 由于梯度消失,深层网络很难训练.因为梯度反向传播到前面的层,重复相乘可能使梯度无穷小.结果就是,随着网络的层数更深,其性能趋于饱和,甚至迅速下降. 核心思想: 引入一个恒等快捷键(也称之 ...
- OSPF协议详解
CCNP OSPF协议详解 2010-02-24 20:30:22 标签:CCNP 职场 OSPF 休闲 OSPF(Open Shortest Path Fitst,ospf)开放最短路径优先协议,是 ...
- vmware虚拟机三种网络模式详解_转
原文来自http://note.youdao.com/share/web/file.html?id=236896997b6ffbaa8e0d92eacd13abbf&type=note 由于L ...
- CDN学习笔记二(技术详解)
一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精华放上网.公诸同 ...
- CDN技术详解及实现原理
CDN技术详解 一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精 ...
- LVS详解
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- Vmware虚拟机三种网络模式详解
原文来自http://note.youdao.com/share/web/file.html?id=236896997b6ffbaa8e0d92eacd13abbf&type=note 我怕链 ...
随机推荐
- 怎样修改vim的缩进
默认vim的tab缩进是八个空格, 太长了, 需要改短一点. 第一步: 找到vimrc文件所在位置 # find / -name vimrc 第二步: 找到以后用vim打开vimrc文件并增加下面两行 ...
- WebClient 下载文件
WebClient用法小结(转载) 如果只想从特定的URI请求文件,则使用WebClient,它是最简单的.NET类,它只用一两条命令执行基本操作,.NET FRAMEWORK目前支持以http: ...
- jenkins pipline
def getHost(){ def remote = [:] remote.name = 'server02' remote.host = '39.19.90' remote.user = 'roo ...
- 【转载】C#使用FirstOrDefault方法快速查找List集合中符合条件的第一个实体
在C#的List集合的操作中,有时候我们需要根据相关条件快速从List集合中获取到第一个符合条件的实体对象,例如有个全校班级的List集合,我们需要根据班级代码快速从List集合中查找出班级信息.可以 ...
- 微信小程序 swiper 组件坑
swiper 组件高度被限制为150px了,所以内容无法撑开. 解决办法 给这组件重新设置个高度,然后在把里面的图片设置为自动适应容器大小.图片模式设置为 宽度不变 自动适应高度 <swiper ...
- 论文阅读之FaceNet: A Unified Embedding for Face Recognition and Clustering
名称:FaceNet: A Unified Embedding for Face Recognition and Clustering 时间:2015.04.13 来源:CVPR 2015 ...
- FreeRTOS 任务创建和删除(动态)
TaskHandle_t taskhandle; TaskHandle_t taskhandle1; void vTask(void *t) { int i = 0; while(1) { i++; ...
- [转]預防 Android Dex 64k Method Size Limit
转载自:http://ingramchen.io/blog/2014/09/prevention-of-android-dex-64k-method-size-limit.html 08 Septem ...
- HIVE常用命令之MSCK REPAIR TABLE
MSCK REPAIR TABLE命令主要是用来解决通过hdfs dfs -put或者hdfs api写入hive分区表的数据在hive中无法被查询到的问题.我们知道hive有个服务叫metastor ...
- MongoDB的删除操作
1.MongoDB 删除数据库的语法格式如下: db.dropDatabase() > show dbs admin .000GB config .000GB local .000GB sda ...