根据大小分割大文本_场景文本检测—CTPN算法介绍

6c70cda5e05347db1ac660774e8a05c4.png
SIGAI特约作者:沪东三哥
原创声明:本文为SIGAI 原创文章,仅供个人学习使用,未经允许,不得转载,不能用于商业目的。

其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造。

  • 书的购买链接
  • 书的勘误,优化,源代码资源

获取全文PDF请查看:场景文本检测-CTPN算法介绍

何为OCR ?

OCR的全称为“Optical Character Recognition” 中文翻译为光学字符识别。它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来,并转换成一种计算机和人都能够理解的形式的过程。

先来看一个简单的OCR的流程:

ff9cbddb8df2acbd321a616482f64904.png

第一步,通过图像信息采集(一般就是相机),得到包含了待识别字符的图像,分析结构。

第二步,运用阈值操作等一些图像处理的方法对待测对象进行去噪和矫正。

第三步,因为文本信息的特殊性质,需要进行行列分割,对单个字符,或者是连续几个字符进行检测。

第四步,将分割后的字符图像导入识别模型中进行处理,进而得到原图中的字符信息。

场景文本识别

对于印刷字体的OCR技术如今已经相当成熟了。腾讯TIM的手机版就自带有图像文字提取的功能,微软的Office Lens的各种扫描功能呢等等,虽然不能说是百分之百正确,但是95%以上的印刷字体识别基本都是可以做到了。所以现在技术上关注的更多的是“场景文本识别”,也就是复杂环境下的字符信息的识别,如下面几张图所示。

7598ff72a696e7b01fde3a5b052fd6fb.png

对于复杂环境中的字符的识别,主要包括文字检测和文字识别两个步骤,这里介绍的CTPN(Detecting Text in
Natural Image with Connectionist Text Proposal Network)方法就是在场景中提取文字的一个效果较好的算法,能将自然环境中的文本信息位置加以检测。

涉及到了图像中位置信息的选择,很容易联想到之前用于目标检测的R-CNN的模型。毕竟CNN(Convolutional Neural Network)在这两年的图像处理上一枝独秀已经“深入人心”。那么把“字符位置”标记成一类,然后直接放入CNN模型处理岂不美哉?不过,现实总不会这么美好,文字的多种情况、字体,以及大面积的文字信息的位置,都对我们直接用R-CNN的方法产生了干扰,让结果产生严重的偏差。应对于此,一类结合CNN优势,专门应对环境文本信息的模型也就因运而生了,CTPN正是其中的佼佼者。

CTPN算法概述

言归正传,那么算法上文本位置的准确界定是怎么做到的呢?

首先,明确待检测的目标的特点,无论是图3还是图4的样例,文字信息的特点在于它是一个序列,是由“字符、字符的一部分、多字符”组成的一个sequence。所以这个目标显然不像我们一般的目标检测中的对象那样是独立和封闭的,所以不妨使用前后关联的序列的方法,比如说RNN (Recurrent Neural Networks),利用前后文的信息来进行文本位置的测定。

6c1f6cb609a347372ce3feddbbcb1f91.png

另外很重要的一点是,作者认为预测文本水平方向的位置比预测竖直方向上的位置要困难得多。所以检测的过程中
不妨引入一个类似数学上“微分”的思想,如下图5所示,先检测一个个小的、固定宽度的文本段。在后处理部分再将这些小文本段连接起来,得到文本行。

9bb2b0ffe12400e8d627a53ce5d96d60.png
图5 “微分”示意图

有了CNN和RNN结合,以及数学上”微分”思想处理文字段这样的奇思妙想之后,接下来就看作者是如何将其实现的了。具体流程图如下,然后分别进行介绍。

过程的图像如下图6:

d427b84b4ab5ee8700798133d3d77723.png
图6算法流程示意图

具体的步骤为:

1. 首先,用VGG16的前5个Conv stage得到feature map,大小为W*H*C

2. 用3*3的滑动窗口在前一步得到的feature map上提取特征,利用这些特征来对多个anchor进行预测,这里anchor定义与之前faster-rcnn中的定义相同,也就是帮我们去界定出目标待选区域。

3. 将上一步得到的特征输入到一个双向的LSTM中,输出W*256的结果,再将这个结果输入到一个512维的全连接层(FC).

4. 最后通过分类或回归得到的输出主要分为三部分,根据上图从上到下依次为2k vertical coordinates:表示选择框的高度和中心的y轴的坐标;2k scores:表示的是k个anchor的类别信息,说明其是否为字符;k side-refinement表示的是选择框的水平偏移量。本文实验中anchor的水平宽度都是16个像素不变,也就是说我们微分的最小选择框的单位是 “16像素”。

