PaddleOCR模型ch_PP-OCRv3文本检测模型研究(二)颈部网络

上节研究了PaddleOCR文本检测v3模型的骨干网,本文接着研究其颈部网络。

文章目录

  • 研究起点
  • 残注层
  • 颈部网络
  • 代码实验
  • 小结

研究起点

摘取开源yml配置文件,摘取网络架构Architecture中颈部网络的配置如下

  Neck:name: RSEFPNout_channels: 96shortcut: True

可以看出颈部网络的名称为RSEFPN,这个名字可以拆开来做如下理解:

  • R
    代表残差(Residual),即输入特征与中间输出特征做加法,形成最终输出特征。
  • SE
    代表压发层(Squeeze&Excitation),即通道注意力机制,通过压制与发扬,减弱低效通道作用,强化高效通道效能,详情参考上一节分析。
  • FPN
    代表特征金字塔(FeaturePyramidNetwork),即在各个不同尺度上提取目标特征,形成一个原始图像从整体到细节的全方位理解。参照上节的分析,骨干网通过四个阶段,分别在1/4、1/8、1/16、1/32等四个层次上进行操作。

通过搜索,可以找到RSEFPN类的定义在db_fpn.py文件的246-304行,官方链接请参考gitee。

残注层

RSELayer的代码,在db_fpn.py文件的221-243行,包含一个卷积层和一个压发层,这里将RSELayer中文名称取为残注层,意思是既有残差的含义,也有注意力机制的含义。阅读源代码,可以将RSELayer的结构图示如下:
残注层
从上到下看残注层结构示意图,首先是传入了一个输入通道数c_in的张量,结构为c_in,h,w,经过一个卷积核为k_in步长为1的卷归层的处理,输出一个结构为c_out,h,w的张量,其中c_out代表设置的输出通道数。接着是一个压发层SEModule,不改变输入张量结构。最后根据shortcut参数是否为True,来决定是否将压发层的结果与压发层的输入做加法。

颈部网络

有了上节残注层的基础知识,RSEFPN类的源码就能看懂。但代码阅读,远没有图来得直观。通过总结理解RSEFPN的代码,可以形成如下颈部网络示意图:
RSEFPN通过上图,可以将颈部网络划分为如下几个部分:

  • 对接
    需要从骨干网四个阶段输出,依此承接,参照上图左侧虚线部分,详情见上节都骨干网的分析。
  • 通道统一
    通过四个残注层RSELayer,将骨干网四阶段输出,统一转为96通道,宽高不变,依此形成in5/in4/in3/in2四层输出。
  • 上采样
    通过三个scale为2的上采样操作,将细粒度下层特征放大,并与上层结果做加法,实现各层次视觉信息的融合,依此形成out4/out3/out2
  • 通道压缩
    通过四个卷积核大小为3的残注层RSELayer,将上采样结果进行通道压缩,将原通道数缩为1/4,依此形成p5/p4/p3/p2
  • 聚合
    将通道压缩结果,依此做scale=8/4/2的上采样,将所有四层金字塔视觉信息处理成果统一转为通道数、宽、高一致的信息,在通道维度上做拼接,最终将骨干网16/24/56/480通道的四阶段输出,结果颈部网络RSEFPN的处理,形成96通道的输出,宽高与骨干网stage0的输出一致。

代码实验

下面做python的代码实践。通过paddle.summary函数调用,得到以下输出:

