不同于网上千篇一律讲解CTPN的文章,本文将使用大量可视化过程来帮助大家理解CTPN,完整重现CTPN所有细节。

  • 先用一张动图过一遍CTPN全过程,接下来开始我们的讲解。

目录

  • 文本检测概念初识
  • CTPN总体结构
  • 特殊的anchor
  • 双向LSTM
  • RPN层
  • NMS
  • 文本线构造算法
  • 文本框矫正
  • 损失函数
  • 效果图
  • 参考

文本检测概念初识

OCR(光学字符识别)是CV一个重要的研究领域,OCR分成文本检测和文本识别两个步骤,其中文本准确检测的困难性又是OCR中最难的一环,而本文介绍的CTPN则是文本检测中的一个里程碑的模型。

文本检测有别于一般的目标检测,区别有以下几种:(1)一般的目标检测的每个目标一般是孤立的,所以每个目标的边界框都很明确,而对于文本检测中边界其实没有那么容易界定,因为文本(单词)其实是一个序列,在图像中每个单词中间是有空格的(字母间),对于我们的算法就很难界定这是单词内空格还是单词间空格,这也就分不清我们要检测文本的开始与结束的地方。(2)文本是一个序列,除去空间特征它还具有很重要的序列特征,它的上下文的序列信息对我们检测文本是有帮助的,而传统的目标检测提取的都是空间特征,自然效果不好。(3)文本行的长度变化是不固定而且变化很大,使用通用的检测算法很难生成好的候选框text proposal。

我们来看一下用一般目标检测算法(Faster-RCNN)跟用CTPN效果对比,很明显通用的目标检测算法的检测框会大很多(更不精确)

接下来我们开始讲解CTPN具体原理,本文默认读者了解Faster-RCNN以及LSTM原理,如果不懂的可以移步我前几篇文章。

CTPN总体结构


(1)CTPN第一步和通用的目标检测网络一样,先用一个backbone,这里用的是VGG16来提取空间特征,取VGG的conv5层的输出,输出维度为B × W × H × C(批次batchsize×宽×高×通道数)。这里要注意因为是第五层卷积输出,所以下采样倍数为16,也就是输出的feature map中的每个特征点对应原图16个像素。

(2)接下来我们会对feature map做一个编码,在feature map上使用3×3的滑窗来提取空间特征(也就是卷积),经过滑窗后得到的feature map大小依旧是B × W × H × C,但这里的每一个像素点都融合了周围3 × 3的信息(在论文中作者使用caffe中的im2col实现的滑窗操作,将B × W × H × C大小的feature map转换为B × W × H × 9C,本文遵从tf版本)

(3)接着将feature map reshape成(NH) × W × C输入双向LSTM(bi-direcional LSTM)提取每一行的序列特征。最后双向LSTM输出(NH) × W × 256,然后重新reshape回N × 256 × H × W

(4)将输出经过一个卷积层(图中的FC),变成N × H × W × 512

(5)N × H × W × 512 最后会经过一个类似RPN的网络,分成三个预测支路:如上图所示,其中一个分支输出N × H × W × 2k,这里的k指的是每个像素对应k个anchor,这里的2K指的是对某一个anchor的预测v=[vc,vh]v=[v_c,v_h]v=[vc​,vh​];第二个分支输出N × H × W × 2k,这里的2K指的是2K个前景背景得分,记做s=[text,non−text]s=[text,non-text]s=[text,non−text]。最后一个分支输出N × H × W × k,这里是K个side-refinement,预测某个anchor预测oko_kok​,这里看不懂没有关系,下面讲解anchor的时候会展开讲。

(6)经过上面步骤,可以得到密密麻麻的text proposal,这里使用nms来过滤掉多余的文本框。

(7)假如理想的话(文本水平),会将上述得到的一个文本小框使用文本线构造方法合成一个完整文本行,如果还有些倾斜,会做一个矫正的操作。

以上就是CTPN的架构,看不懂没关系,接下来我会可视化每个过程帮你了解。

特殊的anchor

