从目标检测到特定类别的检测任务:文本检测阅读笔记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

相关文章

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个