当前位置: 首页 > news >正文

3.基于分割的文本检测算法--DBNet++

文章目录

    • 1.概况
    • 2.DBNet++中的主要方法
      • 2.1 网络结构
      • 2.2 适应特征图融合模块(Adaptive Scale Fusion Module, ASF)
    • 3.ASF模块的源码实现
    • 参考资料


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


1.概况

2022年02月份论文:Real-Time Scene Text Detection with Differentiable Binarization and Adaptive Scale Fusion

DBNet是2019年11月华中科技大学的Xiang Bai等提出的方法,其详细介绍见4.基于分割的文本检测算法–DBNet

DBNet++是原作者团队基于DBNet的改进工作,是DBNet会议论文的期刊版,除了DBNet中已经介绍过的可微分二值化运算之外,DBNet++中的主要创新是自适应多尺度特征融合(Adapptive Scale Fusion,ASF)模块的提出。

在以往的分割算方法中,多尺度特征图大都是通过FPN后直接进行concatenate来实现,这样做并没有考虑不同尺度特征图的重要性是不一样的。本文中,作者提出的自适应特征图融合模块使用了空间注意力机制,具体的介绍见第2部分。

2.DBNet++中的主要方法

2.1 网络结构

在这里插入图片描述

如上图所示,DBNet++的网络结构几乎相同,使用FPNbackbone,可微分二值化,基于分割概率图求文本区域等,主要的不同在对backbone上输出的特征图的处理上,DBNet++中新引入了Adaptive Scale Fusion模块。

2.2 适应特征图融合模块(Adaptive Scale Fusion Module, ASF)

在这里插入图片描述

图中对一个特征图的shape描述进行了修改,原论文图中存在特征图shape从N×C×H×W经过conv后变成C×H×W容易引起误解(容易误会成卷积将四维向量变成了三维)。

计算过程如上图所示,值的注意的是空间注意力机制的使用,先是对每个通道取均值得到特征图每个像素位置上的重要性,再将其加到原输入特征图上,增强每个位置的特征值,再通过卷积输出通道为N个的注意力权重,使得输出的权重能衡量每个尺度特征图的重要性。

backbone提取后输入到 ASF的特征图为X∈RN×C×H×W={Xi}i=0N−1X\in R^{N\times C\times H\times W} = \{X_i\}_{i=0}^{N-1}XRN×C×H×W={Xi}i=0N1,N表示特征图个数,N=4
先将N个特征图 concatenate到一起,然后再经过一个3×33\times33×3的卷积层得中间特征图S∈RC×H×WS\in R^{C\times H\times W}SRC×H×W,将SSS输入到一个空间注意力模块得到注意力权重A∈RN×H×WA\in R^{N\times H\times W}ARN×H×W,注意力权重A有N个通道,将其沿通道方向切分得到N个权重矩阵[E0,E1,...,EN−1][E_0,E_1,...,E_{N-1}][E0,E1,...,EN1],将其分别与输入的N个特征图XXX对应相乘后再 concatenate到一起就得到了 ASF的输出。

S=Conv(concat([X0,X1,...,XN−1]))S = Conv(concat([X_0,X_1,...,X_{N-1}])) S=Conv(concat([X0,X1,...,XN1]))

A=SpatialAttention(S)A = Spatial_Attention(S) A=SpatialAttention(S)

F=concat([E0X0,E1X1,...,EN−1XN−1])F=concat([E_0X_0,E_1X_1,...,E_{N-1}X_{N-1}]) F=concat([E0X0,E1X1,...,EN1XN1])

3.ASF模块的源码实现

decoders/feature_attention.py