--------------------------------------------------------------------------------Layer (type)         Input Shape          Output Shape         Param #    
================================================================================Conv2D-82        [[5, 480, 2, 10]]      [5, 96, 2, 10]        46,080     
AdaptiveAvgPool2D-15   [[5, 96, 2, 10]]      [5, 96, 1, 1]            0       Conv2D-83         [[5, 96, 1, 1]]       [5, 24, 1, 1]          2,328     Conv2D-84         [[5, 24, 1, 1]]       [5, 96, 1, 1]          2,400     SEModule-15        [[5, 96, 2, 10]]      [5, 96, 2, 10]           0       RSELayer-7       [[5, 480, 2, 10]]      [5, 96, 2, 10]           0       stage3->in5Conv2D-76         [[5, 56, 4, 20]]      [5, 96, 4, 20]         5,376     
AdaptiveAvgPool2D-13   [[5, 96, 4, 20]]      [5, 96, 1, 1]            0       Conv2D-77         [[5, 96, 1, 1]]       [5, 24, 1, 1]          2,328     Conv2D-78         [[5, 24, 1, 1]]       [5, 96, 1, 1]          2,400     SEModule-13        [[5, 96, 4, 20]]      [5, 96, 4, 20]           0       RSELayer-5        [[5, 56, 4, 20]]      [5, 96, 4, 20]           0       stage2->in4Conv2D-70         [[5, 24, 8, 40]]      [5, 96, 8, 40]         2,304     
AdaptiveAvgPool2D-11   [[5, 96, 8, 40]]      [5, 96, 1, 1]            0       Conv2D-71         [[5, 96, 1, 1]]       [5, 24, 1, 1]          2,328     Conv2D-72         [[5, 24, 1, 1]]       [5, 96, 1, 1]          2,400     SEModule-11        [[5, 96, 8, 40]]      [5, 96, 8, 40]           0       RSELayer-3        [[5, 24, 8, 40]]      [5, 96, 8, 40]           0       stage1->in3Conv2D-64        [[5, 16, 16, 80]]     [5, 96, 16, 80]         1,536     
AdaptiveAvgPool2D-9   [[5, 96, 16, 80]]      [5, 96, 1, 1]            0       Conv2D-65         [[5, 96, 1, 1]]       [5, 24, 1, 1]          2,328     Conv2D-66         [[5, 24, 1, 1]]       [5, 96, 1, 1]          2,400     SEModule-9       [[5, 96, 16, 80]]     [5, 96, 16, 80]           0       RSELayer-1       [[5, 16, 16, 80]]     [5, 96, 16, 80]           0       stage0->in2Conv2D-85         [[5, 96, 2, 10]]      [5, 24, 2, 10]        20,736     
AdaptiveAvgPool2D-16   [[5, 24, 2, 10]]      [5, 24, 1, 1]            0       Conv2D-86         [[5, 24, 1, 1]]        [5, 6, 1, 1]           150      Conv2D-87          [[5, 6, 1, 1]]       [5, 24, 1, 1]           168      SEModule-16        [[5, 24, 2, 10]]      [5, 24, 2, 10]           0       RSELayer-8        [[5, 96, 2, 10]]      [5, 24, 2, 10]           0       in5->p5Conv2D-79         [[5, 96, 4, 20]]      [5, 24, 4, 20]        20,736     
AdaptiveAvgPool2D-14   [[5, 24, 4, 20]]      [5, 24, 1, 1]            0       Conv2D-80         [[5, 24, 1, 1]]        [5, 6, 1, 1]           150      Conv2D-81          [[5, 6, 1, 1]]       [5, 24, 1, 1]           168      SEModule-14        [[5, 24, 4, 20]]      [5, 24, 4, 20]           0       RSELayer-6        [[5, 96, 4, 20]]      [5, 24, 4, 20]           0       out4->p4Conv2D-73         [[5, 96, 8, 40]]      [5, 24, 8, 40]        20,736     
AdaptiveAvgPool2D-12   [[5, 24, 8, 40]]      [5, 24, 1, 1]            0       Conv2D-74         [[5, 24, 1, 1]]        [5, 6, 1, 1]           150      Conv2D-75          [[5, 6, 1, 1]]       [5, 24, 1, 1]           168      SEModule-12        [[5, 24, 8, 40]]      [5, 24, 8, 40]           0       RSELayer-4        [[5, 96, 8, 40]]      [5, 24, 8, 40]           0       out3->p3Conv2D-67        [[5, 96, 16, 80]]     [5, 24, 16, 80]        20,736     
AdaptiveAvgPool2D-10  [[5, 24, 16, 80]]      [5, 24, 1, 1]            0       Conv2D-68         [[5, 24, 1, 1]]        [5, 6, 1, 1]           150      Conv2D-69          [[5, 6, 1, 1]]       [5, 24, 1, 1]           168      SEModule-10       [[5, 24, 16, 80]]     [5, 24, 16, 80]           0       RSELayer-2       [[5, 96, 16, 80]]     [5, 24, 16, 80]           0       out2->p2
================================================================================
Total params: 158,424
Trainable params: 158,424
Non-trainable params: 0
--------------------------------------------------------------------------------
Input size (MB): 0.81
Forward/backward pass size (MB): 23.39
Params size (MB): 0.60
Estimated Total Size (MB): 24.80
--------------------------------------------------------------------------------