5. 用文本构造的算法,将我们得到的细长的矩形(如下图7),然后将其合并成文本的序列框。

4605cede6588f04b22742743eb39823e.png
图7 回归的长矩形框


核心方法

具体的流程已经介绍完毕了,而这些流程中有很多作者提出的实现方法需要特别关注,名称(按照论文)分别是:Detecting Text in Fine-scale proposals(选择出anchor,也就是待选的”矩形微分框“)、Recurrent Connectionist Text Proposals(双向LSTM,利用上下文本信息的RNN过程)、Side-refinement(文本构造,将多个proposal合并成直线)。

Detecting Text in Fine-scale proposals

和faster-rcnn中的RPN的主要区别在于引入了”微分“思想,将我们的的候选区域切成长条形的框来进行处理。k个anchor(也就是k个待选的长条预选区域)的设置如下:宽度都是16像素,高度从11~273像素变化(每次乘以1.4),也就是说k的值设定为10。最后结果对比如下:

f1a375d464b85f9d7ac5dcecc607409f.png

图8 Fine-scale text的对比

本文使用的方法回归出来的y轴坐标结果如下:

d5d7e97ab3d4b8a1ad91dc5d730463cc.png

其中标记*的表示为真值;v = {vc,vh} 表示一个预测的框选位置,因为长度固定(之前确定的16像素),vc表示的是该预选框在y轴上的中心位置,vh表示这个预选框的高度。

Recurrent Connectionist Text Proposals:

其方法对应的就是之前流程中的”双向LSTM“对应的细节,将前后文的信息用到文本位置的定位当中。其中BLSTM有128个隐含层。输入为3*3*C滑动窗口的feature,输出为每个窗口所对应的256维的特征。简要表示如下:

8c05b9f29074ec22f8c53660bcd1c655.png
图9 输入输出示意图

下面是使用RNN和不使用RNN的效果对比图。

45ab3ae54d2190145750eb13b0bf29ad.png
图10 RNN效果对比图

Side-refinement:

先进行文本位置的构造,Side-refinement是最后进行优化的方法。对定位出来的“小矩形框”加以合并和归纳,可以得到需要的文本信息的位置信息。我们最后保留的小矩形框是需要score>0.7的情况,也就是将下图中的红色小矩形框合并,最后生成黄色的大矩形框。

cd4b445065a278f03a5726ef74482de4.png
图11 小区域分割示意图

主要的思路为:每两个相近的proposal(也就是候选区)组成一个pair,合并不同的pair直到无法再合并为止。而判断两个proposal,Bi和Bj可以组成一个pair的条件为Bi—>Bj,同时Bj—>Bi;该符号的判定条件见下图。

cf7b6a3d280c5b775705989d61ea25e0.png
图12 可合并区域判定示意图

因为这里规定了回归出来的box的宽度是16个像素,所以会导致一些位置上的误差,这时候就是Side-refinement发挥作用的时候
了。定义的式子如下:

c65baeaf102e1daab7177542418797de.png

其中带*表示为GroundTruth.。

表示回归出来的左边界或者右边界,
表示anchor中心的横坐标,
是固定的宽度16像素。所以O的定义相当于是一个缩放的比例,帮助我们去拉伸回归之后的box的结果,从而更好地符合实际文本的位置。对比图如下,红色框是使用了side-refinement的,而黄色框是没有使用side-refinement方法的结果:

1e2908493603474ef1f96b07142135d9.png
图13 Side-refinement结果对比

纵观整个流程,该方法的最大两点也是在于将RNN引入了文本检测之中,同时将待检测的结果利用“微分”的思路来减少误差,使用固定宽度的anchor来检测分割成许多块的proposal.最后合并之后的序列就是我们需要检测的文本区域。CNN和RNN的高效无缝衔接极大提升了精度,实验对比如下表所示:

fb888fb77b64a6a97a9e9d573c42393f.png
表1 实验结果与其他方法的对比
说明
1. 论文: https://arxiv.org/pdf/1609.03605.pdf
2. 代码: https://github.com/eragonruan/text-detection-ctpn
(搬运,实测运行可靠,是有人根据faster-r-cnn的tensorflow版本进行 改写的,具体的训练和测试请参阅git上的readme)
3. 除流程图外其他配图和表格信息均来自原文 “Detecting Text in Natural Image with Connectionist Text Proposal Network”

参考文献