class ScaleSpatialAttention(nn.Module):def __init__(self, in_planes, out_planes, num_features, init_weight=True):super(ScaleSpatialAttention, self).__init__()self.spatial_wise = nn.Sequential(#Nx1xHxWnn.Conv2d(1, 1, 3, bias=False, padding=1),nn.ReLU(),nn.Conv2d(1, 1, 1, bias=False),nn.Sigmoid() )self.attention_wise = nn.Sequential(nn.Conv2d(in_planes, num_features, 1, bias=False),nn.Sigmoid())if init_weight:self._initialize_weights()...def forward(self, x):global_x = torch.mean(x, dim=1, keepdim=True)global_x = self.spatial_wise(global_x) + xglobal_x = self.attention_wise(global_x)return global_xclass ScaleFeatureSelection(nn.Module):def __init__(self, in_channels, inter_channels , out_features_num=4, attention_type='scale_spatial'):super(ScaleFeatureSelection, self).__init__()self.in_channels=in_channelsself.inter_channels = inter_channelsself.out_features_num = out_features_numself.conv = nn.Conv2d(in_channels, inter_channels, 3, padding=1)self.type = attention_typeif self.type == 'scale_spatial':self.enhanced_attention = ScaleSpatialAttention(inter_channels, inter_channels//4, out_features_num)elif self.type == 'scale_channel_spatial':self.enhanced_attention = ScaleChannelSpatialAttention(inter_channels, inter_channels // 4, out_features_num)elif self.type == 'scale_channel':self.enhanced_attention = ScaleChannelAttention(inter_channels, inter_channels//2, out_features_num)def _initialize_weights(self, m):classname = m.__class__.__name__if classname.find('Conv') != -1:nn.init.kaiming_normal_(m.weight.data)elif classname.find('BatchNorm') != -1:m.weight.data.fill_(1.)m.bias.data.fill_(1e-4)def forward(self, concat_x, features_list):concat_x = self.conv(concat_x)score = self.enhanced_attention(concat_x)assert len(features_list) == self.out_features_numif self.type not in ['scale_channel_spatial', 'scale_spatial']:shape = features_list[0].shape[2:]score = F.interpolate(score, size=shape, mode='bilinear')x = []for i in range(self.out_features_num):x.append(score[:, i:i+1] * features_list[i])return torch.cat(x, dim=1)
---

欢迎访问个人网络日志🌹🌹知行空间🌹🌹


参考资料

  • 1.https://github.com/MhLiao/DB
  • 2.Real-Time Scene Text Detection with Differentiable Binarization and Adaptive Scale Fusion
http://www.lryc.cn/news/16399.html

相关文章:

  • IOS打包、SDK接入记录等
  • 【C++】类与对象(引入)
  • Redis 高级数据类型
  • Java8 新特性-函数式接口
  • 这套软件测试试卷能打90分,直接入职字节吧
  • GUI可视化应用开发及Python实现
  • 【论文简述】GMFlow: Learning Optical Flow via Global Matching(CVPR 2022)
  • 【Spark分布式内存计算框架——离线综合实战】5. 业务报表分析
  • 力扣-删除重复的电子邮箱
  • git基础
  • postgres 源码解析50 LWLock轻量锁--1
  • JVM优化常用命令
  • 按键中断实验
  • kubernetes入门介绍,从0到1搭建并使用
  • 【C语言进阶】字符串函数与内存函数的学习与模拟实现
  • 【JavaEE初阶】第一节.多线程(进阶篇 ) 常见的锁策略、CAS及它的ABA问题
  • Linux基础命令-pstree树状显示进程信息
  • keepalived+LVS配置详解
  • Unity之C#端使用protobuf
  • C++设计模式(18)——模板方法模式
  • SQLserver 索引碎片
  • 【Storm】【二】安装
  • Android ConditionVariable
  • Action Segmentation数据集介绍——Breakfast
  • 横道图时间标尺在P6软件中的设置
  • 空间复杂度(超详解+例题)
  • Document-Level event Extraction via human-like reading process 论文解读
  • H5盲盒抽奖系统源码
  • 低代码平台和无代码平台哪个更适合开发企业管理系统?
  • 75岁彪马再发NFT 复活美洲狮IP