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++的完整结构如下图所示

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

ASF的完整结构如下图所示

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的完整过程定义如下

代码解析

这里以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 withDifferentiable Binarization and Adaptive Scale Fusion.This was partially adapted from https://github.com/MhLiao/DBArgs: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,  # 256c_wise_channels: int,  # 64out_channels: int,  # 4init_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 Wiseself.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 Wiseself.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 Wiseself.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-Sigmoid的self.attention_wise得到ASF模块的输出(4,4,160,160)。

然后将ASF模块输出的4层注意力权重与原始FPN对应的4层输出进行加权相乘,最后再沿通道拼接得到最终输出。

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

DBNet++(TPAMI) 原理与代码解析相关推荐

  1. 视觉SLAM开源算法ORB-SLAM3 原理与代码解析

    来源:深蓝学院,文稿整理者:何常鑫,审核&修改:刘国庆 本文总结于上交感知与导航研究所科研助理--刘国庆关于[视觉SLAM开源算法ORB-SLAM3 原理与代码解析]的公开课. ORB-SLA ...

  2. Tensorflow2.0---SSD网络原理及代码解析(二)-锚点框的生成

    Tensorflow2.0-SSD网络原理及代码解析(二)-锚点框的生成 分析完SSD网络的原理之后,一起来看看代码吧~ 代码转载于:https://github.com/bubbliiiing/ss ...

  3. ICCV2017跟踪算法BACF原理及代码解析

    文章和代码下载地址: Galoogahi H K, Fagg A, Lucey S. Learning Background-Aware Correlation Filters for Visual ...

  4. G-GhostNet(IJCV 2022)原理与代码解析

    paper:GhostNets on Heterogeneous Devices via Cheap Operations code:https://github.com/huawei-noah/Ef ...

  5. YOLOv3原理及代码解析

    博主完整翻译了YOLOV1和YOLOV3的论文:请移步查看: YOLOV1:https://blog.csdn.net/taifengzikai/article/details/81988891 YO ...

  6. 【资源】CenterNet原理与代码解析

    <CenterNet原理与代码解析>是首发于GiantPandaCV公众号的电子书教程,由pprp总结并整理CenterNet相关解析,这本电子书是基于非官方的CenterNet实现,ht ...

  7. TPAMI2015跟踪算法KCF原理及代码解析

    文章和代码下载地址: http://www.robots.ox.ac.uk/~joao/circulant/ 一.基础公式的由来 相关滤波跟踪器可以表示为最小化的岭回归问题: 表示期望相应,表示正则系 ...

  8. ViBe算法原理和代码解析

    ViBe - a powerful technique for background detection and subtraction in video sequences 算法官网:http:// ...

  9. ORB-SLAM / ORB-SLAM2原理解读+代码解析(汇总了资料,方便大家学习)

    注释:本文非原创,初学搜集了很多资料附上链接,方便初学者学习,避免盲目搜索浪费时间. 目录 官方代码链接 代码框架思维导图 参考解读 参考链接- -一步步带你看懂orbslam2源码 ORB-SLAM ...

最新文章

  1. mysql分库主键_分库主键设计-Mysql
  2. PPT 2016 后台播放功能
  3. 内存可见性和原子性:Synchronized和Volatile的比较
  4. API标准化成为技术团队面临的最大挑战
  5. STM32 软件重启导致死机的情况分析
  6. 如何简单快速调试高大上的谷歌浏览器
  7. 关闭应用程序的几种方法
  8. python读取mysql数据库行数_使用python读取mysql数据库并进行数据的操作
  9. Uva 12009 平方数尾数与自身同样 dfs 构造
  10. 取datatable某一列的值_R-缺失值识别与处理
  11. 智能优化算法:旗鱼优化算法-附代码
  12. IAR 8.3 for Arm 安装与注册
  13. java+redis实现腾讯云短信SDK3.0验证+过期时间验证
  14. java hsqldb_HSQLDB: java程序使用hsqldb 入门教程 java启动hsqldb (初步hsqldb效率评估)...
  15. 人人开源需要的问题与解决方案(一)——公网访问、内网穿透
  16. 使用eNSP模拟华为交换机路由器防火墙创建VLAN实现单臂路由
  17. 谈谈创业公司给服务器放在云端的优势和缺陷
  18. 关于Markdown编辑器
  19. [论文总结] 森林生态系统中的水生生境
  20. 互联网创业必须知道的几个名词:蝴蝶效应、青蛙现象、鳄鱼法则……

热门文章

  1. 【毕业设计】图像识别垃圾分类系统 - python 深度学习
  2. 使用yocto为raspberry编译内核
  3. 几何的对称之美——风筝定理
  4. 第3章 Linux内核调试手段之二
  5. 国人开发开源软件TOP100
  6. ubuntu16.04使用wine安装Wechat、QQ、Tim等windows软件
  7. 常见的17种运维软件
  8. 妙招-好用的优盘数据恢复软件
  9. 菜鸟学习Spring——第一个例子
  10. FLUENT中MRF模型简介及应用实例