场景文字检测—CTPN原理与实现 - 知乎对于复杂场景的文字识别,首先要定位文字的位置,即文字检测。这一直是一个研究热点。 Detecting Text in Natural Image with Connectionist Text Proposal NetworkCTPN是在ECCV 2016提出的一种文字检测算法。CTPN…https://zhuanlan.zhihu.com/p/34757009

Ctpn检测的都是小框,宽度16像素(stride=16),在github上比较火的ocr项目chineseocr就是使用的ctpn的后处理方向,只不过把前面的fastrcnn换成了yolo。

1.fine-scale提案

我们寻找能够很好地泛化到所有级别的文本组件的文本的独特属性。 我们观察到,RPN 的单词检测很难准确预测单词的水平边,因为单词中的每个字符都是孤立的或分开的,这使得很难找到单词的开始和结束位置。 显然,文本行是一个序列,它是文本和通用对象之间的主要区别。 将文本行视为一系列 fine-scale 文本提案是很自然的,其中每个提案通常代表文本行的一小部分,例如,16 像素宽度的文本片段。 每个提案可能包括单个或多个笔划、一个字符的一部分、单个或多个字符等。我们认为,通过 x 其水平位置来预测每个提案的垂直位置会更准确,这可能是 更难预测。 与预测对象的 4 个坐标的 RPN 相比,这减少了搜索空间。 我们开发了一种垂直锚机制,可以同时预测每个 fine-scale 提议的文本/非文本分数和 y 轴位置。 检测一般的固定宽度文本建议也比识别孤立字符更可靠,孤立字符很容易与一个字符的一部分或多个字符混淆。 此外,在一系列固定宽度的文本建议中检测文本行也可以可靠地处理多尺度和多纵横比的文本。

为此,我们设计了如下的 fine-scale 文本提案。 我们的检测器密集地调查 conv5 中的每个空间位置。 文本提案被定义为具有 16 像素的固定宽度(在输入图像中)。 这等于在 conv5 映射中密集移动检测器,其中总步幅正好是 16 个像素。 然后我们设计 k 个垂直锚来预测每个提案的 y 坐标。  k 个锚点具有相同的水平位置,固定宽度为 16 像素,但它们的垂直位置在 k 个不同的高度上变化。 在我们的实验中,我们为每个提议使用十个锚点,k = 10,其高度在输入图像中从 11 到 273 像素(每次 0:7)不等。 显式垂直坐标由提案边界框的高度和 y 轴中心测量。

1.加了lstm

cnn学习的是感受野内的空间信息,lstm学习的是序列特征,对于文本序列检测,毕竟文字是连续的,需要lstm。不过看有人说把lstm换成7*7的conv也有效果。

3.side-refinment

看了不少的开源方案,也有很多人没有实现它这个边缘的loss

贴一段上面的过程的代码:

class CTPN_Model(nn.Module):def __init__(self):super().__init__()base_model = models.vgg16(pretrained=False)layers = list(base_model.features)[:-1]self.base_layers = nn.Sequential(*layers)  # block5_conv3 outputself.rpn = BasicConv(512, 512, 3,1,1,bn=False)self.brnn = nn.GRU(512,128, bidirectional=True, batch_first=True)self.lstm_fc = BasicConv(256, 512,1,1,relu=True, bn=False)self.rpn_class = BasicConv(512, 10*2, 1, 1, relu=False,bn=False)self.rpn_regress = BasicConv(512, 10 * 2, 1, 1, relu=False, bn=False)def forward(self, x):x = self.base_layers(x)# rpnx = self.rpn(x)x1 = x.permute(0,2,3,1).contiguous()  # channels lastb = x1.size()  # batch_size, h, w, cx1 = x1.view(b[0]*b[1], b[2], b[3])x2, _ = self.brnn(x1)xsz = x.size()x3 = x2.view(xsz[0], xsz[2], xsz[3], 256)  # torch.Size([4, 20, 20, 256])x3 = x3.permute(0,3,1,2).contiguous()  # channels firstx3 = self.lstm_fc(x3)x = x3cls = self.rpn_class(x)regr = self.rpn_regress(x)cls = cls.permute(0,2,3,1).contiguous()regr = regr.permute(0,2,3,1).contiguous()cls = cls.view(cls.size(0), cls.size(1)*cls.size(2)*10, 2)regr = regr.view(regr.size(0), regr.size(1)*regr.size(2)*10, 2)return cls, regr

4.连框策略

看上面的代码,是先经过了vgg和rpn的特征提取,经过了lstm或者是gru,在经过了了lstm_fc之后,输出两个head,一个是cls,一个是回归的支路,回归只是竖向的中心y和h。一共十组anchor,这其中正负样本的分配策略基本和fasterrcnn是一致的,ctpn只是改动了anchor,加了lstm和回归的head。