[1] Ren, S., He,K., Girshick, R., & Sun, J. (2015). Faster R-CNN: towards real-time object
detection with region proposal networks. International Conference onNeural Information Processing Systems (Vol.39, pp.91-99). MIT Press.

[2] sTian,Z., Huang, W., He, T., He, P., & Qiao, Y. (2016). Detecting Text in Natural Image with Connectionist Text Proposal Network. European Conference on Computer Vision (pp.56-72). Springer, Cham.

[3] Olah C(2015). Understanding LSTM networks.blog, http://colah.github.io/posts/2015-08-Understanding-LSTMs/, August 27, 2015.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(递推)三角形分割平面问题

题目描述 用N个三角形最多可以把平面分成几个区域? 输入 输入数据的第一行是一个正整数T(1<T<10000),表示测试数据的数量.然后是T组测试数据,每组测试数据只包含一个正整数N(1<N<10000). 输出 对于每组测试数据,请输出题目中要求的结果. 样例输入 2 1 …

floquet端口必须沿z轴设置_Ansys Workbench 振动给料机偏心轴的模态分析

张哲维 于 岩 刘传峰 公 业振动给料机主要由振动机架、弹簧、振动器电机等组成。振动器是由两个特定位置的偏心轴以齿轮相啮合组成&#xff0c;装配时必须使两齿轮按标记相啮合&#xff0c;通过电机驱动&#xff0c;使两偏心轴旋转&#xff0c;从而产生巨大合成的直线激振力&am…

cp命令显示进度条_干货|| Linux常用命令大全

Linux常用命令目录操作命令ls命令名称&#xff1a;ls命令英文原意&#xff1a;list命令所在路径&#xff1a;/bin/ls执行权限&#xff1a;所有用户功能描述&#xff1a;显示目录文件ls (显示当前目录下文件)ls 目录名 (显示指定目录下文件)ls -l (长格式显示目录文件)ls -l 文件…

二进制法生成1-n的子集

先上代码&#xff1a; #include<iostream> using namespace std;void print_subset(int n, int s){for(int i0;i<n;i)if(s&(1<<i)){printf("%d",i);} printf("\n");} int main(){int n;cin>>n; for(int i0;i<(1<<n);i)…

c#中connect函数_Flink算子使用方法及实例演示:union和connect

Flink的Transformation转换主要包括四种&#xff1a;单数据流基本转换、基于Key的分组转换、多数据流转换和数据重分布转换。读者可以使用Flink Scala Shell或者Intellij Idea来进行练习&#xff1a;Flink Scala Shell&#xff1a;使用交互式编程环境学习和调试FlinkFlink 01 |…

java移动端接口测试_借助Charles来测试移动端-下篇

本篇是借助Charles来测试移动端的下半篇。(上篇任意门点我)上次说到可以借助Charles来抓移动端的网络请求&#xff0c;接下来&#xff0c;我们来看一下怎么通过Charles来模拟返回&#xff0c;还是以网页版豆瓣为例。先找到网页版豆瓣的请求通过上面这句话&#xff0c;我们知道&…

仓库货位卡标识牌_【干货】仓库布局,你想学啊,我教你啊!

下面两张仓库布局图&#xff0c;哪一个更加好&#xff1f;那再来看下这两张对比图&#xff0c;哪个布局更加好&#xff1f;为什么要关注仓库布局&#xff1f;在仓库操作中&#xff0c;什么操作最耗时&#xff1f;有一个大概的统计&#xff0c;假如说总工作量是100%的话&#xf…

openglshader实现虚拟场景_虚拟演播室设计原则

所谓虚拟演播室&#xff0c;就是利用计算机产生出虚拟的三维背景和道具&#xff0c;然后通过视频合成系统将演员与其进行合成&#xff0c;生成全三维、真人与虚拟布景和道具融合的效果。虚拟演播室系统只需要在一个蓝色背景下进行演播&#xff0c;不需要真正去搭建演播室布景&a…

功率谱 幅值谱_语音合成中的Mel谱和MFCC谱无区别

语音合成目前比较流行的方案是Tacotron(2) WaveNet(WaveRNN, LPCNet)等神经网络声码器。这些方案的流程大致相同&#xff0c;先由文本生成特征谱&#xff0c;再将特征谱重建为音频。在选择特征谱的时候&#xff0c;有的使用了Mel谱&#xff0c;有的使用了倒谱。本文通过梳理计…

c++builder tadoquery存储过程_Electron桌面应用程序从创建项目、启动项目到打包程序的详细过程...

