DBNet++(TPAMI) 原理与代码解析

这篇具有很好参考价值的文章主要介绍了DBNet++(TPAMI) 原理与代码解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

paper:Real-Time Scene Text Detection with Differentiable Binarization and Adaptive Scale Fusion

code1:https://github.com/MhLiao/DB

code2:https://github.com/open-mmlab/mmocr

本文的创新点

本文是对DBNet的改进,关于DBNet的介绍具体可见场景文本检测算法 可微分二值化DBNet原理与代码解析,本文新提出了一种自适应尺度融合模块Adaptive Scale Fusion(ASF)module来自适应地融合多尺度的特征,将ASF应用于分割网络,显著地增强了其检测不同尺度文本实例的能力。

方法介绍

DBNet++的完整结构如下图所示

dbnet代码解读,文本检测,深度学习,人工智能,文本检测,OCR,Powered by 金山文档

其中,在FPN的多层输出和最终的预测特征图之间加入了ASF module。

ASF的完整结构如下图所示

dbnet代码解读,文本检测,深度学习,人工智能,文本检测,OCR,Powered by 金山文档

FPN的输出为 \(X\in \mathcal{R}^{N\times C\times H\times W}=\left \{ X_{i} \right \}_{i=0}^{N-1} \),其中 \(N=4\) 表示FPN的4个不同尺度的输出特征,通过插值得到了一致的spatial size。首先将 \(X\) 沿通道concatenate然后通过一个 \(3\times 3\) 的卷积层得到中间特征 \(S\in \mathcal{R}^{C\times H\times W}\)。然后,\(S\) 经过一个空间注意力模块spatial attention module得到注意力权重 \(A\in \mathcal{R}^{N\times H\times W}\)。接着,权重 \(A\) 沿通道维度均分为 \(N\) 份,并与相应的特征加权相乘得到最终的融合特征 \(F\in \mathcal{R}^{N\times C\times H\times W}\)。

scale attention的完整过程定义如下

dbnet代码解读,文本检测,深度学习,人工智能,文本检测,OCR,Powered by 金山文档

代码解析

这里以mmocr的实现为例,注意在文章中作者提出的ASF是一个spatial attention模块,但在官方实现https://github.com/MhLiao/DB/blob/master/decoders/feature_attention.py中,作者给出了三种不同注意力机制的实现,除了文章中提到的spatial attention,还有channel attention以及两者结合的spatial-channel attention。MMOCR只移植了spatial-channel attention的实现即ScaleChannelSpatialAttention,具体如下

class ScaleChannelSpatialAttention(BaseModule):
    """Spatial Attention module in Real-Time Scene Text Detection with
    Differentiable Binarization and Adaptive Scale Fusion.

    This was partially adapted from https://github.com/MhLiao/DB

    Args:
        in_channels (int): A numbers of input channels.
        c_wise_channels (int): Number of channel-wise attention channels.
        out_channels (int): Number of output channels.
        init_cfg (dict or list[dict], optional): Initialization configs.
    """

    def __init__(
        self,
        in_channels: int,  # 256
        c_wise_channels: int,  # 64
        out_channels: int,  # 4
        init_cfg: Optional[Union[Dict, List[Dict]]] = [
            dict(type='Kaiming', layer='Conv', bias=0)
        ]
    ) -> None:
        super().__init__(init_cfg=init_cfg)
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        # Channel Wise
        self.channel_wise = Sequential(
            ConvModule(
                in_channels,
                c_wise_channels,
                1,
                bias=False,
                conv_cfg=None,
                norm_cfg=None,
                act_cfg=dict(type='ReLU'),
                inplace=False),
            ConvModule(
                c_wise_channels,
                in_channels,
                1,
                bias=False,
                conv_cfg=None,
                norm_cfg=None,
                act_cfg=dict(type='Sigmoid'),
                inplace=False))
        # Spatial Wise
        self.spatial_wise = Sequential(
            ConvModule(
                1,
                1,
                3,
                padding=1,
                bias=False,
                conv_cfg=None,
                norm_cfg=None,
                act_cfg=dict(type='ReLU'),
                inplace=False),
            ConvModule(
                1,
                1,
                1,
                bias=False,
                conv_cfg=None,
                norm_cfg=None,
                act_cfg=dict(type='Sigmoid'),
                inplace=False))
        # Attention Wise
        self.attention_wise = ConvModule(
            in_channels,
            out_channels,
            1,
            bias=False,
            conv_cfg=None,
            norm_cfg=None,
            act_cfg=dict(type='Sigmoid'),
            inplace=False)

    def forward(self, inputs: torch.Tensor) -> torch.Tensor:
        """
        Args:
            inputs (Tensor): A concat FPN feature tensor that has the shape of
                :math:`(N, C, H, W)`.

        Returns:
            Tensor: An attention map of shape :math:`(N, C_{out}, H, W)`
            where :math:`C_{out}` is ``out_channels``.
        """
        # (4,256,160,160)
        out = self.avg_pool(inputs)  # (4,256,1,1)
        out = self.channel_wise(out)  # (4,256,1,1)
        out = out + inputs  # (4,256,160,160)
        inputs = torch.mean(out, dim=1, keepdim=True)  # (4,1,160,160)
        out = self.spatial_wise(inputs) + out  # (4,1,160,160)+(4,256,160,160)->(4,256,160,160)
        out = self.attention_wise(out)  # (4,4,160,160)

        return out