主要输出与上节图形残注层RSELayer的对应关系,备注在行尾。

小结

本文分析了残注层RSELayer的内部结构,了解到卷归层和压发层是其内核;分析了颈部网络RSEFPN的四层金字塔结构,以及颈部网络与骨干网络的对接关系;做了简单的代码实验,将实战输出与图形描述进行了对应标注。代码实验参见gitee。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IEEE T-RO 软体机器人手指状态估计实现两栖触觉传感

摘要:南方科技大学戴建生院士、林间院士、万芳老师、宋超阳老师团队近期在IEEE T-RO上发表了关于软体机器人手指在两栖环境中本体感知方法的论文。 近日,南方科技大学戴建生院士、林间院士、万芳老师、宋超阳老师团队在机器人顶刊IEEE T-RO上以《Propri…

AutoMQ x Iceberg SG Meetup: Table Topic 新特性统一流与分析首次公开

活动介绍 Apache Iceberg 已经成为数据湖表格式的事实标准,为存储在S3上的数据提供了统一的格式。随着 AWS 在 2024 年的 re:invent 大会上宣布支持 Iceberg Table 的 S3 Table 新特性,Iceberg 再一次受到全球开发者的关注和讨论。AutoMQ 是基于云优先理…

java-多线程的创造方式(自用笔记)

