首页 > 编程知识 正文

场景文字检测与识别,图片文字识别应用场景

时间:2023-05-06 14:54:26 阅读:159097 作者:160

论文: detectingtextinnaturalimagewithconnectionisttextproposalnetwork

github(caffe版本) :https://github.com/tianzhi 0549/ctpn

github(tensorflow版) :https://github.com/eragon Ruan/text-detection-ctpn

总体框架:

)1)首先一幅图像经过VGG16基础网络,在conv5_3层引出,共经过4个轮询操作,此时的conv5大小为原图的1/16,维数为b*h*w*c ) c=55

)2)在featuremap conv5中,从3*3的滑动窗口进行width方向的滑动。 每个3*3*c的向量经过BLSTM转换为256维向量。 另外,这样的向量总共有w个,维数为b*h*w*c(c=256 )。

)3)经过512维的全部连接层,维数变为b*h*w*c(c=512 )。

)4)其中,k为anchor的数量,总共包括10个anchor。 也就是说,k=10每次从11-273像素增加到1.4。 在本阶段,分别输出垂直回归的中心点在垂直方向的偏移和高度的偏移(vertical coordinates ),维数为b*h*w*c*k(c=2,k=10 ),anchor回归的每个框的得分

CPN的核心思想:

如上图所示,左边是传统的RPN预测框架,右边是CTPN框架。 由于RPN中的anchor感受领域的问题,没有像以往的人、车、物检测那样能够复盖整行文本的anchor。 因此,CTPN提出了将宽度固定为16个像素的anchor战略。 之后,对所有anchor预测结果进行NMS合并。

总体思想还非常novel。

LOSS:

CTPN整体包括3个Loss、分类的Ls、边框回归的Lv、边框左右的回归的偏移lo。

Ls是传统的softmax_cross_entropy_loss,其中I表示所有预测anchor中的第I个,si _ hat={ 0,1 },Ns表示所有anchor总和的归一化参数

Lv使用smooth_L1_loss。 其中j表示所有IOU0.5的anchor中的第j个,Nv是表示所有anchor和groudtruth的IOU0.5的anchor总数的归一化参数。 1是多任务的平衡参数,1=1.0。

参数v的解释如下。 实际应预测的数值为vc和vh,groundtruth为vc_hat和vh_hat。 vc表示实际的中心坐标与anchor的中心的偏差,以及与anchor的高度之比,换言之,表示相对于anchor的中心坐标的标准化偏差量。 同样,vh表示归一化的高度伸缩量。

在实际预测时,只需逆运算公式,就可以算出cy和h,也就是最终的框的中心坐标和高度。

Lo也使用smooth_L1_loss。 其中k表示边界anchor的第k个,即距离groundtruth个像素的边界anchor的集合。 Nv是归一化参数,表示所有边界的anchor总数。 1是多任务的平衡参数,1=2.0。

o表示x方向上的归一化偏移。 cx表示anchor的中心,Xside表示预测的中心。

如上图所示,红色表示有side-refinement结果,黄色表示没有side-refinement结果。 可以看到,经过side-refinement操作,边界可以更精确。

双向LSTM:

上图中的第一行表示没有使用BLSTM,第二行表示正在使用BLSTM。 可以看出,BLSTM具有连接被切割区域的效果。 使边界更准确。

测试和培训输入图像大小:

测试:

测试时,也和福斯特的机构一样,是短边大于600,长边小于1200的缩放机构。

defresize_im(im,scale,max_scale=None ) : f=float (scale )/min ) im.shape[1],im.shape[1] ) if

ion=cv2.INTER_LINEAR), f

训练:

训练的时候,为了可以走batch,所以是对一个batch内的图片,取最大的宽,高,其余小于该宽高的图片的其他位置补0,这样进行操作的。

def im_list_to_blob(ims): """Convert a list of images into a network input. Assumes images are already prepared (means subtracted, BGR order, ...). """ max_shape = np.array([im.shape for im in ims]).max(axis=0) num_images = len(ims) blob = np.zeros((num_images, max_shape[0], max_shape[1], 3), dtype=np.float32) for i in range(num_images): im = ims[i] blob[i, 0:im.shape[0], 0:im.shape[1], :] = im return blob

 

Anchor合并机制:

ctpn需要将每一个anchor回归的框进行合并,从而生成最终的文本框。

合并的主要原则,

(1)水平的最大连接距离为MAX_HORIZONTAL_GAP=50个像素

(2)垂直方向的一维IOU是否满足大于MIN_V_OVERLAPS=0.7比例

(3)两个相邻的anchor的高度是否满足小于MIN_SIZE_SIM=0.7比例

然后基于上述的原则,首先从左往右扫描一遍,将满足条件的anchor合并,然后从右往左扫描一遍,将满足条件的anchor合并。

其中,从左往右扫描的代码,

def get_successions(self, index): box = self.text_proposals[index] results = [] for left in range(int(box[0]) + 1, min(int(box[0]) + TextLineCfg.MAX_HORIZONTAL_GAP + 1, self.im_size[1])): adj_box_indices = self.boxes_table[left] for adj_box_index in adj_box_indices: if self.meet_v_iou(adj_box_index, index): results.append(adj_box_index) if len(results) != 0: return results return results

从右往左扫描的代码,

def get_precursors(self, index): box = self.text_proposals[index] results = [] for left in range(int(box[0]) - 1, max(int(box[0] - TextLineCfg.MAX_HORIZONTAL_GAP), 0) - 1, -1): adj_box_indices = self.boxes_table[left] for adj_box_index in adj_box_indices: if self.meet_v_iou(adj_box_index, index): results.append(adj_box_index) if len(results) != 0: return results return results

一维高度IOU的代码,和高度差距小于0.7的代码,

def meet_v_iou(self, index1, index2): def overlaps_v(index1, index2): h1 = self.heights[index1] h2 = self.heights[index2] y0 = max(self.text_proposals[index2][1], self.text_proposals[index1][1]) y1 = min(self.text_proposals[index2][3], self.text_proposals[index1][3]) return max(0, y1 - y0 + 1) / min(h1, h2) def size_similarity(index1, index2): h1 = self.heights[index1] h2 = self.heights[index2] return min(h1, h2) / max(h1, h2) return overlaps_v(index1, index2) >= TextLineCfg.MIN_V_OVERLAPS and size_similarity(index1, index2) >= TextLineCfg.MIN_SIZE_SIM

 

总结:

优点:

CTPN对于检测的边框在上下左右4个点上都比较准确,这点比EAST要好。

 

缺点:

(1)CTPN只可以检测水平方向的文本,竖直方向的话就会出现一个字一个字断开的想象。倾斜角度的话需要修改后处理anchor的连接方式,但是应该会引入新的问题。

(2)CTPN由于涉及到anchor合并的问题,何时合并,何时断开,这是一个问题。程序使用的是水平50个像素内合并,垂直IOU>0.7合并。或许由于BLSTM的引入,导致断开这个环节变差。所以对于双栏,三栏的这种文本,ctpn会都当做一个框处理,有时也会分开处理,总之不像EAST效果好。

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。