论文阅读 - CRNN
文章目录
- 1 概述
- 2 模型介绍
- 2.1 输入
- 2.2 Feature extraction
- 2.3 Sequence modeling
- 2.4 Transcription
- 2.4.1 训练部分
- 2.4.2 预测部分
- 3 模型效果
- 参考资料
1 概述
CRNN(Convolutional Recurrent Neural Network)是2015年华科的白翔老师团队提出的,直至今日,仍旧是文本识别领域最常用也最好用的方法。CRNN主要由三部分组成,分别是feature extraction,sequence modeling和transcription,如下图1-1所示。
图1-1 CRNN总体结构图
feature extraction用于按宽度抽取图像特征,sequence modeling用于融合这些特征并输出label的预测分布,transcription用于将这个特征序列转化为文本。
CRNN强大的地方就是它只是一个框架,其中的feature extraction和sequence modeling部分都是可以替换成不同的模型的,比如feature extraction部分,可以换成任意的抽取图像特征的模型,想要追求性能就换成小模型,想要追求效果就换成大模型,非常灵活。
2 模型介绍
2.1 输入
输入是一般是文本检测的输出,一个长条形的图片,是横向长条的,因为我们的文字都是横着写的。而且这一长条里只能有一行文字,不能多行。多行就得要切成多个单行的长条分别输入。
文本有一些倾斜问题不大,但最好是在文本检测部分调整,即在文本检测部分检测多边形,再仿射变换成长条形,使得文本部分不倾斜。也有论文提出在CRNN的前面前置一个STN。STN要真的有效,需要有好的训练数据。就算有好的数据,也降低了模型的总体性能,增大了模型的训练难度。STN可以看成一个极简版的物体检测模块。
输入的尺寸一般为h×w×c=32×280×3h \times w \times c = 32 \times 280 \times 3h×w×c=32×280×3,不是这个尺寸的就resize and pad成这个尺寸,尽量不要只resize,这会使得文字变形。输入尺寸www会根据需求做调整,如果文本都是短文本,则可以考虑w=100w=100w=100。
2.2 Feature extraction
Feature extraction就是对32×280×332 \times 280 \times 332×280×3的输入进行特征抽取的一个deep convolutional neural networks,输出1×w/4×d=1×70×5121 \times w/4 \times d=1 \times 70 \times 5121×w/4×d=1×70×512的向量。w/4w/4w/4表示对32×432 \times 432×4的一小块图片区域抽取一个512维的特征。这一小块区域被称为receptive field(感受野),或是帧。
图2-1 特征抽取示意图
帧的尺寸是可以变的,输出的特征维度也是可以变的,这些都是超参数。也正是因为CRNN这种抽取特征的方式,使得它没法办法处理竖向的文本,所有高度上的像素都被压到一个特征里了,分不开了。帧的尺寸决定了模型的精度,比如有两个文字完全都在同一帧内,那模型就没法把这两个文字分开了,识别就有问题了。
要处理竖向的文本,需要训练一个识别文本方向的分类网络,然后根据文本的方向对竖向的文本进行旋转或者切片拼接等不同的操作。目的就是变成CRNN可以处理的输入。
2.3 Sequence modeling
我们令feature extraction部分的输出为x=x1,x2,...,xT\bold{x}=x_1, x_2, ..., x_Tx=x1,x2,...,xT,T=70T=70T=70,xtx_txt表示第ttt帧的特征,为一个512维的向量。假设字典的长度为NNN,Sequence modeling就是一个双向的LSTM,输出y=y1,..,yT\bold{y} = y_1, .., y_Ty=y1,..,yT,yty_tyt表示第iii帧为每个字典中字符的概率,是一个N+1N+1N+1维的向量。
Sequence modeling部分的总输出是一个T×(N+1)T \times (N+1)T×(N+1)的概率图。
图2-2 序列模型
使用双向LSTM的好处是:
(1)文本是一个序列,抽取特征的CNN模型只能看到附近几帧的图片特征,而双向LSTM可以融合更远的特征,使得模型看到完整的整个字;
(2)LSTM可以和CNN使用Back-Propagation Through Time (BPTT)的方法拼接起来一起训练;
(3)LSTM可以处理任意长度的输入。
2.4 Transcription
这部分是使用CTC来做的,它在训练和预测时有着不同的处理方法。2.3中的y\bold{y}y之所以维度为N+1N+1N+1就是因为CTC需要一个空白符"ϕ\phiϕ"。CTC的对齐基于两个规则:
(1)先合并所有的重复字符;
(2)再删除所有的空白符。
比如,下面两个序列s\bold{s}s经过对齐之后,都是"Hello"。
HϕeeeϕlllϕϕϕlllϕooHeeϕϕlllϕϕllllϕoooH \phi eee \phi lll \phi\phi\phi lll \phi oo \\ H ee \phi\phi lll \phi\phi llll \phi ooo HϕeeeϕlllϕϕϕlllϕooHeeϕϕlllϕϕllllϕooo
2.4.1 训练部分
训练时,我们是知道文本标签的。
假设我们的训练数据为{Ii,li}\{\bold{I}_i, \bold{l}_i\}{Ii,li},Ii\bold{I}_iIi为第iii张训练图片,li\bold{l}_ili为第iii张图片的文本标签,yi\bold{y}_iyi为第iii张图片的预测概率图(序列都用粗体进行了表示)。我们的目标就是
argmin−∑ilogp(li∣yi)(2-1)arg\min -\sum_{i} log p(\bold{l}_i|\bold{y}_i) \tag{2-1} argmin−i∑logp(li∣yi)(2-1)
其中,p(li∣yi)p(\bold{l}_i|\bold{y}_i)p(li∣yi)表示用概率图yi\bold{y}_iyi得到文本序列li\bold{l}_ili的概率。
p(li∣yi)=∑s:B(s)=lip(s∣yi)(2-2)p(\bold{l}_i|\bold{y}_i) = \sum_{\bold{s} : \Beta(\bold{s})=\bold{l}_i} p(\bold{s}|\bold{y}_i) \tag{2-2} p(li∣yi)=s:B(s)=li∑p(s∣yi)(2-2)
s\bold{s}s表示可以变成文本l\bold{l}l的一条路径,B(s)\Beta(\bold{s})B(s)表示对s\bold{s}s进行CTC对齐操作。p(li∣yi)p(\bold{l}_i|\bold{y}_i)p(li∣yi)也就是所有可以从s\bold{s}s变为li\bold{l}_ili的路径概率和。
p(s∣yi)=∏t=1Tystt(2-3)p(\bold{s}|\bold{y}_i) = \prod_{t=1}^T y_{s_t}^t \tag{2-3} p(s∣yi)=t=1∏Tystt(2-3)
要找到所有可以从s\bold{s}s变为li\bold{l}_ili的路径,用枚举法是不行的,这里一般会用HMM中的前向后向算法,也就是动态规划。
2.4.2 预测部分
预测时,我们是不知道文本标签的。
这个时候要去计算所有可能的文本序列的概率,再找到最大的,简直无法想象。所以预测时,我们只能寄希望于模型训练的足够好,每一帧都预测得很准。然后用greedy search或者beam search的方法来找到最有路径。
greedy search是实际最常用的方法,就是取每帧概率最大的标签。
beam search是在每帧去概率最大的前n条路径,一直保留n条概率最大的路径,直到最后一帧,当n取1时,beam search就退化为greedy search。
以上说的都是只有字典的情况,当我们有词表lexicon时,我们可以根据结果,取编辑距离小于δ\deltaδ的所有词,然后再看取这些词时,概率最大的是哪个词,以此确定最终的输出。
3 模型效果
作者还对比了不同数据集下,CRNN对比其他模型的效果,不过这都是2015年的时候的了,看看即可。
不如看下百度开源的paddle-ocr里的对比结果。CRNN虽然不是准确率最高的,但是是paddle-ocr最推荐的算法。它的效果和性能的综合优势是最高的。
参考资料
[1] An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition
[2] 一文读懂CRNN+CTC文字识别
[3] PaddleOCR
论文阅读 - CRNN相关推荐
- 【论文阅读】Scene Text Image Super-Resolution in the Wild
[论文阅读]Scene Text Image Super-Resolution in the Wild 摘要 引言 相关工作 TextZoom数据集 方法 pipeline SRB 中央对齐模块 梯度 ...
- 论文阅读工具ReadPaper
对于搞科研的同学们来说,看论文是要经历的第一关,尤其是要读好多篇论文的时候,更是着实令人头大. 这不,最近无意中发现了个在线论文阅读网站:readpaper.com,号称「论文阅读笔记神器,硕博科研学 ...
- 多目标跟踪:CVPR2019论文阅读
多目标跟踪:CVPR2019论文阅读 Robust Multi-Modality Multi-Object Tracking 论文链接:https://arxiv.org/abs/1909.03850 ...
- 快速人体姿态估计:CVPR2019论文阅读
快速人体姿态估计:CVPR2019论文阅读 Fast Human Pose Estimation 论文链接: http://openaccess.thecvf.com/content_CVPR_201 ...
- Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读
Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读 Action4D: Online Action Recognition in the Crowd and Clutter 论文链接 ...
- 深度学习点云语义分割:CVPR2019论文阅读
深度学习点云语义分割:CVPR2019论文阅读 Point Cloud Oversegmentation with Graph-Structured Deep Metric Learning 摘要 本 ...
- 3D目标检测论文阅读多角度解析
3D目标检测论文阅读多角度解析 一.前言 CNN(convolutional neural network)在目标检测中大放异彩,R-CNN系列,YOLO,SSD各类优秀的方法层出不穷在2D图像的目标 ...
- 3D目标检测论文阅读摘要
3D目标检测论文阅读摘要 2D Object Detection 的研究已经非常成熟了,代表作品有RPN系列的FasterRCNN,One Shot系列的YOLOv1-YOLOv3,这里推荐一个2D ...
- 目标检测——Faster R-CNN论文阅读
论文阅读--Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks 文章目录 论文阅读--Faste ...
最新文章
- MongoDB架构——记得结合前面的文章看,里面的图画的很好
- 天翼云从业认证(2.1)云计算的定义、特点、背景和发展历程
- modbus协议手册_20种PLC元件编号和Modbus编号地址对应表
- sqlparameter多个赋值一行完成_HashMap源码从面试题说起:请一行一行代码描述hashmap put方法...
- python在webservice接口测试中的应用
- 根据分隔符将一个长字符串分割保存到动态数组中
- ubuntu通过命令行清除内存
- 关于求极限对几个问题的思考和总结
- 汇编语言使用GPIO模拟IIC通信
- List中remove()方法的陷阱,开发谨记!
- 11个主流AI聊天机器人平台,你绝不能错过!
- 奇奇怪怪好用工具集合
- HCSC: Hierarchical Contrastive Selective Coding
- 几种边缘检测算子的比较Roberts,Sobel,Prewitt,LOG,Canny
- 紫书例题6-5 UVa 12657 (链表
- 2022登高架设考试模拟100题模拟考试平台操作
- 李梦娇口诀88条(视频+讲义)
- 关于精简(函数化)因为输入数据多条而导致的冗杂代码的总结
- 功率最好的数据恢复软件FinalRecovery绿色D版
- wanlshop商城小程序全局方法整理记录
热门文章
- java如何限制输入值_[限制input输入类型]常用限制input方法
- git提交 本地分支和远程分支断开连接
- jedispool redis哨兵_通过java哨兵JedisSentinelPool代码示例连接对配置的redis哨兵主从模式进行测试验证...
- SQLAlchemy()分页器paginate方法
- Linux常用命令全网最全
- php 扩展 返回字符串,基于PHP7的PHP扩展开发之四(字符串的处理)
- cmdline常用参数
- 网络4 交换机终端命令
- layui 在springboot2.x 时,页面展示不了layui的问题
- 原来你是这样的Promise