文本检测算法----DB、DBNet

2023-11-10

多种文本检测算法性能对比及算法介绍
(https://blog.csdn.net/qq_39707285/article/details/108754444)


1. 摘要

1.1 存在的问题

最近,对于曲形文本的检测任务,基于分割的算法比基于回归的算法表现更好,但之前基于分割的算法,都需要进行手动设计二值化的后处理算法,将分割生成的概率图转换为文本的包围框。

1.2 创新点

提出了 Differentiable Binarization (DB),它可以在分割网络中执行二值化过程,可以自适应地设置二值化阈值,不仅简化了后处理,而且提高了文本检测的性能。

1.3 取得的成绩

在5个基准数据集上取得了最佳准确性和速度,代码地址:DB


2. 算法

DB

整体的网络结构如图3所示,首先输入图片经过特征金字塔backbone,接着,金字塔特征上采样到同一尺寸 F F F,然后,特征图 F F F用来同时预测概率图 P P P和阈值图 T T T,由 F F F T T T计算后近似得到二值图 B ^ \hat B B^

在训练阶段,对概率图、阈值图和近似二值图进行监督,其中概率图和近似二值图共用一个监督。在推理过程中,通过一个box公式化模块,可以很容易地从近似二值图或概率图中得到文本包围框。

2.1 二值化

2.1.1 标准二值化

通常的分割网络,输出特征图 P ⊂ R H × W P \subset R^{H×W} PRH×W,H和W是特征图的高和宽,像素值为1代表是文本区域,像素值为其他则表示不是文本区域,通常这类二值化处理过程可以描述为:
在这里插入图片描述
t t t代表阈值, i , j i,j i,j代表坐标。

2.1.2 可微二值化 Differentiable binarization(DB)

公式1是不可微的,随意没法直接用于训练,本文提出可微的二值化函数,如下:
在这里插入图片描述
B ^ \hat B B^就是近似二值图, T T T代表从网络中学习得到的自适应阈值, k k k是放大因子,通常设置 k k k为50,这个近似的二值化函数的表现类似于标准的二值化函数,如图4所示,但是因为可微,所以可以直接用于网络训练,基于自适应阈值的可微二值化不仅可以帮助区分文本区域和背景,而且可以将连接紧密的文本实例分离出来。
在这里插入图片描述
DB提高了性能表现可以从梯度的反向传播中证实,假如使用二值交叉熵损失函数,定义
f ( x ) = 1 1 + e − k x f(x)={1 \over {1+e^-kx}} f(x)=1+ekx1 作为DB函数, x = P i , j − T i , j x={P_i,j}-{T_i,j} x=Pi,jTi,j l + l_+ l+表示正样本的 l o s s loss loss l − l_- l表示负样本的 l o s s loss loss
在这里插入图片描述
求导得到:在这里插入图片描述
l + l_+ l+ l − l_- l在图4中也有表示,从以上可以得到

  1. 梯度由放大因子k增大
  2. 梯度放大对大多数错误预测区域都有显著影响(x < 0 for L+; x > 0 for L- ),从而有助于优化,并有助于产生更佳的预测结果,另外因为, x = P i , j − T i , j x={P_i,j}-{T_i,j} x=Pi,jTi,j,所以 P P P的梯度在前景和背景之间被 T T T影响

2.2 自适应阈值

在这里插入图片描述
在这里插入图片描述
阈值map使用流程如图2所示,使用阈值map和不适用阈值map的效果对比如图6所示,从图6©中可以看到,即使没用带监督的阈值map,阈值map也会突出显示文本边界区域,这说明边界型阈值map对最终结果是有利的。所以,本文在阈值map上选择监督训练,已达到更好的表现
阈值图类似于文本边框映射,然而,阈值映射的动机和用法与文本边界映射不同

2.3 可变形卷积Deformable convolution

可变形卷积可以提供模型一个灵活的感受野,这对于不同纵横比的文本很有利,本文应用可变形卷积,使用3×3卷积核在ResNet-18或者ResNet-50的conv3,conv4,conv5层。

2.4 标签的生成

在这里插入图片描述
概率图的标签生成方式类似于PSENet(可参考了解PSENet)。

给定一张图片,文本区域标注的多边形可以描述为:
在这里插入图片描述
n n n是每个文本框的标注点总数,在不同数据中可能不同(ICDAR2015中是4,CTW1500中是16),然后使用Vatti裁剪算法1收缩 G G G G s G_s Gs,从原始多边形的周长L和面积A计算收缩的偏移量D计算方式为:
在这里插入图片描述
r r r代表收缩比例,一般设置为0.4.

阈值map的标签生成方式与其类似,首先使用相同的偏移量 D D D,对文本多边形 G G G进行膨胀,然后将 G s G_s Gs G d G_d Gd之间的间隙作为文本区域的边界,通过计算到 G G G中最近的片段的距离来生成阈值map的标签(意思就是,阈值map附近一定距离的标签是1,其他的都为0)

2.5 损失函数

损失函数为概率map的loss、二值map的loss和阈值map的loss之和,
在这里插入图片描述
L s L_s Ls是概率map的loss, L b L_b Lb是二值map的loss,, α \alpha α β \beta β分别设置为1.0和10,对于 L s L_s Ls L b L_b Lb使用二值交叉熵loss(BCE),为了解决正负样本不均衡问题,使用hard negative mining。在这里插入图片描述
S l S_l Sl设计样本集,其中正阳样本和负样本比例是1:3.

L t L_t Lt计算方式为扩展文本多边形 G d G_d Gd内预测结果和标签之间的 L 1 L1 L1距离之和:
在这里插入图片描述
R d R_d Rd是在膨胀 G d G_d Gd内像素的索引, y ∗ y^* y是阈值map的标签。

在模型预测的时候,可以使用概率map或近似二进制map来生成文本边界框,他俩产生的结果几乎相同。为了提高效率,使用概率map而去除阈值map分支。

box处理分三个步骤:

  1. 概率map或者近似二值map先使用一个固定的阈值(0.2)进行二值化处理,得到二值化图
  2. 从二值图中得到连通区域(即收缩文本区域);
  3. 同样用Vatti裁剪算法1,使用偏移量 D ‘ D^` D去膨胀连通区域, D ‘ D^` D计算方式为:
    在这里插入图片描述

A ‘ A^` A是收缩区域面积, L ‘ L^` L是收缩区域周长, r ‘ r^` r设置为1.5。


3. 实验

3.1 数据集

  1. SynthText:从8k个背景图中生成了800k张图片,这些数据用来预训练模型
  2. MLT-2017:多语言数据集,包含9种语言,有7200张训练集,1800张验证集,和9000张测试集,本文使用训练集和验证集来微调网络
  3. ICDAR 2015
  4. MSRA-TD500
  5. CTW1500
  6. Total-Text

3.2 训练、测试细节

3.2.1 训练细节

所有的模型,现在SynthText进行预训练100k次迭代。然后微调真是数据样本1200个epochs,batch size设置为16,学习率设置为 ( 1 − i t e r m a x _ i t e r ) p o w e r (1 - {iter \over max\_iter})^{power} (1max_iteriter)power,初始学习率为0.007, p o w e r power power为0.9,权重书剑0.0001,momentum为0.9。

数据增强:

  1. 随机角度旋转(-10°-10°)
  2. 随机裁剪
  3. 随机翻转
    所有的图片都resize到640×640

3.2.2 测试细节

通过为每个数据集设置适当的高度来输入图像。推理速度在批大小为1的情况下进行测试,在单个线程中使用单个1080ti GPU。推理时间成本包括模型前向时间成本和后处理时间成本。后处理时间成本约为推理时间的30%。

3.3 测试结果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


4. 结论

本文提出了一个新的框架来检测任意形状的场景文本,包括在分割网络中提出的可微二值化过程 (DB),实验证明,该方法(ResNet-50主干网)在五个标准场景文本基准测试中,在速度和准确性方面一直优于目前最先进的方法。特别的,即使使用轻量级主干网(ResNet-18),该方法也可以在所有测试数据集上以实时推理速度获得具有竞争力的性能。


  1. Bala R. Vatti. A generic solution to polygon clipping[J]. Communications of the ACM, 1992. ↩︎ ↩︎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文本检测算法----DB、DBNet 的相关文章

  • 【自适应滤波】一种接近最佳的自适应滤波器,用于突发系统变化研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 【EI复现】基于深度强化学习的微能源网能量管理与优化策略研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 有 无策略奖励 2 2 训练结果1
  • 蒙特卡洛在发电系统中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 用栈实现队列(OJ中报错的处理)

    用栈实现队列 ERROR AddressSanitizer myQueueFree函数中栈的释放处现了问题 没有调用StackDestory而是直接free了 这个是栈初始化时 capacity与malloc申请的空间大小没有匹配 请你仅使
  • 用于 OCR 的 Python OpenCV 倾斜校正

    目前 我正在开发一个 OCR 项目 需要读取标签上的文本 请参见下面的示例图片 我遇到了图像倾斜的问题 我需要帮助修复图像倾斜 以便文本是水平的而不是成角度的 目前 我正在使用的过程尝试从给定范围 下面包含代码 对不同角度进行评分 但这种方
  • 神经网络特征提取

    我正在使用神经网络进行字母和数字的简单识别 到目前为止 我使用字母图像的每个像素作为网络的输入 不用说 这种方法产生的网络非常大 所以我想从图像中提取特征并将它们用作神经网络的输入 我的第一个问题是字母的哪些属性有利于识别它们 第二个问题是
  • Android OCR 仅使用流行的 tessercat fork tess-two 检测数字

    我正在使用流行的 OCR tessercat fork for android tess twohttps github com rmtheis tess two https github com rmtheis tess two 我整合了
  • OCR 处理前的图像预处理

    我当前的项目涉及将 pdf 中的文本转录为文本文件 我首先尝试将图像文件直接放入 OCR 程序 tesseract 中 但效果不佳 原始图像文件基本上是旧报纸 并且有一些背景噪音 我确信 tesseract 存在问题 因此 我尝试在将图像输
  • 了解 OCR 的 Freeman 链码

    请注意 我确实在寻找问题的答案 我是not寻找一些源代码或一些学术论文的链接 我已经使用了源代码 并且我已经阅读了论文 但仍然没有弄清楚这个问题的最后部分 我正在研究一些快速屏幕字体 OCRing 并且取得了很好的进展 我已经找到基线 分离
  • emgucv:C# 中的 pan 卡不正确的倾斜检测

    我有三个泛卡图像 用于使用 emgucv 和 c 测试图像的倾斜 顶部的第一张图像检测到 180 度工作正常 中间的第二张图像检测到的 90 度应检测为 180 度 第三张图像检测到 180 度应检测为 90 度 我想在这里分享的一个观察结
  • OCR:图像转文本?

    在标记为复制或重复问题之前 请先阅读整个问题 我目前能做的如下 获取图像并裁剪 OCR 所需的部分 使用处理图像tesseract and leptonica 当应用的文档被裁剪成块 即每个图像 1 个字符 时 它提供 96 的准确度 如果
  • Android Studio 上的 Android Tesseract OCR [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 一段时间以来 我一直在尝试将 tesseract 包含在 Android Studio 上的 Andro
  • 用于屏幕文本的 OCR(光学字符识别)

    我正在尝试创建一个软件 通过捕获屏幕截图来自动化 PC 然后使用 OCR 光学字符识别 来查找要单击的特定按钮 例如 我已经有了鼠标和键盘控制部分 但现在 我需要 OCR 来处理屏幕截图 我发现 Tesseract OCR 似乎不能很好地处
  • 从图像中识别数字

    我正在尝试编写一个应用程序来查找图像内的数字并将它们相加 如何识别图像中的书写数字 图像中有很多框 我需要获取左侧的数字并将它们相加得出总数 我怎样才能实现这个目标 编辑 我对图像进行了 java tesseract ocr 但没有得到任何
  • 使用 Tesseract OCR 和 python 进行数字识别

    我使用 Tesseract 和 python 读取数字 从能量计 除了数字 1 之外 一切都运行良好 Tesseract 无法读取 1 数字 This is the picture I send to tesseract tesseract
  • 使用 python 突出显示图像中的特定文本

    我想突出显示网站屏幕截图中的特定单词 句子 截取屏幕截图后 我使用提取文本pytesseract and cv2 效果很好 我可以获得有关它的文本和数据 import pytesseract import cv2 if name main
  • 如何将 Tesseract 导入 Angular2 (TypeScript)

    我正在尝试将 Tesseract 导入 Angular2 TypeScript 我可以看到它保存到 node modules 文件夹中 但是在使用时 import Tesseract from types tesseract js it s
  • 用Python识别图像

    我对 OCR 识别和 Python 都有点陌生 我想要实现的是从 Python 脚本运行 Tesseract 以 识别 tif 中的某些特定数字 我以为我可以为 Tesseract 做一些培训 但我在 Google 和 SO 上没有找到任何
  • 提高 pytesseract 从图像中正确识别文本的能力

    我正在尝试使用读取验证码pytesseract模块 大多数时候它都能提供准确的文本 但并非总是如此 这是读取图像 操作图像以及从图像中提取文本的代码 import cv2 import numpy as np import pytesser
  • Tesseract 是否会忽略扫描文档中的任何非文本区域?

    我正在使用 Tesseract 但我不知道它是否忽略任何非文本区域并仅针对文本 我是否必须删除任何非文本区域作为预处理步骤以获得更好的输出 Tesseract 有一个非常好的算法来检测文本 但它最终会给出误报匹配 理想情况下 您应该在将图像

随机推荐