开发环境本文使用环境node12.14.1electron10.1.5electron-builder22.9.1electron-updater4.3.5&#xff1b;操作过程一、新建和启动项目1. 直接使用官网示例&#xff0c;先克隆示例项目的仓库&#xff0c;然后进入该仓库&#xff1b;# 克隆示例项目的仓库$ git clone https://g…

(BFS+hash去重)八数码问题

题目&#xff1a; 编号为1~8的8个正方形滑块被摆成3行3列&#xff08;有一个格子空留&#xff09;。每次可以把与空格相邻的滑块&#xff08;有公共边才算相邻&#xff09;移到空格中&#xff0c;而它原来的位置就称为了新的空格。给定初始局面和目标局面&#xff08;用0表示空…

变速后没有声音_问答 | 现代朗动at,启动后怠速不稳,热车后正常,是什么问题?...

今日老陈问答Q陈工你好&#xff1a;1.手动家车&#xff0c;停车怠速&#xff0c;有挡或空挡行驶都有异响&#xff0c;踩离合异响消失&#xff0c;抬离合异响恢复&#xff0c;换分离轴承未解决&#xff0c;压板轻磨损没更换&#xff0c;舱室粉末没清理 2.手动挡加自动变速箱油行…

怎么加载文件_Java虚拟机从入门到入土之JVM的类加载机制

作者&#xff1a;六脉神剑转载于&#xff1a;https://juejin.im/post/5e1aaf626fb9a0301d11ac8eJVM总体概述JVM总体上是由类装载子系统(ClassLoader)运行时数据区执行引擎内存回收类文件结构以上5个部分组成&#xff0c;每一个都是非常重要的&#xff0c;如果你要了解JVM&#…

的向上取整函数_计算机二级Excel常用函数解析

决定为大家推点干货让大家学习一下Excel的函数应用ABS绝对值 从最简单的开始第一个是ABS函数简而言之就是取绝对值作用就是MAX&MIN函数 这两个函数是好哥们也比较简单的就是从一堆数字中选出最大值和最小值如图C6格所示ROUND函数 四舍五入函数可不是回合ROUND 1算是比较…

多个 本地仓库_【运维工具】搭建npm私有镜像仓库,天下苦于npm build久矣

​01 前 言当你的研发团队越来越大&#xff0c;或是你无法忍受node超慢的构建时你可以考虑继续读下去&#xff0c;给大家推荐一个基于Verdaccio相对较完整的解决方案。由于环境的原因&#xff0c;我们直接去 http://npmjs.org 下载就不要考虑了&#xff0c;可以将npm config se…

地图自定义图标_如何在H5里添加地图导航?这份教程请收藏!

智能手机的出现为我们的生活带来了翻天覆地的改变&#xff0c;比如说衣食住行都有了显著的变化。外卖让就餐更加方便、手机支付也让生活更加便利&#xff0c;地图导航功能更是让大家从此不再迷路&#xff0c;有了手机以后&#xff0c;大家都开始习惯直接用手机搜索目的地&#…

c语言年月日问题思路总结 闰年非闰年每个月份的天数 解决今天是妹子出生的第多少天的问题

1.闰年非闰年每个月份的天数&#xff1a; int year[2][13]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };经观察发现&#xff1a; a。2月闰年有29天&#xff0c;非闰年28天 b。1、3、5、7、8、10、12月份&#xf…

aop判断方法是否执行成功_判断图中是否有环的三种方法

0、什么是环&#xff1f;在图论中&#xff0c;环&#xff08;英语&#xff1a;cycle&#xff09;是一条只有第一个和最后一个顶点重复的非空路径。在有向图中&#xff0c;一个结点经过两种路线到达另一个结点&#xff0c;未必形成环。1、拓扑排序1.1、无向图使用拓扑排序可以判…

sap运维要做哪些工作_患上腰椎间盘突出,适合做哪些工作?不适合做哪些工作?...

腰椎间盘突出的患者&#xff0c;大多数是年轻人。年轻人生活和工作压力比较大&#xff0c;大多数人都不可能因为腰椎病完全停止工作&#xff0c;事实上也不用完全停止工作&#xff0c;我们更多地应该虑如何平衡养病和工作之间的关系&#xff0c;那我们今天就来和大家讲讲&#…

bat执行exe程序_dos命令start教程,并行运行exe程序或者启动bat批处理cmd脚本

大家好&#xff0c;我是老盖&#xff0c;首先感谢观看本文&#xff0c;本篇文章做的有视频&#xff0c;视频讲述的比较详细&#xff0c;也可以看我发布的视频。今天我们学习DOS命令start这个命令&#xff0c;它可以启动一个EXE程序&#xff0c;也可以启动一个BAT批处理脚本&…