论文:Detecting Text in Natural Image with Connectionist Text Proposal Network

Github(caffe版本):https://github.com/tianzhi0549/CTPN

Github(tensorflow版本):https://github.com/eragonruan/text-detection-ctpn

整体框架:

(1)首先一张图片经过VGG16基础网络,在conv5_3层引出,一共经过4个pooling操作,所以此时的conv5的大小为原图的1/16,维度为b*h*w*c(c=512)。

(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回归的框的得分(score),前景得分和背景得分,维度为b*h*w*c*k(c=2),边框边缘的左右偏移值(side-refinement),维度为b*h*w*c*k(c=1)。

CTPN核心思想:

如上图所示,左面为传统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表示所有IOU>0.5的anchor中的第j个,Nv为归一化参数,表示所有的anchor和groudtruth的IOU>0.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相距32个像素的边界anchor的集合。Nv为归一化参数,表示所有边界anchor数总和。λ1为多任务的平衡参数,λ1=2.0。

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

如上图,红色的表示有side-refinement的结果,黄色为没有side-refinement的结果。可以看出经过side-refinement操作,可以使得边界更准确。

双向LSTM:

上图第一行表示没有使用BLSTM,第二行表示使用了BLSTM,可以看出,BLSTM可以起到将断开的区域连接起来的效果。并且使得边界更加准确。

测试和训练的输入图片大小:

测试:

测试的时候和faster的机制一样,也是短边大于600,长边小于1200,这样的按比例缩放的机制。

def resize_im(im, scale, max_scale=None):f=float(scale)/min(im.shape[0], im.shape[1])if max_scale!=None and f*max(im.shape[0], im.shape[1])>max_scale:f=float(max_scale)/max(im.shape[0], im.shape[1])return cv2.resize(im, None,None, fx=f, fy=f,interpolation=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], :] = imreturn 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 resultsreturn 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 resultsreturn 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效果好。

场景文字检测之CTPN相关推荐

  1. 场景文字检测(一)--CTPN(Connectionist Text Proposal Network)

    论文:Detecting Text in Nature Image with Connectionist Text Proposal Network 在通用目标检测中,每一个物体都有一个定义良好的封闭 ...

  2. 白翔团队新作:借助CLIP完成场景文字检测

    作者:秃头小苏 编辑:3D视觉开发者社区 原文链接:https://arxiv.org/pdf/2302.14338.pdf 代码链接:https://github.com/wenwenyu/TCM ...

  3. 基于深度学习的目标检测及场景文字检测研究

    基于深度学习的目标检测及场景文字检测研究 转载自:https://blog.csdn.net/u013250416/article/details/79591263 一.目标检测与场景文字检测定义 目 ...

  4. 实现基于darknet框架实现CTPN版本自然场景文字检测 与CNN+CTCOCR文字识别的ChineseOCR搭建

    Github地址 Github源码地址 支持系统:mac/ubuntu python=3.6 实现功能 文字检测: 文字识别: 支持GPU/CPU,CPU优化(opencv dnn) docker镜像 ...

  5. SSD: Signle Shot Detector 用于自然场景文字检测

    前言 之前我在 论文阅读:SSD: Single Shot MultiBox Detector 中,讲了这个最新的 Object Detection 算法. 既然 SSD 是用来检测物体的,那么可不可 ...

  6. 基于YOLOv3 与CRNN的中文自然场景文字检测与识别

    (欢迎关注"我爱计算机视觉"公众号,一个有价值有深度的公众号~) 52CV君曾经分享过多篇关于文字检测与识别的文章: 华科白翔老师团队ECCV2018 OCR论文:Mask Tex ...

  7. c++实验总结_史上最全场景文字检测资源合集(70篇重要论文 + 15个开源代码 + 176个实验结果 + 1305个统计信息)...

    本文总结了2012年以来在场景文本检测领域的70篇代表性论文.21个常用数据集.15份开源代码,包含176个实验结果以及超过1300条统计信息.Github资源链接见文末. 一.前言 许多自然场景中包 ...

  8. 史上最全场景文字检测资源合集(70篇重要论文 + 15个开源代码 + 176个实验结果 + 1305个统计信息)...

    点击上方"AI算法与图像处理",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:刘崇宇 转载自:CSIG文档图像分析与识别专委会 本 ...

  9. CVPR 2022 | 网易华科提出特征采样与分组:基于Transformer的场景文字检测方法

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 转载自:CSIG文档图像分析与识别专委会 本文简要介绍了CVPR 2022录用的论文"Few Co ...

最新文章

  1. 去非数字字符串的前导零
  2. typecast java_Java中的类型转换
  3. mysql const ref_mysql explain详解
  4. 后台服务系统之编写服务消费方实现
  5. 关于NPN和PNP传感器的应用区别(转载)
  6. MYSQL安装与库的基本操作
  7. XPDF3.04抽取PDF中的中文文本
  8. 基于大数据技术推荐系统算法案例实战教程
  9. 繁简体(GB-Big5)字符串互转的JAVA方式实现
  10. 逻辑回归算法原理及python实现
  11. 决战行测5000题-数量关系精华版
  12. SBC音频编解码算法(转载)
  13. 围观知乎真福利话题,放松一下。
  14. SAP ABAP 配置表开发常见问题总结与开发指南(SM30 SM34 SE54)
  15. C语言中变量和函数的声明与定义
  16. 搜狗 linux 五笔输入法,Ubuntu下安装搜狗、谷歌、五笔等输入法
  17. 在Web3赚钱,你准备好了吗?
  18. 在MATLAB中生成矩阵的三种方法
  19. 西安计算机软件行业薪水,西安今夏求职平均薪酬为每月8295元 这两个行业竞争最激烈...
  20. 同时删除多个 Txt 文本文档的最后几行

热门文章

  1. 新神魔大陆服务器现在在维护吗,新神魔大陆1月22日合服维护公告
  2. 如何在百度搜索到自己的网站?新站必看
  3. 腾讯云(云镜)主机入侵检测漏洞检测
  4. Integrated Product Development
  5. 用requests的get检验电视直播源是否有效的方法
  6. Maze_AI: 一款基于 Python + Pygame + AI 算法的迷宫小游戏
  7. 如何制作渐变色二维码
  8. char,varchar,nchar,nvarchar具体含义和区别
  9. ecshop百度收录和ecshop百度快照规律
  10. Linux网络管理员手册