从目标检测到特定类别的检测任务:文本检测阅读笔记CTPN(一)

2023-12-07 14:10

本文主要是介绍从目标检测到特定类别的检测任务:文本检测阅读笔记CTPN(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • Detecting Text in Natural Image with Connectionist Text Proposal Network
    • 1. Background
    • 2. Connectionist Text Proposal Network
      • Fine-scale Proposals
      • Recurrent Connectionist Text Proposals
      • Side-Refinement
      • Loss函数
    • 3. 实验结果

一周一篇论文~先吐槽下临近期末大作业一堆一堆的- -!其实是正好有个大作业组内成员想实现一下文本检测,所以第一次接触了这方面的内容,写下了这篇文章。最前面是我对目标检测到特定类别任务检测的一点自己的想法,希望能给和曾经的我一样搞不清楚的同学提供一点个人看法,同时也是抛砖引玉;然后会进入正式的论文阅读部分。

其实我第一次做目标检测就是用SSD做行人的检测工作,当时我就有一个疑问,直接用SSD做一个单独的行人检测效果会不会不太好,别的不说光anchor那好多个比例就不合适,毕竟行人是只是瘦长的,现在想想当时做的结果果真很惨,毕竟SSD本身就不太适合小尺度问题。
目标检测能不能拿来做特定类别的检测?肯定可以,改下输入输出的问题嘛,但是效果好不好呢?实际上,目标检测为了能取得更好的泛用性,必然对某个特定类别的目标的特有特征做一定程度的忽略(比如上文提到的行人的瘦长形状,或者文本的鲜明纹理特征),而是关注更广泛的共性特征。这就导致了目标检测在对待某个特定的类别做检测时候效果可能不是很好。
打个比方,何明的Is faster rcnn doing well in pedestrian detection中就谈到,做行人检测,RPN的结果甚至比整个Faster
RCNN结果更好(RPN在只有一个类别的情况下也可以看作一个检测器),原因就是街景图片当中,行人往往很小,过深的网络会使得小尺度的行人更加容易被忽略。
所以我个人感觉目标检测对于类别子任务的检测来说,应该更多的是指导作用,提供一些新的思路和算法(比如RPN这样的候选框筛选机制),具体在实践到检测特定类别的时候,还需要针对该类别的独有特征做一些改进和舍弃的,这一点在本次的论文中也会谈到。如果有些同学在帮老板搬砖的时候,目标检测在某些特定场合表现不好,不妨从这个角度思考一下问题。

好的,以上是一些废话,下面正式进入这篇借鉴了很多Faster RCNN论文。

Detecting Text in Natural Image with Connectionist Text Proposal Network

这是ECCV 2016的文章,有点老了,做的是localizes lines的工作。 顾名思义,是检测文字行,可以应用在例如路标、告示牌这种大多数只有一行文本的情境下,如果是检测商标这种检测出来的就是分行而不会算成一段文字。本文参考了Faster R-CNN的很多思路,比如典型的RPN机制,通过Anchors的设置,实现了多尺度;另外本文的方法也是面向多种语言文字的,总的来说是比较强大的算法,不过只是进行了检测而没有进行识别。

1. Background

文本检测的难点主要是在于文本有large variance的特点,还有就是文字只是单纯的线条、类似墙面之类的背景都会露出来部分,导致它的背景特别复杂。
目前常用的方法是采用low-level的特征或者笔画字符的特征来检测,总的来说是检测单个文字然后进行text line的重建,这样其实很复杂,鲁棒性也差,更重要的是,没有综合考虑context的information,实际上人辨识一系列字符也是比辨识一个单独的要容易的,尤其是字符本身比较模糊不清的时候。
好了,现在开始思考一个问题,如果直接把general object detection使用到文本检测的场景,会有哪些问题?最明显的,定位不准的问题,文字并没有明确的bbox,字母和字母之间有空隙,单词和单词之间又有空隙,怎么克服这种边界模糊的障碍?而且为了后续识别工作,文字检测对位置精度的要求也是明显高于一般的目标检测的。
作者的主要贡献如下:

  1. 将text detectionwention问题转化成了定位一系列尺度合适的text proposal问题
  2. 引入了recurrent策略(也就是RNN),连接text proposal
  3. 整合1.2,形成一个e2e的模型
  4. 在各个数据集上都取得了不错的效果

2. Connectionist Text Proposal Network

文章的主体框架如下:主要就是改进后的RPN和RNN两个部分,此外,作者还专门设计了一种更精准定位边缘的side-refinement机制。
这里写图片描述

Fine-scale Proposals

这部分主要要解决的问题就是text detection没有明确的边界的问题,因此,如果anchor设置得过大,很容易只检测到一部分的文本,作者的思路是将text line看成很多个text proposal连缀成的,这里的text proposal可以是包含部分字母/汉字的比较小的一部分,但同时又不会设置得过小,以免候选anchor正好落在字符的空隙之间导致line断裂,具体的设置可以看下图:
这里写图片描述
每个红色的小框就是RPN阶段生成的proposal,同时,我们也可以留意一下,虽然比如第二行H和O之间空隙比较大,但因为proposal恰好涵盖了H的一小部分,因此它最终还是被看成了含有text的proposal,而没有导致文字断裂。
怎么实现这种proposal的呢?

  1. anchor的宽度不再按照比例,而是16(对应input images中的16个像素),这个正好是conv5 maps的stride,因此在conv5上生成anchor正好在水平方向覆盖了整张图
  2. 作者设计了k个anchor,主要针对的竖直方向上的,同样采用的是像素的表示方式,一共是11~273个pixels(每次除以0.7),当然,在用这些anchor的中心和高度计算回归目标的时候,也要算偏移量、做归一化以避免量纲的不统一,公式和计算rcnn回归目标的公式类似
  3. 在conv5上使用3x3的卷积,输出通道为256D(为什么是这个下个部分会解释),然后送入RNN,从而寻找水平方向的关系
  4. 在output结果的时候,大于0.7的被认为是含有text的,同样,要使用NMS策略
  5. GT的分配机制类似于Faster RCNN,两步走,阈值是0.7

Recurrent Connectionist Text Proposals

可能有的同学和我一样也不太熟悉RNN,但是相信大家对RNN的一些工作机制和设计原理都是有一些了解的。RNN的主要特点就是输入单元之间并不是独立的,一个输入会以某种形式传入到下一个输入的隐层中,这就相当于建立了多个输入之间的联系。
大致原理就相当于下面这张图吧:
这里写图片描述
当然作者使用的是双向LTSM,实际上更为复杂。这里主要希望大家能理解了为什么使用RNN,因为作者每一行的多个proposal实际上是有关系的,这种时候单纯的CNN不能解决问题,必须考虑建立它们之间的关联性,因此才引入了RNN。

我会在之后看下代码,再详细给大家解释下RNN和作者的双向LTSM是怎么实现的。希望到时候再和大家交流~

Side-Refinement

假设有k个anchor,那么RNN的输出在经过fc后,要预测k个scores和2k个垂直方向的坐标偏移量。怎么在判断proposal之后对text line进行重构?
作者采用的方法是构建proposal pair,当Bj对Bi这两个proposal满足如下条件:

  1. 它们在竖直方向的重合度超过0.7
  2. Bj在水平方向距离Bi最近
  3. 它们之间的水平距离不超过50pixel
    则认为Bj和Bi构成了proposal pair,text line本质上就是多个proposal pair联结而成的。

但是这样导致的一个问题是,虽然中间没有关系,但是text line的两边是不是会出现误差,如下图所示:
这里写图片描述
所以作者就引入了side-refinement机制。它的核心就是在预测k个scores和2k个垂直方向的坐标偏移量的同时,还要预测k个边缘偏移量,用来计算proposal和text line最左边和最右面的位置偏移,边缘偏移量的计算公式和竖直方向的偏移量计算有一点相似,具体可以参考论文。另外要注意这个边缘偏移量是只计算当前proposals到最近的那一边(比如离左边text side近就是算到左边缘的偏移位置),因此只有k个边缘偏移量而不是2k个~还要注意的一点是并不是所有的anchor的边缘偏移量都会参与BP的参数迭代更新,这个在下面loss函数里面会提到~

Loss函数

这里写图片描述
Loss函数的定义也是顺理成章的事情,三部分,类别判断(是不是text),竖直方向坐标偏移量和边缘偏移量,分别是softmax,smoothL1和smoothL1,其实和faster rcnn类似~需要提一下的是这里的数量问题,Ns是mini-batch里所有anchor的数量,Nv就是这些anchor里被判断属于文本(score和IoU均满足一定条件)的那部分anchor了,而No则定义为距离side-anchor(text line最左边和最右面的anchor)在一定pixel距离内的anchor……

3. 实验结果

贴一个结果对比图:
这里写图片描述
这三个数据集是英文检测数据集,也是目前比较流行的文本检测数据集了。看了下CVPR 2018的text detection,还是有提到这些数据集的。

总的来说,这也是个不错的了解其它问题和类似RNN这样的方法的机会,应该会参考代码好好研究一下,这也是出于大作业的需要。对RNN的理解,一些细节的理解和实现问题之后会更上~

这篇关于从目标检测到特定类别的检测任务:文本检测阅读笔记CTPN(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/466176

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关