一篇包罗万象的场景文本检测算法综述

相关背景介绍
文本在人机交互中扮演着重要的角色, 图片中的文本所包含的丰富而精确的信息在基于视觉的设备中应用非常广泛,能够辅助设备获得更精确的物体和周边环境信息。随着智能机器人、无人驾驶、医疗诊断的飞速发展,文本的检测与识别已经成为定位和理解物体信息的重要途径[28]。现实当中,许多跟文本识别相关的应用极大地方便了我们的生活,如车牌识别、发票识别、拍图识字等。
文本识别demoocr相关概念:提到文本检测识别,我们会联想到的一个词就是 ocr,ocr 是光学字符识别 optical character recognition的简称,是指对文本资料的图像文件进行分析识别处理,获取文字的过程 [19]。现在所说的ocr 通常也指场景文字识别,根据识别场景,可大致将 ocr 分为识别特定场景的专用 ocr 和识别多种场景的通用 ocr。比如车牌识别就是对特定场景的 ocr,而对自然场景中的文字识别则是通用场景 ocr,一般来说,自然场景的文字识别由于环境更加复杂多样,其识别难度相对困难。文字识别通常包含文本检测和文字识别两个阶段。文本检测特点:1、相比于常规物体检测,文字行长度、长宽比例变化范围很大。 2、文本行有方向性,anchor-based的检测通常是水平和垂直方向的矩形。 3、有些艺术字体形状变化非常大,很多是弯曲的,并且字体类型丰富,语言种类丰富。 4、由于丰富的背景图像干扰,手工设计特征在自然场景文本识别任务中不够鲁棒。
文本检测比普通物体检测存在更多特点
本文将介绍以下几部分
一、配置docker环境为什么要特意提一下docker,当然是因为这东西挺有意思,可以帮助我们高效的做项目! 接下来就来看看,什么是docker吧。 做深度学习项目时,配环境是一件很让人头疼的事情,尤其是当你要跑别人代码时,自己的环境跟别人的环境不一致,就会出现各种bug,这就是所谓的生产环境(别人的环境)跟测试环境不一致(你的环境),那么,我们可以想象,如果现在有一种工具,可以把别人的环境克隆一份,放到自己电脑上,然后自己用这个环境,岂不就不会出现环境不一致的问题啦,美滋滋。 那么,有没有这种工具呢?答案是有的,这个工具就是docker。第一步,想要用docker,首先就要安装docker在我们的计算机上,安装docker教程如下:跟着教程复制粘贴命令就行了~ https://docs.docker.com/install/linux/docker-ce/ubuntu/第二步,安装好了docker,得学学怎么用docker,类似于git,在linux上可用命令可以操作:先学习一下docker里边的基本概念,再学习一下基本命令(如果pull下一个镜像,如果run等等),参考资料如下: https://blog.csdn.net/fgf00/article/details/51893771 蝈蝈:docker,救你于「深度学习环境配置」的苦海,https://zhuanlan.zhihu.com/p/64493662二、介绍多种文本检测算法1、ctpn (detecting text in natural image with connectionist text proposal network) eccv 16这篇论文的亮点是结合了cnn与双向lstm,能有效的检测出复杂场景的横向分布的文字, 在当时也算是开坑之作。 总的来说,该算法的重点部分有三个: 1、在网络上改进,似的提取的特征能够在双向lstm中使用。 2、使用了双向lstm。 3、采用了一组(10个)等宽度,不同高度的的anchors,用于定位文字位置。 4、采用文本线构造算法,把这些text proposal连接成一个文本检测框。 这篇论文的细节内容知乎上已经有大佬写的很好了,我就不重复搬砖了,可参考: 白裳:场景文字检测—ctpn原理与实现(https://zhuanlan.zhihu.com/p/34757009) 但是我还是要把这篇文章的实验结果搬出来,这样后续的文章可以跟他比较~实验结果:
总结分析:现在来看这算法已经挺老了,缺点很明显,只能检测横向或者纵向(改anchor比例后可检测纵向)的文本, 但是不能检测其他方向, 并且在精度上也落后了.github 开源代码:https://github.com/eragonruan/text-detection-ctpn2、east (east: an efficient and accurate scene text detector) cvpr 17这篇论文提出了一种端到端的快速有效的文本检测方法,消除了中间多个stage(如候选区域聚合,文本分词,后处理等),直接预测文本行,从下图中可看出,east的 pipeline(e)最为简洁。
east pipeline与其他框架pipline对比论文亮点:提出了一种基于两阶段的端到端的快速有效的文本检测方法(借鉴了densebox和fcn),不熟悉denseb。 ox的可以看看这篇文章中对其的介绍 。 陀飞轮:目标检测:anchor-free时代 即可以检测单词级别,又可以检测文本行级别.检测的形状可以为任意形状的四边形(quad)或倾斜矩形 (rbox)。 采用了locality-aware nms来对生成的框进行过滤。网络部分:这个网络的基本结构是以2015年发表的densebox中的网络为基础构建的。基于上述主干特征提取网络,抽取不同level的feature map,然后上借鉴u-net的合并规则进行合并。 输出是稠密的每个像素对于文本的预测信息。我们以rbox为例,网络输出的通道数应为6(1个为score map,4个为文本框的坐标信息,1个为角度)。我们预测的几何形状分为rbox和quad(输出为9维,包括8个坐标,一个score map)两种,在后面为每一种也相应设计了不同的loss值。其中score所代表的含义是在该像素位置预测的目标的可信度,其值为[0, 1]。在最后我们会将score值大于我们所设计的阈值的预 测框留下来,并进行nms获取最终结果[10,21,22]。
网络标签的生成:要对网络进行训练,就要有标签,让我们预测的结果和标签进行对比,然后通过不断优化参数,最终得到我们想要的网络。 score map 标签的产生:根据论文的描述,我们score map的正样本的范围,其实就是在图片中我们标注框的一个缩进框,如下图的(a)到(b)所 示,具体的公式请看原论文 [10]。 geometry map 标签产生:不详细说明,请参照原论文 [10]。
损失函数:由score map 和 geometry map 两部分产生的损失加权组成。
loss 对score map 采用了class-balanced cross-entropy,如下:
class-balanced cross-entropy  是平衡因子,计算公式如下 (是标签,ŷ 是预测的score map) : 平衡因子 对geometry map计算损失:“we adopt the iou loss in the aabb part of rbox regression, and a scale-normalized smoothed-l1 loss for quad regression”[10]这里只以rbox为例说明:iou loss 部分:
iou loss loss of rotation angle:
loss of rotation angle geometry map loss 总和: geometry map loss 总和 locality-aware nms: 与标准的nms相比,主要在于多了一个合并阶段。迭代两两候选框,如果两个候选框高于某个权值,进行一个加权的合并操作,合并完再做一个标准的nms [21,22]。实验结果:从实验结果中可以看出,这篇文章比14和15年的一些算法在精度上要高出很多。
总结分析:优点:用了特征图多尺度融合,所以可检测不同尺度的文本区域, 预测的文本框是带角度的,所以可以对任意方向的文本进行检测. 缺点:由于感受野和anchor大小的限制, 对长文本和曲线文本检测困难.github 开源代码:https://github.com/argman/east https://github.com/huoyijie/advancedeast https://github.com/songdejia/east3、seglink (detecting oriented text in natural images by linking segments) cvpr 17从east算法中可以知道, 检测长文本是比较困难的, 或者说,想要一次性检测整个文本行是比较困难, 针对这个问题, 本文提出了一种新的思想seglink (segment + link),它是在ssd目标检测方法的基础上进行改进的,但是不通过矩形框来回归文本区域的位置.seglink模型的做法是: 先将每个单词切割成更易检测的有方向的小文字块(segment),然后用邻近连接将各个小文字块link成单词。也就是说,网络会输出两类信息:1、一个是segment,它可能是一个字符或者几个字符等, 它不是整个文本行的框,而是文本行的一部分, 这个信息是带有角度的,如下图的黄框表示。 2、另一个是不同segment之间的link信息,而这个link也是在网络中自动学习的,由网络判定哪些segment属于一个文本行,由下图的绿线表示。
segment 与 link网络结构:对segments的预测:2个segment score和5个geometric offsets为**default box: 本文每个feature map的每个位置只采用了一个aspect ratio=1的default box,而ssd中是一系列(1, 2, 3, 1/2, 1/3).default box scale size: 本文的是根据当前层的感受野来进行设置scale size,而ssd是通过人工设定的. 对于link的预测包括同层(within-layer link)的和跨层(cross-layer link)的两种: 对于conv4_3层,对于feature map的每个位置需要预测其link输出的维度为2*8(文中对feature map中每个位置只预测一个segment,所以8就是当前层8邻域)=16;对于conv7, conv8_2, conv9_2, conv10_2, conv11其输出的link维度为2*8(8是当前层8邻域)+2*4(4是上一层4邻域)=24
主框架
within-layer link 和cross-layer link 可视化图网络最后总共输出通道数为31,如下图:
网络最后总共输出通道数combining segments with links算法预测出segment 和 link 之后,需要用一种算法将预测出的segments组合起来或者叫连接起来. 作者的算法是:首先通过人工设定的 α 和β(这两个值是采用网格搜索找到最优),对网络预测的segments和links进行滤除. 然后将每个segment看成node,link看成edge,建立图模型,再用dfs(depth first search)找到连通分量,每个连通分量包含一系列segments(用b表示). 最后,输出连接segments后的文本框的算法如下:
连接segments成一个框损失函数:包含三部分,segment classification loss (softmax),offsets regression loss (l1 regression),link classification loss (softmax).
实验结果:
总结分析:缺点: 间隔较大的文字块不能检测出来,比较link只是针对邻域的.github 开源代码:https://github.com/dengdan/seglink https://github.com/bgshih/seglink4、textboxes (textboxes: a fast text detector with a single deep neural network) aaai 17这篇文章的主要贡献提出了一个快速而精确的文本检测器,叫做textboxes,也是在ssd的基础上进行改进的。相对ssd的改变如下四点:1、修改了default box的apect ratio,分别为[1 2 3 5 7 10],变成长条状。 2、修改classifier卷积核的大小为1*5,而ssd中卷积核的大小为3*3,这样更适合文本检测。 3、提出了一个端到端的训练框架.在测试的时候,输入图像由单尺度变成了多尺度 。 4、利用识别来调整检测的结果。
主框架 textboxes是一个28层的全连接卷积网络,从主框架中可以看出,使用了1*5的卷积核,在每一个特征位置,预测一个72维的向量,因为每一个特征位置会有12个默认框(12个框怎么来的呢,首先有6种比例就有六个框,但是论文中指出了,为了防止水平方向的框太过密集,而垂直方向稀疏,所以每个默认框都设有一个垂直方向的偏移,相当于框的数量翻了一倍,如下下图默认框图所示)。72维(12*2+12×4)包括文本出现的得分(2维)和12个默认盒子的偏移(offsets)(4层)。
默认框图,这里只展示了两种比例(1和5的)损失函数:见下文textboxes++,与其相同。
实验数值结果
实验效果图,包含成功案例和失败案例分析总结:不能检测任意方向文本块.github 开源代码:https://github.com/gxd1994/textboxes-tensorflow https://github.com/shinjayne/shintb5、r2cnn (r2cnn: rotational region cnn for orientation robust scene text detection) corr 17这篇文章提出了一种旋转区域cnn (rotational region cnn,r2cnn),用于检测自然场景图片中任意方向的文本框,当然这种方法并不局限于斜框文字检测,也可以用在其他领域。 倾斜四边形如何表示,下边这边文章中写的比较清楚了,这篇文章用矩形的两个坐标点和矩形的高(x1,y1,x2,y2,h)来表示: stone:基于faster rcnn的斜框检测:r2cnn https://zhuanlan.zhihu.com/p/41662351
网络架构:
主框架第一步:通过rpn网络,得到正框的proposal,并且把anchor的大小从(8,16,32)改为(4,8,16,32) 或 (4,8,16),论文里说了,将anchor调小对检测是有帮助的。第二步:roipooling,使用了不同pooled size (7 × 7, 11 × 3, 3 × 11) 的 roipooling,将三种结果concate在一起,再经过fc6,fc7进行正框预测,斜框预测以及分类预测,之后,再通过斜框的nms进行后处理。 作者在论文里指出,每一个倾斜框都跟一个正框相关联,如下图中的(a)与(c),之所以既要对正框预测,又要对斜框预测,作者认为这能提升实验的效果。
斜nms 斜nms算法参考arbitrary-oriented scene text detection via rotation proposals损失函数:包含分类损失和回归损失,回归损失又包含正框和斜框两部分。
loss实验结果:在精度上超过east和seglink.
在不同参数设定下,r2cnn的结果比较
在icdar 2015数据集上的实验结果
在icdar 2013数据集上的实验结果 在icdar 2013数据集上的实验结果,作者认为效果没有超过sota的原因是由于他们使用的训练数据不包含单个字符,如果包含,将可能会超过sota。总结分析:对斜的小的目标可能效果好一点github 开源代码:https://github.com/yangxue0827/r2cnn_fpn_tensorflow https://github.com/detectionteamucas/r2cnn_faster-rcnn_tensorflow6、textboxes++ (textboxes++: a single-shot oriented scene text detector) tip 18从论文名字就可以看出,textboxes++是对textboxes的改进。
主框架相对textboxes的改变如下:1、对文本框的表示方式进行了改进。 在textboxes中,default box 是水平的框,不能检测倾斜的文字。论文中讨论了两种表示方式:分别是4个点坐标(x1,y1,x2,y2,x3,y3,x4,y4)(四边形)和两个点的坐标外加四边形的高(x1,y1,x2,y2,h)(倾斜矩形)。但论文推荐使用四个坐标的表示方式。四边形和矩形表示的计算方法如下:
四边形和矩形表示的计算方法 其中(x0,y0)是default box的中心点,(w0,h0)是default box的宽度和高度。 在每个feature map后的text-box layer将预测每个box上的文本存在概率以及位置偏置,以倾斜矩形为例,其预测输出为: 预测输出 根据预测输出,计算检测框的坐标和高度,公式如下(倾斜矩形形式):
计算坐标和高度
从默认框回归的过程 在textboxes++中,也为文本设置了垂直偏移,使得默认框在垂直方向密集,如下图所示,没有垂直偏移的只有黑色虚线框,就会漏掉很多连续的垂直方向文本。黄色虚线框是加入了垂直偏移后的,文本信息都被包围了进去(本人觉得这里的作图太过于刻意了,说服力并不是很强)。
垂直偏移 损失函数包含预测得分和预测定位两部分损失(与textboxes相同): loss 其中,n是与gt匹配的default boxes数量,_α_设为0.2,对于分类用两分类sotmax,对于定位用smooth l1。 此外,文章还用了on-line hard negative mining、数据增强、多尺度训练、有效级联nms等技巧。实验结果:从icdar和coco-text的实验数值上对比可以看出,这篇18年的文章已经完全干掉了17年的 east。
四边形与倾斜矩形对比
可视化结果分析总结:对textboxes 不能检测任意方向文本块的缺点进行了改进,其精度已经完全干掉了头一年的east.github 开源代码:https://github.com/shun14/textboxes_plusplus_tensorflow https://github.com/mhliao/textboxes_plusplus7、fots (fots: fast oriented text spotting with a unified network) cvpr 18与前面几篇只是检测部分的不一样,这篇论文是一个集合了文本检测跟文字识别两部分的一个统一的端到端的框架,可同时对图像中的文字进行检测跟识别。之前的大部分方法都是将检测跟识别当做两个独立的任务去做,先检测,再识别。这篇论文提出的框架处处是可微的,所以可以对其进行端到端的训练,结果表明,该网络无需复杂的后处理和高参数整定,易于训练,并且在保证精度的前提下大大提高速度,如下图所示:
可以看出,本文提出的统一的框架要比两阶段的方法快论文的主框架如下:
主框架 fots的整体结构由 shared convolutions,the text detection branch,roirotate operation,the text recognition branch 4部分组成。shared convolutions:fots的基础网络结构为resnet50,共享卷积层采用了类似u-net的卷积的共享方法,将底层和高层的特征进行了融合。这部分和east中的特征共享方式一样。最终输出的特征图大小为原图的1/4,如下图所示:
shared convolutionstext detection branch:该模块和east一样,采用了fcn作为文本检测器,损失包含分类的loss(cross entrop)和坐标的回归的loss(iou loss+角度loss),公式如下:
roirotate:roirotate将变换应用于定向特征区域(有角度的),以获得轴对齐的特征映射,如下图所示:
特征区域角度变换 roirotate计算公式如下:
m是放射矩阵,包含旋转,缩放,平移 使用变换参数,可以使用仿射变换轻松生成最终的roi特征:
这里的几个公式涉及到很多参数的概念,涉及到双线性插值,更具体的含义请看论文  :仿射变换矩阵,包含旋转,缩放,平移  :仿射变换后的特征图的高度,实验中为8  :仿射变换后的特征图的宽度  :特征图中的点的坐标  :特征图中的点距离旋转的框的上下左右的距离  :检测框的角度  :在位置(i,j),通道c处的输出值。  :在位置(n,m),通道c处的输入值。  :输入的高度  :输入的宽度 总之,经过变换之后,我们可以获得变换后的特征图,然后将该特征图输入到 text recognition branch进行识别。text recognition branch:这个分支使用共享卷基层的特征和变换后的特征来识别文字,其结构类似crnn结构,使用了类似vgg的顺序卷积,一个双向lstm,最后再接ctc解码器,对crnn和ctc不熟悉的可先看: 白裳:一文读懂crnn+ctc文字识别 https://zhuanlan.zhihu.com/p/43534801
text recognition branch structure实验结果:精度上可以说是很不错了
on icdar 2015
on icdar 2017
on icdar 2013
速度和模型大小比较总结分析:精度高,速度相对也比较快github 开源代码:https://github.com/jiangxiluning/fots.pytorch https://github.com/xieyufei1993/fots https://github.com/pay20y/fots_tf8、pixellink (pixellink: detecting scene text via instance segmentation) aaaa 18通过前边的文章我们可以发现,对文本的检测大都采用边框回归的思想来做,而这篇文章提出了不一样的方法,文章提出采用实例分割的方法分割出文本行区域,然后直接找对应文本行的外接矩形框,这样就实现了对文本的检测。 但是,通常文本之间挨得很近,很难将他们分割开来,如图所示:
接下来我们就看看这篇文章是如何做的......框架结构:主干网络是沿用了ssd网络结构,用vgg16作为base net,并将vgg16的最后两个全连接层改成卷积层; 论文中给出了两种网络结构:pixellink+vgg16 2s (特征图大学下降为原图的1/2)和pixellink+vgg16 4s (特征图大小下降为原图的1/4)。
主框架 1、提取不同层的feature map,对于pixellink+vgg16 2s网络结构:提取了conv2_2, conv3_3, conv4_3, conv5_3, fc_7. 2、对已提取的特征层,采用自顶向下的方法进行融合,融合操作包括先向上采样,然后再进行add操作.注意:这里包含了两种操作:pixel cls和pixel link(文本/非文本预测和link预测),所以对应的卷积核个数分别为2和16 。注意,fc6和fc7,被转换为卷积层。
网络结构连接像素:到这一步,我们已经得到了文本/非文本预测和link预测,设定两个阈值(一个用于像素分类,一个用于像素链接),可以得到pixel positive集合和link positive集合。然后根据link positive将pixel positive进行连接,得到ccs(conected compoents)集合(数字图像处理中连通分量的概念),集合中的每个元素代表的就是文本实例。注意:给定两个相邻的pixel positive,它们之间的link预测是由当前两个pixel共同决定的,两个link中至少有一个是link positive。连接的规则采用的是disjoint set data structure(并查集)的方法。外接矩形:直接使用opencv里边的minarearext提取文本的带方向信息的外接矩形框。后期处理:在链接的过程可能引入噪声,加入后期处理阶段,可以通过矩形的长、宽、面积、长宽比信息等将一些明显的错的区域过滤掉,以提高检测精度。损失函数:网络的损失函数包含两个部分:pixels loss和links loss: loss 损失函数的具体内容在此不展开讨论,除了在损失函数上进行的设计,作者还借鉴了ssd里边的数据增强的方法,具体的pixel loss 跟link loss如何设计以及如何生成训练数据的ground truth可参考大佬写的(我只是个搬运工): 燕小花:文本检测之pixellink https://zhuanlan.zhihu.com/p/38171172实验结果:从数值结果从可以看出,确实比east强,但是好像没有比seglink强太多。
总结分析:优点:无需在imagenet上预训练. 缺点:跟seglink一样,间隔较大的文字块不能检测出来.github 开源代码:https://github.com/zjulearning/pixel_link https://github.com/cheerss/pixellink-with-pytorch9、psenet (shape robust text detection with progressive scale expansion network) cvpr 19文章的目的是要解决弯曲文字检测的问题,如下图所示,对于弯曲文字,现有方法存在较大的问题.
b中容易重叠,c中误把多个实例识别成一个实例 作者认为现在的文本检测主流方法可以分成 regression-based 和 segmentation-based 两类,本文提出来的方法属于segmentation-based .论文的三大特点:1、segmentation-based方法能很好地解决任意形状文本区域检测这个问题,因为语义分割可以从像素级别上分割文字区域和背景区域. 2、对于如何分离靠的很近的文字块,如上图 (c) 所示,不能将他们分割开. 一个直观的想法是增大文字块之间的距离,使它们离得远一点。基于这个思路,论文引入了新的概念 kernel. 3、有了kernel的概念, 作者通过一种基于广度优先搜索的渐进扩展算法来构建完整的文字块。这个方法的核心思想是:从每个kernel出发,利用广度优先搜索来不断地合并周围的像素,使得kernel不断地扩展,最后得到完整的文字块。 下面就来看看这些特点具体是如何做的......pipeline :框架的主干网络是fpn,一张图片  通过fpn可以得到四个feature map ( ),然后通过函数  合并这四个特征图(  )得到  .
pipeline 的具体公式如下:
其中, || 代表 concatenation, u代表上采样。 接着,通过  来预测不同kernel scale的分割图  。其中 是最小kernel scale的分割图,里面不同的连通区域都可以看作不同文字块的“kernel”。 是最大kernel scale的分割图,是个完整的文字快。最后通过一个渐进扩展算法(progressive scale expansion)去不断地扩展  中的每个“kernel”.[1]渐进扩展算法(progressive scale expansion):
progressive scale expansion 该算法的输入是, 在上图中以n=3为例, cc 代表寻找连通分量的操作, 对着上图来分析: 1、首先,对求连通区域,得到不同文字块的“kernel”。 2、然后,通过 (g)所示的扩展操作合并中的文字像素,得到扩展后的结果 (c)。最后,使用同样的扩展操作合并中的文字像素,得到最后的文字块(d)。 3、(g)所示的扩展操作是基于广度优先搜索实现的。 我们可以把(g) 操作放大: 在边界上有些像素点会混淆,不知道该属于那个kernel, 在实践中,处理冲突的原则是,混淆的像素可以在先到先得的基础上由一个内核合并。
标签生成 (label generation) :使用 vatti clippingal gorithm 参考论文 generic solution to polygon clipping. 来生成不同核尺度的标签.
label generation损失函数和网络结构细节:在此不细讲,请参考原文:shape robust text detection with progressive scale expansion network实验结果:
总结分析:总实验数值结果可以看出,其检测精度效果好,但是速度慢.github 开源代码:https://github.com/liuheng92/tensorflow_psenet https://github.com/wenmuzhou/psenet.pytorch https://github.com/liuheng92/tensorflow_psenet   三、文本检测算法demo运行展示 暂时略, 后续会补上。


GlobalFoundries在美起诉台积电专利芯片技术侵权
“机器换人”浪潮持续 未来50年内将包揽高危工作
今年是值得换机5G的年份吗?
日韩半导体产业震动
电力系统无功补偿方式及存在的一些问题
一篇包罗万象的场景文本检测算法综述
运营商对于5G小站的需求量将是4G时代的数倍
Verilog HDL verilog hdl和vhdl的区别
德国5G招标在即 华为再次陷入险境
PCB的DDR4布线指南和PCB的架构改进
行业资讯|多家知名车企要停售燃油车了!全面进军新能源汽车时代了?
东芝宣布推出2通道有刷电机驱动器集成电路“TB67H400A”
浅谈连接器金触点比锡触点的优势
在网上如何区别机器人和真人
多款虹膜识别智能手机研发成功
是德E36102A E36103A E36104A直流电源介绍
晶电启动大规模减产:冻结4分之1 MOCVD产能
如何在3D系统中捕获真实世界的信息
pcb布线原则分享 PCB电源布线的技巧
LC谐振电路应用太难了?其实这一步至关重要