文字识别的过程,首先是要确定文字的位置,即文本检测。
本文主要分享的是CTPN,paper名称是Detecting Text in Natural Image with
Connectionist Text Proposal Network,论文链接地址:https://arxiv.org/pdf/1609.03605.pdf
这个算法是在2016年被提出,由Faster RCNN改进而来,本文默认读者熟悉CNN,LSTM原理和Faster RCNN网络结构。配合上次课程《02. OCR学习路径之文本检测(上)Faster R-CNN算法简介》服用,效果或许会有一点。蛤蛤蛤,以下进入正题。
原文中有这样一段话,讲述了通用目标检测为什么不能应用于场景文本检测的:
However, it is difficult to apply these general object detection systems directly to scene text detection, which generally requires a higher localization accuracy
因为文本的字体更小,场景更加复杂,对检测框的精确度要求更高。
CTPN的网络结构图如下:
原始CTPN只检测横向排列的文字。CTPN结构与Faster R-CNN基本类似,但是加入了LSTM层。假设输入1幅Image:
1. 首先VGG提取特征,获得大小为C*H*W的conv5 feature map,C是channel的个数,或者说是feature map数。
2. 之后在conv5上做3*3的sliding window操作,共享卷积计算,加速训练的一种方式,即每个点都结合周围区域特征获得一个长度为3*3*C的特征向量。输出H*W*3*3*C的feature map,该特征显然只有CNN学习到的空间特征。再将这个feature map进行Reshape
3. 然后将H*W*3*3*C这个feature map以最大时间长度W的数据流输入双向LSTM,学习每一行的序列特征。这样就学习到了图像像素间的水平方向的信息,双向LSTM输出256xHxW,再经Reshape恢复形状,该特征既包含空间特征,也包含了LSTM学习到的序列特征。
4. 然后经过“FC”卷积层,变为512xHxW的特征
5. 最后经过根据文章提出的vertical anchor mechanism,去预测文本框anchor是否为正,anchor中心坐标y和高度等
Anchor提出的方式不同于RPN,而是直接在FC层后的feature map上的每一个点都生成anchor,因为VGG的特征H和W是在原图上缩小16倍的,那feature map的上每个点映射回到原图上就是宽度大小是16个像素区域,从第一个anchor开始,步长stride也是16像素(映射在原图尺寸的),而高度则从11像素到283像素(依次除以0.7)变化,总共10个anchor.如下图。
这样设计Anchor的好处有:
l 保证每一行所有的anchor之间都不重合
l y值的取值区间在[11,283],适应场景多,可以是小文字,也可以是像广告牌那样的大字体;
l 预测的时候只需要预测anchor中心坐标y,anchor高度h,不需要预测中心坐标x的值,宽度是固定值16也不需要预测,
l 同时预测是text/none-text区域
图 垂直Anchor机制
相关公式如下:
当然了,仅保留那些还在图像内部的anchor,超出图像的都删掉,这一点和faster-RCNN的思想一样。
先看正anchor的连接法则是怎样的。
对于任意两个相邻的proposals: Bj 和 Bi,需要满足如下三个条件:
(i) Bj在水平距离上离Bi最近
(ii) 该距离小于50 pixels
(iii) 它们的垂直重叠(vertical overlap) > 0.7
但是连接完了之后,或许有的文本框的左右两端比较不够精确,可能框多了文本或者少框了,最担心的就是少框了,横向的宽度少了个像素点,对于通用目标的检测或许会影响不大,但是就文本而言,可能会导致信息的丢失,所以需要再精修一下每个anchor最左侧或者最右侧的坐标。也就是让之前预选框里的anchor进行左移或者右移动。
因此引入side-refinement的概念。
论文里的公式(4)如下:
其中x_side是边框最左或者最右的x坐标值,C_xa是最边缘正anchor的中心坐标,w_a=16,带*的都是GT值。
效果是这样如下图,红色是加了side-refinement的效果,不过目前还没人复现过,哇咔咔。
获得Anchor后,与Faster R-CNN类似,联合预测关于每个固定宽度proposal的位置(location)和文本/非文本分值(text/none-text score)。序列化的anchors被连接到一个RNN上,无缝地与卷积网络相接,产生一个end-to-end的训练模型。
CTPN会做如下处理:
1. Softmax判断Anchor中是否包含文本,即选出Softmax score大的正Anchor;
2. Anchor位置信息的回归:修正包含文本的Anchor的中心y坐标与高度h;
3. Side-refinement:两端点框的回归,其实影响很小。
文本/非文本loss[采用的是softmax],垂直坐标loss[采用的是L1回归],side-refinement loss[smooth L1]
4. 这里k为anchor的个数,一共包含10个anchor,即k=10,从11-283像素,每次乘以1.4。该阶段分别输出垂直回归的中心点垂直方向的偏移和高度的偏移(vertical coordinates),维度为b*h*w*c*k(c=2,k=10),每个anchor回归的框的得分(score),前景得分和背景得分,维度为b*h*w*c*k(c=2),边框边缘的左右偏移值(side-refinement),维度为b*h*w*c*k(c=1)。
对于论文中所涉及的数字解释大致如此。
广告时间开始啦:
本课视频在B站有同步哦,欢迎来点赞三连!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。