场景文字检测之CTPN
论文: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相关推荐
- 场景文字检测(一)--CTPN(Connectionist Text Proposal Network)
论文:Detecting Text in Nature Image with Connectionist Text Proposal Network 在通用目标检测中,每一个物体都有一个定义良好的封闭 ...
- 白翔团队新作:借助CLIP完成场景文字检测
作者:秃头小苏 编辑:3D视觉开发者社区 原文链接:https://arxiv.org/pdf/2302.14338.pdf 代码链接:https://github.com/wenwenyu/TCM ...
- 基于深度学习的目标检测及场景文字检测研究
基于深度学习的目标检测及场景文字检测研究 转载自:https://blog.csdn.net/u013250416/article/details/79591263 一.目标检测与场景文字检测定义 目 ...
- 实现基于darknet框架实现CTPN版本自然场景文字检测 与CNN+CTCOCR文字识别的ChineseOCR搭建
Github地址 Github源码地址 支持系统:mac/ubuntu python=3.6 实现功能 文字检测: 文字识别: 支持GPU/CPU,CPU优化(opencv dnn) docker镜像 ...
- SSD: Signle Shot Detector 用于自然场景文字检测
前言 之前我在 论文阅读:SSD: Single Shot MultiBox Detector 中,讲了这个最新的 Object Detection 算法. 既然 SSD 是用来检测物体的,那么可不可 ...
- 基于YOLOv3 与CRNN的中文自然场景文字检测与识别
(欢迎关注"我爱计算机视觉"公众号,一个有价值有深度的公众号~) 52CV君曾经分享过多篇关于文字检测与识别的文章: 华科白翔老师团队ECCV2018 OCR论文:Mask Tex ...
- c++实验总结_史上最全场景文字检测资源合集(70篇重要论文 + 15个开源代码 + 176个实验结果 + 1305个统计信息)...
本文总结了2012年以来在场景文本检测领域的70篇代表性论文.21个常用数据集.15份开源代码,包含176个实验结果以及超过1300条统计信息.Github资源链接见文末. 一.前言 许多自然场景中包 ...
- 史上最全场景文字检测资源合集(70篇重要论文 + 15个开源代码 + 176个实验结果 + 1305个统计信息)...
点击上方"AI算法与图像处理",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:刘崇宇 转载自:CSIG文档图像分析与识别专委会 本 ...
- CVPR 2022 | 网易华科提出特征采样与分组:基于Transformer的场景文字检测方法
点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 转载自:CSIG文档图像分析与识别专委会 本文简要介绍了CVPR 2022录用的论文"Few Co ...
最新文章
- 去非数字字符串的前导零
- typecast java_Java中的类型转换
- mysql const ref_mysql explain详解
- 后台服务系统之编写服务消费方实现
- 关于NPN和PNP传感器的应用区别(转载)
- MYSQL安装与库的基本操作
- XPDF3.04抽取PDF中的中文文本
- 基于大数据技术推荐系统算法案例实战教程
- 繁简体(GB-Big5)字符串互转的JAVA方式实现
- 逻辑回归算法原理及python实现
- 决战行测5000题-数量关系精华版
- SBC音频编解码算法(转载)
- 围观知乎真福利话题,放松一下。
- SAP ABAP 配置表开发常见问题总结与开发指南(SM30 SM34 SE54)
- C语言中变量和函数的声明与定义
- 搜狗 linux 五笔输入法,Ubuntu下安装搜狗、谷歌、五笔等输入法
- 在Web3赚钱,你准备好了吗?
- 在MATLAB中生成矩阵的三种方法
- 西安计算机软件行业薪水,西安今夏求职平均薪酬为每月8295元 这两个行业竞争最激烈...
- 同时删除多个 Txt 文本文档的最后几行