连框策略还是比较复杂的。

detecting text in natural image with connectionist text proposal network相关推荐

  1. CTPN模型详解--Detecting Text in Natural Image with Connectionist Text Proposal Network

    文章目录 Abstract 1 Introduction 1.1 Contributions 2 Related Work 3 Connectionist Text Proposal Network ...

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

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

  3. 论文阅读(XiangBai——【CVPR2017】Detecting Oriented Text in Natural Images by Linking Segments)...

    XiangBai--[CVPR2017]Detecting Oriented Text in Natural Images by link Segments 目录 作者和相关链接 方法概括 方法细节 ...

  4. SWT(Detecting Text in Natural Scenes with Stroke Width Transform)算法详解

    <Detecting Text in Natural Scenes with Stroke Width Transform>,这是微软公司的一篇发表于CVPR2010的文章,使用传统方法来 ...

  5. SegLink(Detecting Oriented Text in Natural Images by Linking Segments)算法详解

    <Detecting Oriented Text in Natural Images by Linking Segments>是和EAST同年的一篇发表在CVPR2017的OCR论文.代码 ...

  6. mysql中text格式化_mysql中char,varchar,text

    1.char char最大长度是255字符,注意是字符数和字符集没关系. 1)可以有默认值, 2)尾部有空格会被截断 3)不管汉字.英文,还是其他编码,都可以存255字符 2.varchar 1)va ...

  7. 首页静态生成 错误:客户端发现响应内容类型为“text/html”,但应该是“text/xml”...

    首页静态生成 错误:客户端发现响应内容类型为"text/html",但应该是"text/xml"解决方法: 最近在做首页静态生成,一直遇到这样的问题  客户端发 ...

  8. 【Sublime text 3】卸载重装Sublime text 3英文版

    文章目录 问题描述 解决过程 问题描述 笔者之前所用Sublime text 3为中文版,发现不能安装插件的问题,现尝试卸载重装英文版. 解决过程 卸载关键: 在C盘搜索"sublime t ...

  9. BeautifulSoup中的.text 和get_text()的区别,.text与.string的区别

    .text 和get_text()的区别 结论: 1.不带参数调用get_text() 与.text 是等效的,没有区别. 2.但是,get_text 还可以支持各种关键字参数来改变它的行为方式(se ...

最新文章

  1. 3-flutter 项目结构 资源 依赖
  2. MFC RadioButton用法详解
  3. 关于Android 中 一个错误的解决办法 “Do not request Window.FEATURE_ACTION_BAR.....
  4. 谷歌为何会选用TypeScript?
  5. argument ‘input‘ (position 1) must be Tensor, not XX
  6. redis中的key设置了过期时间了还会在持久化到文件中吗
  7. linux ti 电池驱动_全球跨国车企电动汽车平台和电池系统对比
  8. 树莓派获取SHT20温湿度
  9. openwrt nas_真牛气,矿渣蜗牛星际也能玩软路由Openwrt和NAS虚拟一体机
  10. 上拉电阻和下拉电阻作用、区别及应用 (转)
  11. u盘插上电脑显示计算机无响应,为什么u盘连接电脑没反应,u盘在电脑上显示不出来...
  12. 用人单位不与劳动者签定书面劳动合同的后果
  13. 网络协议学习(B站观看最多)
  14. 数据库学习纪要(十二):SQL Sever介绍-4
  15. CSDN每日打卡已经2周,进展如何?,【2021Python最新学习路线】
  16. 入行数据分析要知道什么是独立性检验拟合优度检验
  17. Android wear 睡眠追踪,为什么智能手表还不是最理想的睡眠追踪设备
  18. 相机标定(三)——手眼标定
  19. 前端面试题(带文字+代码解析),我不相信你看不懂(2022.11.04)
  20. stata软件不出图_绘制回归分析结果的森林图,R和Stata软件学起来!

热门文章

  1. mooc翁凯C语言习题第七周(7-2)鞍点
  2. Android中调用.so库操作步骤
  3. Mac系统 Terminal终端功能使用方法
  4. LeetCode-977有序数组的平方
  5. 从GPU编程到SIMT核心
  6. statsmodels.tsa.seasonal.seasonal_decompose使用移动平均线进行季节性分解
  7. 悲观锁 乐观锁的原理及应用场景
  8. ifix从sqlserver里读数据_基于GE Fanuc产品PBS汽车总装生产线监控系统设计
  9. 帕拉迪Core4A-UTM堡垒机使用手册
  10. 微信公众平台开发(122) 获取微信会员卡用户姓名和手机号