这里设batch_size=4,input_size=(640, 640),FPN的4层输出经过上采样后得到统一大小的feature map,即列表[(4,64,160,160),(4,64,160,160),(4,64,160,160),(4,64,160,160)],然后沿通道拼接得到shape=(4,256,160,160)的输出,然后经过一个3x3的卷积层输出shape不变还是(4,256,160,160)得到ASF模块的输入。

首先经过全局平均池化得到(4,256,1,1)的输出,通道注意力模块self.channel_wise是一个两层卷积conv1x1-64-ReLU-conv1x1-256-Sigmoid得到大小不变的输出即通道注意力的权重,然后与原始输入相加。接着沿通道取均值,接着经过空间注意力模块即self.spatial_wise,它也是两层卷积conv3x3-1-ReLU-conv1x1-1-Sigmoid得到空间注意力的权重再与输入相加,最后经过conv1x1-4-Sigmoidself.attention_wise得到ASF模块的输出(4,4,160,160)

然后将ASF模块输出的4层注意力权重与原始FPN对应的4层输出进行加权相乘,最后再沿通道拼接得到最终输出。文章来源地址https://www.toymoban.com/news/detail-589134.html

for i, out in enumerate(outs):
    enhanced_feature.append(attention[:, i:i + 1] * outs[i])
out = torch.cat(enhanced_feature, dim=1)

到了这里,关于DBNet++(TPAMI) 原理与代码解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读 ?????OpenCV实战系列总目录

    打印一个图片可以做出一个函数: Canny是一个科学家在1986年写了一篇论文,所以用自己的名字来命名这个检测算法,Canny边缘检测算法这里写了5步流程,会用到之前《openCV实战-系列教程》的内容。  使用高斯滤波器,以平滑图像,滤除噪声。 计算图像中每个像素点的梯度强

    2024年02月11日
    浏览(40)
  • 基于 transformers 的 generate() 方法实现多样化文本生成:参数含义和算法原理解读

    最近在做文本生成,用到huggingface transformers库的文本生成 generate() 函数,是 GenerationMixin 类的实现( class transformers.generation_utils.GenerationMixin ),是自回归文本生成预训练模型相关参数的集大成者。因此本文解读一下这些参数的含义以及常用的 Greedy Search 、 Beam Search 、 Sampli

    2024年02月02日
    浏览(36)
  • 3D目标检测--PointPillars论文和OpenPCDet代码解读

    解决传统基于栅格化的3D目标检测方法在面对高密度点云数据时的性能瓶颈; 栅格化方法需要将点云数据映射到规则的网格中,但是对于高密度点云,栅格化操作会导致严重的信息损失和运算效率低下; 因此,该论文提出了一种新的基于点云的3D目标检测方法——PointPillars,

    2023年04月22日
    浏览(68)
  • GAN原理 & 代码解读

    GAN的生成是随机的,不同的噪声,生成不同的数字

    2024年02月11日
    浏览(68)
  • CutMix原理与代码解读

    paper: CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features 之前的数据增强方法存在的问题: mixup: 混合后的图像在局部是模糊和不自然的,因此会混淆模型,尤其是在定位方面。 cutout: 被cutout的部分通常用0或者随机噪声填充,这就导致在训练过程中这部分的

    2024年02月04日
    浏览(35)
  • PatchCore原理与代码解读

    paper:Towards Total Recall in Industrial Anomaly Detection code:GitHub - amazon-science/patchcore-inspection  目前无监督缺陷检测常用的一种方法是直接利用在ImageNet上预训练的模型中的表示,而不专门进行目标分布的迁移和适配,比如PaDiM。由于这类方法是non-adaptive的,因此网络在更深更抽象层

    2023年04月21日
    浏览(24)
  • 目标检测论文解读复现之十:基于YOLOv5的遥感图像目标检测(代码已复现)

    前言        此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文,帮助大家解答疑惑。解读的系列文章,本人

    2024年02月06日
    浏览(30)
  • stm32-DHT11原理及代码解读

    目录 一、基础知识 1.功能:温湿度检测 2.应用范围 3.硬件电路连接 二、底层代码原理分析 1.基础知识 1.单总线说明 2.单总线传送数据位定义 3.数据格式 4.校验位数据定义 2.代码分析 1.数据时序图 2.数据传输步骤         测量范围湿度:湿度:5-95%RH        精度:(±

    2023年04月08日
    浏览(25)
  • 3D目标检测概要及VoxelNet论文和代码解读(1)--Pillar VFE

    点云和图像都是自动驾驶中常用的传感器数据类型,它们各自有不同的优缺点。点云目标检测在自动驾驶领域中有着不可替代的优势,尤其是在需要精准定位和避障的场景下,点云目标检测可以为自动驾驶车辆提供更为准确和可靠的感知能力,点云的主要优势为: 三维信息丰

    2024年02月06日
    浏览(27)
  • 【C++】lambda表达式语法详细解读(代码演示,要点解析)

    前言 大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《初学者易

    2024年02月03日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包