方式一:继承父类thread 1、定义一个子类,继承父类thread 2、重写父类的run方法 3、创建线程类的“对象” 4、启动线程 package week14;public class ThreadDemo {public static void main(String[] args) {//3、创建线程类的“对象”Thread t1 new…

【CSS in Depth 2 精译_071】11.4 思考字体颜色的对比效果 + 11.5 本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 11.2.2.1 RGB…

MySQL ON DUPLICATE KEY UPDATE影响行数

目录 分析为什么Updates返回7 总结 数据库更新日志如下 insertOrUpdateList|> Preparing: INSERT INTO clue_user_tag (vuid, tag_id, tag_type, content) VALUES (?, ?, ?, ?) , (?, ?, ?, ?) , (?, ?, ?, ?) , (?, ?, ?, ?) ON DUPLICATE KEY UPDATE …

ElasticSearch常见的索引_集群的备份与恢复方案

方案一:使用Elasticsearch的快照和恢复功能进行备份和恢复。该方案适用于集群整体备份与迁移,包括全量、增量备份和恢复。 方案二:通过reindex操作在集群内或跨集群同步数据。该方案适用于相同集群但不同索引层面的迁移,或者跨集…

HarmonyOS:多线程并发-Worker

Worker主要作用是为应用程序提供一个多线程的运行环境,可满足应用程序在执行过程中与宿主线程分离,在后台线程中运行一个脚本进行耗时操作,极大避免类似于计算密集型或高延迟的任务阻塞宿主线程的运行。具体接口信息及使用方法详情请见Worker…

Linux 升级 openssh 方法步骤

目录 一:OpenSSH 介绍二:升级 OpenSSH1、下载源码包2、查看当前安装位置3、上传源码包4、生成Makefile文件5、编译并安装6、重启ssh服务7、检查版本信息 一:OpenSSH 介绍 OpenSSH最初是作为OpenBSD系统项目的一部分而开发的,后面…

ES语句——DSL(kibana语句)

一、查询操作 查看当前索引的数据结构 _mapping Get ai-open-log*/_mapping 查询当前索引下的文档数以及分片信息 _count Get ai-open-log*/_count { "count": 12345, //当前索引下的文档总数 "_shards": { //分片信息 "total&…

docker开启远程访问

1、编辑docker.server文件 vi /usr/lib/systemd/system/docker.service 找到 [Service] 节点,修改 ExecStart 属性,增加 -H tcp://0.0.0.0:2375 ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock -H tcp://0.0.0.0:2…

ubuntu检测是否已安装nvidia驱动以及产品类型

nvidia-sminvidia-smi 是 NVIDIA 提供的一个命令行工具,用于查看和管理 NVIDIA GPU 的状态。当你运行 nvidia-smi 命令时,它会显示当前系统中所有 NVIDIA GPU 的状态信息,包括 GPU 的使用率、温度、内存使用情况等。 有8个GPU nvcc -V查看c…

python的自动化seleium安装配置(包含谷歌的chromedriver)

目录 前言介绍 一、下载谷歌浏览器chromedriver (一)查看谷歌浏览器版本 (二)去官网下载谷歌驱动(chromdriver) (三)谷歌浏览器安装位置解压 (四)配置环境变量 二、pychram里下载安装selenium 三、测试selenium是否成功 前言介绍 Selenium是一个开源的自动化测试工具&…

基础学习:(5)不同卷积:transposed convolution,deconvolution,dilated convolution

基础学习:(5)不同卷积 文章目录 基础学习:(5)不同卷积前言1 deconvlution transposed convolution2 对比2.1 Convolution animations2.2 Transposed convolution animations2.3 Dilated convolution 前言 …

轻量级日志管理平台:Grafana Loki搭建及应用(详细篇)

前言 Grafana Loki是Grafana Lab团队提供的一个水平可扩展、高可用性、多租户的日志聚合系统,与其他日志系统不同的是,Loki最初设计的理念是为了为日志建立标签索引,而非将原日志内容进行索引。 现在目前成熟的方案基本上都是:L…

el-table行合并及合并后序号处理

效果图 <el-tableclass"ncky-detail-table"v-loading"tableLoading"border:data"tableDataVo":span-method"objectSpanMethod"row-key"uniqueFlag":row-class-name"tablerowclassname"><el-table-column…

vue-echarts高度缩小时autoresize失效

背景 项目中采用动态给x-vue-echarts style赋值width&#xff0c;height的方式实现echarts图表尺寸的改变 <v-chart...autoresize></v-chart>给v-chart添加autoresize后&#xff0c;在图表宽度变化&#xff0c;高度增加时无异常&#xff0c;高度减小时图表并未缩…

厦门凯酷全科技有限公司正规吗靠谱吗?

随着短视频和直播电商的迅猛发展&#xff0c;越来越多的企业开始将目光投向抖音这一平台。作为国内领先的短视频社交平台&#xff0c;抖音凭借其庞大的用户基础和强大的算法推荐系统&#xff0c;成为众多品牌拓展市场、提升销售的重要渠道。厦门凯酷全科技有限公司&#xff08;…

WireShark 下载、安装和使用

1、下载 官网下载太慢&#xff0c;本人另外提供下载地址【下载WireShark】 2、安装 全部默认下一步即可&#xff0c;但如下图所示的这一步值得拿出来说一下。这一步是要你安装Npcap&#xff0c;但是你的电脑如果已经安装了WinPcap&#xff0c;那么可以选择不再安装Npcap。Npca…

电子应用设计方案-50:智能牙刷系统方案设计

智能牙刷系统方案设计 一、引言 随着人们对口腔健康的重视程度不断提高&#xff0c;智能牙刷作为一种创新的口腔护理工具&#xff0c;能够更有效地帮助用户改善刷牙习惯和清洁效果。本方案旨在设计一款功能丰富、智能化程度高的智能牙刷系统。 二、系统概述 1. 系统目标 - 准…

第九篇:k8s 通过helm发布应用

什么是helm&#xff1f; Helm 是 Kubernetes 的包管理器。Helm 是查找、分享和使用软件构建 Kubernetes 的最优方式。 在红帽系的Linux中我们使用yum来管理RPM包&#xff0c;类似的&#xff0c;在K8s中我们可以使用helm来管理资源对象&#xff08;Deployment、Service、Ingress…