第一部分有提到,文本长度的剧烈变化是文本检测的挑战之一,作者认为文本在长度的变化比高度的变化剧烈得多,文本边界开始与结束的地方难以和Faster-rcnn一样去用anchor匹配回归,所以作者提出一种vertical anchor的方法,即我们只去预测文本的竖直方向上的位置,不去预测水平方向的位置,水平位置的确定只需要我们检测一个一个小的固定宽度的文本段,将他们对应的高度预测准确,最后再将他们连接在一起,就得到了我们的文本行,如下图所示:

所以,我们对于每个像素点设置的anchor的宽度都是固定的,为16像素(第二部分提到,feature map上的每一点对应原图16个像素),这样就可以覆盖到原图的所有位置,而高度则是从11到273变化,这里我们每个像素点取k=10个anchor。

因为宽度是固定的,所以只需要anchor的中心的y坐标以及anchor的高度就可以确定一个anchor,其中带星号的为ground-truth,没有带星号的则是预测值,带a的则是对应anchor的值,具体那些回归的原理和之前讲解的检测算法一致就不多赘述。

双向LSTM

VGG16提取的是空间特征,而LSTM学习的就是序列特征,而这里使用的是双向LSTM,更好的避免RNN当中的遗忘问题,更完整地提取出序列特征。

RPN层


CTPN的RPN层和Faster R-CNN很像,第一个分支输出的是我们anchor的位置,也就是我们上面讲解anchor提到的两个参数(Vc,Vh)(V_c,V_h)(Vc​,Vh​),因为每个特征点配置10个anchor,所以这个分支的输出20个channel。

第二个分支则是输出前景背景的得分情况(text/non-text scores),通过softmax计算得分,所以这里也是输出20个channel。我们来可视化一下feature map:很明显可以看出前景背景的交替。

第三个分支则是输出最后水平精修side-refinement的比例ooo,这是由于我们每个anchor的宽是一定的,所以有时候会导致水平方向有一点不准,所以这时候就需要校准一下我们的框(在我自己的实验中这个帮助不大),精修的公式如下:

和anchor一样,带星号的是groundtruth,XsideX_{side}Xside​表示文本框的左边界或者右边界,CxaC^a_xCxa​表示anchor中心的横坐标,WaW_aWa​是anchor固定的宽度16像素,所以我们可以把这个ooo理解为一个缩放的比例,来对最后的结果做一个准确的拉伸,下面这张图中红色的就是使用了side-refinement,黄色的则是没有使用的结果。

这里要注意,作者选择与真值IoU大于0.7的anchor作为正样本,与真值IoU最大的那个anchor也定义为正样本,这样做有助于检测出小文本,避免小样本因得分低而被判断为负样本;与真值IOU小于0.5的anchor则定义为负样本,经过RPN之后我们只保留那些正样本。

nms

经过RPN,就会输出密密麻麻的检测框,这时候使用一个nms来过滤掉多的框。

文本线构造方法

经过上一部分我们已经得到了一系列的小的文本框,接下来我们就是用文本线构造方法将他们连起来。论文中说的不太清楚,这里引用白裳的叙述:

假设某张图有图9所示的2个text proposal,即蓝色和红色2组Anchor,CTPN采用如下算法构造文本线:
(1)按照水平xxx坐标排序Anchor
(2)按照规则依次计算每个Anchor boxibox_iboxi​的pair(boxj)pair(box_j)pair(boxj​) ,组成pair(boxi,boxj)pair(box_i,box_j)pair(boxi​,boxj​)
(3)通过 pair(boxi,boxj)pair(box_i,box_j)pair(boxi​,boxj​)建立一个Connect graph,最终获得文本检测框

这只是一个概述,接下来展开叙述。假设每个Anchor index是绿色数字,每个Anchor Softmax score是黑色数字:

首先是正向寻找:
(1)沿水平正方向,寻找和boxibox_iboxi​水平距离小于50的候选Anchor
(2)从候选Anchor中,挑出与boxibox_iboxi​竖直方向IOU>0.7的Anchor
(3)挑出符合条件2中Softmax score最大的boxjbox_jboxj​

