本文主要是介绍从目标检测到特定类别的检测任务:文本检测阅读笔记CTPN(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- Detecting Text in Natural Image with Connectionist Text Proposal Network
- 1. Background
- 2. Connectionist Text Proposal Network
- Fine-scale Proposals
- Recurrent Connectionist Text Proposals
- Side-Refinement
- Loss函数
- 3. 实验结果
一周一篇论文~先吐槽下临近期末大作业一堆一堆的- -!其实是正好有个大作业组内成员想实现一下文本检测,所以第一次接触了这方面的内容,写下了这篇文章。最前面是我对目标检测到特定类别任务检测的一点自己的想法,希望能给和曾经的我一样搞不清楚的同学提供一点个人看法,同时也是抛砖引玉;然后会进入正式的论文阅读部分。
其实我第一次做目标检测就是用SSD做行人的检测工作,当时我就有一个疑问,直接用SSD做一个单独的行人检测效果会不会不太好,别的不说光anchor那好多个比例就不合适,毕竟行人是只是瘦长的,现在想想当时做的结果果真很惨,毕竟SSD本身就不太适合小尺度问题。
目标检测能不能拿来做特定类别的检测?肯定可以,改下输入输出的问题嘛,但是效果好不好呢?实际上,目标检测为了能取得更好的泛用性,必然对某个特定类别的目标的特有特征做一定程度的忽略(比如上文提到的行人的瘦长形状,或者文本的鲜明纹理特征),而是关注更广泛的共性特征。这就导致了目标检测在对待某个特定的类别做检测时候效果可能不是很好。
打个比方,何明的Is faster rcnn doing well in pedestrian detection中就谈到,做行人检测,RPN的结果甚至比整个Faster
RCNN结果更好(RPN在只有一个类别的情况下也可以看作一个检测器),原因就是街景图片当中,行人往往很小,过深的网络会使得小尺度的行人更加容易被忽略。
所以我个人感觉目标检测对于类别子任务的检测来说,应该更多的是指导作用,提供一些新的思路和算法(比如RPN这样的候选框筛选机制),具体在实践到检测特定类别的时候,还需要针对该类别的独有特征做一些改进和舍弃的,这一点在本次的论文中也会谈到。如果有些同学在帮老板搬砖的时候,目标检测在某些特定场合表现不好,不妨从这个角度思考一下问题。
好的,以上是一些废话,下面正式进入这篇借鉴了很多Faster RCNN论文。
Detecting Text in Natural Image with Connectionist Text Proposal Network
这是ECCV 2016的文章,有点老了,做的是localizes lines的工作。 顾名思义,是检测文字行,可以应用在例如路标、告示牌这种大多数只有一行文本的情境下,如果是检测商标这种检测出来的就是分行而不会算成一段文字。本文参考了Faster R-CNN的很多思路,比如典型的RPN机制,通过Anchors的设置,实现了多尺度;另外本文的方法也是面向多种语言文字的,总的来说是比较强大的算法,不过只是进行了检测而没有进行识别。
1. Background
文本检测的难点主要是在于文本有large variance的特点,还有就是文字只是单纯的线条、类似墙面之类的背景都会露出来部分,导致它的背景特别复杂。
目前常用的方法是采用low-level的特征或者笔画字符的特征来检测,总的来说是检测单个文字然后进行text line的重建,这样其实很复杂,鲁棒性也差,更重要的是,没有综合考虑context的information,实际上人辨识一系列字符也是比辨识一个单独的要容易的,尤其是字符本身比较模糊不清的时候。
好了,现在开始思考一个问题,如果直接把general object detection使用到文本检测的场景,会有哪些问题?最明显的,定位不准的问题,文字并没有明确的bbox,字母和字母之间有空隙,单词和单词之间又有空隙,怎么克服这种边界模糊的障碍?而且为了后续识别工作,文字检测对位置精度的要求也是明显高于一般的目标检测的。
作者的主要贡献如下:
- 将text detectionwention问题转化成了定位一系列尺度合适的text proposal问题
- 引入了recurrent策略(也就是RNN),连接text proposal
- 整合1.2,形成一个e2e的模型
- 在各个数据集上都取得了不错的效果
2. Connectionist Text Proposal Network
文章的主体框架如下:主要就是改进后的RPN和RNN两个部分,此外,作者还专门设计了一种更精准定位边缘的side-refinement机制。
Fine-scale Proposals
这部分主要要解决的问题就是text detection没有明确的边界的问题,因此,如果anchor设置得过大,很容易只检测到一部分的文本,作者的思路是将text line看成很多个text proposal连缀成的,这里的text proposal可以是包含部分字母/汉字的比较小的一部分,但同时又不会设置得过小,以免候选anchor正好落在字符的空隙之间导致line断裂,具体的设置可以看下图:
每个红色的小框就是RPN阶段生成的proposal,同时,我们也可以留意一下,虽然比如第二行H和O之间空隙比较大,但因为proposal恰好涵盖了H的一小部分,因此它最终还是被看成了含有text的proposal,而没有导致文字断裂。
怎么实现这种proposal的呢?
- anchor的宽度不再按照比例,而是16(对应input images中的16个像素),这个正好是conv5 maps的stride,因此在conv5上生成anchor正好在水平方向覆盖了整张图
- 作者设计了k个anchor,主要针对的竖直方向上的,同样采用的是像素的表示方式,一共是11~273个pixels(每次除以0.7),当然,在用这些anchor的中心和高度计算回归目标的时候,也要算偏移量、做归一化以避免量纲的不统一,公式和计算rcnn回归目标的公式类似
- 在conv5上使用3x3的卷积,输出通道为256D(为什么是这个下个部分会解释),然后送入RNN,从而寻找水平方向的关系
- 在output结果的时候,大于0.7的被认为是含有text的,同样,要使用NMS策略
- GT的分配机制类似于Faster RCNN,两步走,阈值是0.7
Recurrent Connectionist Text Proposals
可能有的同学和我一样也不太熟悉RNN,但是相信大家对RNN的一些工作机制和设计原理都是有一些了解的。RNN的主要特点就是输入单元之间并不是独立的,一个输入会以某种形式传入到下一个输入的隐层中,这就相当于建立了多个输入之间的联系。
大致原理就相当于下面这张图吧:
当然作者使用的是双向LTSM,实际上更为复杂。这里主要希望大家能理解了为什么使用RNN,因为作者每一行的多个proposal实际上是有关系的,这种时候单纯的CNN不能解决问题,必须考虑建立它们之间的关联性,因此才引入了RNN。
我会在之后看下代码,再详细给大家解释下RNN和作者的双向LTSM是怎么实现的。希望到时候再和大家交流~
Side-Refinement
假设有k个anchor,那么RNN的输出在经过fc后,要预测k个scores和2k个垂直方向的坐标偏移量。怎么在判断proposal之后对text line进行重构?
作者采用的方法是构建proposal pair,当Bj对Bi这两个proposal满足如下条件:
- 它们在竖直方向的重合度超过0.7
- Bj在水平方向距离Bi最近
- 它们之间的水平距离不超过50pixel
则认为Bj和Bi构成了proposal pair,text line本质上就是多个proposal pair联结而成的。
但是这样导致的一个问题是,虽然中间没有关系,但是text line的两边是不是会出现误差,如下图所示:
所以作者就引入了side-refinement机制。它的核心就是在预测k个scores和2k个垂直方向的坐标偏移量的同时,还要预测k个边缘偏移量,用来计算proposal和text line最左边和最右面的位置偏移,边缘偏移量的计算公式和竖直方向的偏移量计算有一点相似,具体可以参考论文。另外要注意这个边缘偏移量是只计算当前proposals到最近的那一边(比如离左边text side近就是算到左边缘的偏移位置),因此只有k个边缘偏移量而不是2k个~还要注意的一点是并不是所有的anchor的边缘偏移量都会参与BP的参数迭代更新,这个在下面loss函数里面会提到~
Loss函数
Loss函数的定义也是顺理成章的事情,三部分,类别判断(是不是text),竖直方向坐标偏移量和边缘偏移量,分别是softmax,smoothL1和smoothL1,其实和faster rcnn类似~需要提一下的是这里的数量问题,Ns是mini-batch里所有anchor的数量,Nv就是这些anchor里被判断属于文本(score和IoU均满足一定条件)的那部分anchor了,而No则定义为距离side-anchor(text line最左边和最右面的anchor)在一定pixel距离内的anchor……
3. 实验结果
贴一个结果对比图:
这三个数据集是英文检测数据集,也是目前比较流行的文本检测数据集了。看了下CVPR 2018的text detection,还是有提到这些数据集的。
总的来说,这也是个不错的了解其它问题和类似RNN这样的方法的机会,应该会参考代码好好研究一下,这也是出于大作业的需要。对RNN的理解,一些细节的理解和实现问题之后会更上~
这篇关于从目标检测到特定类别的检测任务:文本检测阅读笔记CTPN(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!