再反向寻找:
(1)沿水平负方向,寻找和boxjbox_jboxj​水平距离小于50的候选Anchor
(2)从候选Anchor中,挑出与boxjbox_jboxj​竖直方向IOU>0.7的Anchor
(3)挑出符合条件2中Softmax score最大的boxkbox_kboxk​

最后对比scoreiscore_iscorei​和scorejscore_jscorej​,如果前者大于等于后者,则说明这是一个最长连接,设置Graph(i,j)=TrueGraph(i,j)=TrueGraph(i,j)=True;反之则说明这不是一个最长的连接,也就是这个连接包含在另外一个更长的连接中。

这样就建立了一个N×NN × NN×N的Connect graph,这个N是正Anchor的数量,紧接着遍历Graph来确定文本检测框,举个例子:Graph(6,10)=True,Graph(10,15)=TrueGraph(6,10) = True,Graph(10,15) = TrueGraph(6,10)=True,Graph(10,15)=True那么Anchor index6->10->15就组成了一个文本区域,文本框就确定了。

文本框矫正

很多网上的文章忽略了文本框矫正这一点,加入文本并不是理想的,也就是存在倾斜,文本框是需要矫正的,矫正的步骤如下:

(1)上一步我们得到了一些判断为同一个文本序列的anchor,我们首先要求一条直线L使得所有中心到这条直线的距离最小,也就是最小二乘法线性回归。

(2)这时候我们已经得到了每一段文字的基本走向,与此同时我们可以根据每一段里的text proposal得到这段文字的最大区域,我们可视化一下:

(3)现在有了最大范围和拟合出的文本的直线,我们要生成最终符合文字倾斜角度和区域的box,CTPN作者使用一种巧妙方法来生成text proposal:首先求每段text proposal的平均高度,并以此和拟合出的文字中的直线做上下平移,来生成候选区域。这个时候我们生成的box的上下边都是我们刚才的拟合出的直线的平行线,左右边则是由上下边生成的垂线生成的平行四边形。

(4)现在我们生成了一个平行四边形,但是我们传入识别部分肯定是一个矩形,所以作者根据框上下边斜度来对左右两条边做出斜度变化的补偿方法,来确定最终的矩形框。


这里要注意,CTPN在实际当中对一些倾斜样本的鲁棒性还是略显不足的。

损失函数


CTPN的损失函数如上图,一眼看上去又是一个Muti-task的loss,分为三个部分:(1)LS:每个anchor是否是正样本的classification loss(2)Lv:每个anchor的中心y坐标和高度loss(3)L0:文本区域两侧精修的x损失,和Faster-RCNN一样,以上的loss都采用smooth L1 loss,λ\lambdaλ是权重系数,NNN则是归一化系数,这部分很清晰没什么好讲的。

效果图

这是去年做的银行卡号识别项目的效果图,可以看出CTPN对这种横向的文字检测效果还是很好的:

对于场景中的文本检测效果也是不错:

参考

(1)paper https://arxiv.org/abs/1609.03605

(2)文本线构造方法说明:https://zhuanlan.zhihu.com/p/34757009

(3)可视化图片出处:https://www.bilibili.com/video/BV1XJ411k7sf?from=search&seid=9398415273544549231

深度解析文本检测网络CTPN相关推荐

  1. CTPN文本检测网络

    CTPN文本检测网络 简介 网络模型 anchor机制 损失函数 训练 代码实现 简介 CTPN,全称Connectionist Text Proposal Network,连接文本建议网络. 它是用 ...

  2. 基于PaddleOCR的DBNet多分类文本检测网络之身份证识别

    目的 全网的身份证识别大部分都是通过识别整张图片,然后再对数据进行格式化解析,这会照成很大的局限性,比如非摆正图片,图片上有其他干扰信息,这就会导致通过此方式来识别大大降低了准确率和不确定性.这篇文章 ...

  3. 深度学习目标检测网络汇总对比,挺好的

    深度学习目标检测网络汇总对比 本文总阅读量次 欢迎star我的博客 2019-01-03 参考 :https://medium.com/@jonathan_hui/object-detection-s ...

  4. 【每周CV论文】深度学习文本检测与识别入门必读文章

    欢迎来到<每周CV论文推荐>.在这个专栏里,还是本着有三AI一贯的原则,专注于让大家能够系统性完成学习,所以我们推荐的文章也必定是同一主题的. 文本检测和识别是计算机视觉的一个非常重要的应 ...

  5. OCR文本检测算法-CTPN模型

    介绍: CTPN是在ECCV 2016提出的一种文字检测算法,是目前流传最广.影响最大的开源文本检测模型,可以检测水平或微斜的文本行.CTPN结合CNN与LSTM深度网络,能有效的检测出复杂场景的横向 ...

  6. 深度学习目标检测网络个人总结

    学习目标检测有一年了,从论文学习到工程实践,个人的认识得到了一定提升,大致总结一下. 目标检测是深度学习的图像处理一个方向,还有其他方向比如实例分割(找出目标并得到掩膜).语义分割(每一个像素属于什么 ...

  7. Github:深度学习文本检测识别(OCR)精选资源汇总

    点击我爱计算机视觉标星,更快获取CVML新技术 今天跟大家推荐一个Github项目,来自NAVER Clova AI Research的hwalsuklee同学汇总了近几年的基于深度学习进行文本检测. ...

  8. 深度学习射频干扰检测网络:Deep residual detection of Radio Frequency Interferencefor FAST

    Deep residual detection of Radio Frequency Interference for FAST [MNRAS 2020] [PDF] MNRAS: Monthly N ...

  9. 深度学习目标检测网络FPN tensorflow升3d尝试

    初始代码在github上.你只要搜索FPN tensorflow 即可,赞最多的那个便是.目标是想要将其该为3d的FPN.https://github.com/DetectionTeamUCAS/FP ...

最新文章

  1. python编程入门课 视频教程-Python编程零基础入门课
  2. POJ2771最大独立集元素个数
  3. 使用pyinstaller打包python_使用pyinstaller打包Python项目,python
  4. php 从字符中随机挑一个数,php 对中文字符串的处理- 随机取出指定个数的汉字...
  5. Redis基础学习(2)
  6. [非原创] 获取CPUID;
  7. T00LS专访白帽子:carry_your和带头大哥【T00ls人物专访第八期】
  8. Peer-To-Peer 综述(P2P技术综述)
  9. Linux和Windows双系统下,找回丢失Windows启动项
  10. Windows窗口程序
  11. 文章排版——上机实验,C语言
  12. 大数据技术之高频面试题
  13. 学计算机女生考研什么专业好就业,适合女生考研易就业的十大专业有哪些
  14. SSE(服务器推送事件)的介绍、问题及解决
  15. 小马哥-----高仿三星G9006(G900S G900H G900W)拆机主板图与开机界面图 6582芯片主板为S105
  16. 别让房子升值迷惑,特别是公寓
  17. 电脑搜不到wifi?新换的路由器
  18. 整理Glide方法使用含义(毛玻璃效果,实现圆角等)
  19. 新开餐饮店如何市场定位,都应该注意些什么?
  20. MIT 计算机操作环境导论Missing Semester Lesson 9 安全和密码学

热门文章

  1. 《MATLAB智能算法30个案例》:第23章 基于蚁群算法的二维路径规划算法
  2. python带你采集某m3u8格式视频~带你任意下载
  3. day198-2019-01-04-英语流利阅读-待学习
  4. android状态栏一体化(沉浸式状态栏)
  5. 我的世界Java版(Minecraft:Java)数据包教程 (1)
  6. .dylib文件扩展名,.dylib文件如何打开?
  7. 【Unity VR开发】结合VRTK4.0:自身移动(滑动)
  8. 油气储运和测控技术的关系
  9. 姜奇平:互联网带来了商业文化的变革
  10. 使用Snagit安安静静的截屏并保存