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的代码,可以形成如下颈部网络示意图:
通过上图,可以将颈部网络划分为如下几个部分:
- 对接
需要从骨干网四个阶段输出,依此承接,参照上图左侧虚线部分,详情见上节都骨干网的分析。 - 通道统一
通过四个残注层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。
相关文章:

PaddleOCR模型ch_PP-OCRv3文本检测模型研究(二)颈部网络
上节研究了PaddleOCR文本检测v3模型的骨干网,本文接着研究其颈部网络。 文章目录 研究起点残注层颈部网络代码实验小结 研究起点 摘取开源yml配置文件,摘取网络架构Architecture中颈部网络的配置如下 Neck:name: RSEFPNout_channels: 96shortcut: True可…...

360极速浏览器不支持看PDF
360安全浏览器采用的是基于IE内核和Chrome内核的双核浏览器。360极速浏览器是源自Chromium开源项目的浏览器,不但完美融合了IE内核引擎,而且实现了双核引擎的无缝切换。因此在速度上,360极速浏览器的极速体验感更佳。 展示自己的时候要在有优…...

【深度学习】深刻理解ViT
ViT(Vision Transformer)是谷歌研究团队于2020年提出的一种新型图像识别模型,首次将Transformer架构成功应用于计算机视觉任务中。Transformer最初应用于自然语言处理(如BERT和GPT),而ViT展示了其在视觉任务…...
解决vue2中更新列表数据,页面dom没有重新渲染的问题
在 Vue 2 中,直接修改数组的某个项可能不会触发视图的更新。这是因为 Vue 不能检测到数组的索引变化或对象属性的直接赋值。为了确保 Vue 能够正确地响应数据变化,你可以使用以下几种方法: 1. 使用 Vue.set() 使用 Vue.set() 方法可以确保 …...

vscode通过ssh连接远程服务器(实习心得)
一、连接ssh服务器 1.打开Visual Studio Code,进入拓展市场(CtrlShiftX),下载拓展Remote - SSH 2. 点击远程资源管理器选项卡,并选择远程(隧道/SSH)类别 3. 点击ssh配置:输入你的账号主机ip地址 4.在弹出的选择配置文件中…...

知识图谱9:知识图谱的展示
1、知识图谱的展示有很多工具 Neo4j Browser - - - - 浏览器版本 Neo4j Desktop - - - - 桌面版本 graphX - - - - 可以集成到Neo4j Desktop Neo4j 提供的 Neo4j Bloom 是用户友好的可视化工具,适合非技术用户直观地浏览图数据。Cypher 是其核心查询语言&#x…...

leetcode 面试经典 150 题:验证回文串
链接验证回文串题序号125类型字符串解题方法双指针法难度简单 题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s…...
【0363】Postgres内核 从 XLogReaderState readBuf 解析 XLOG Record( 8 )
上一篇: 【0362】Postgres内核 XLogReaderState readBuf 有完整 XLOG page header 信息 ? ( 7 ) 直接相关: 【0341】Postgres内核 读取单个 xlog page (2 - 2 ) 文章目录 1. readBuf 获取 page header 大小1.1 XLOG record 跨 page ?1.2 获取 XLOG Record 的 长度(xl…...
docker tdengine windows快速体验
#拉取镜像 docker pull tdengine/tdengine:2.6.0.34#容器运行 docker run -d --name td2.6 --restartalways -p 6030:6030 -p 6041:6041 -p 6043:6043 -p 6044-6049:6044-6049 -p 6044-6045:6044-6045/udp -p 6060:6060 tdengine/tdengine:2.6.0.34#容器数据持久化到本地 #/va…...

详解RabbitMQ在Ubuntu上的安装
目录 Ubuntu 环境安装 安装Erlang 查看Erlang版本 退出命令 编辑安装RabbitMQ 确认安装结果 安装RabbitMQ管理界面 启动服务 查看服务状态 通过IP:port访问 添加管理员用户 给用户添加权限 再次访问 Ubuntu 环境安装 安装Erlang RabbitMq需要…...

Python的3D可视化库【vedo】2-2 (plotter模块) 访问绘制器信息、操作渲染器
文章目录 4 Plotter类的方法4.1 访问Plotter信息4.1.1 实例信息4.1.2 演员对象列表 4.2 渲染器操作4.2.1 选择渲染器4.2.2 更新渲染场景 4.3 控制渲染效果4.3.1 渲染窗格的背景色4.3.2 深度剥离效果4.3.3 隐藏线框的线条4.3.4 改为平行投影模式4.3.5 添加阴影4.3.6 环境光遮蔽4…...
【vue2】文本自动省略组件,支持单行和多行省略,超出显示tooltip
代码见文末 vue3实现 最开始就用的vue3实现,如下 Vue3实现方式 vue2开发和使用文档 组件功能 TooltipText 是一个文字展示组件,具有以下功能: 文本显示:支持单行和多行文本显示。自动判断溢出:判断文本是否溢出…...
网络安全产品之认识防病毒软件
随着计算机技术的不断发展,防病毒软件已成为企业和个人计算机系统中不可或缺的一部分。防病毒软件是网络安全产品中的一种,主要用于检测、清除计算机病毒,以及预防病毒的传播。本文我们一起来认识一下防病毒软件。 一、什么是计算机病毒 计算…...

游戏引擎学习第42天
仓库: https://gitee.com/mrxiao_com/2d_game 简介 目前我们正在研究的内容是如何构建一个基本的游戏引擎。我们将深入了解游戏开发的每一个环节,从最基础的技术实现到高级的游戏编程。 角色移动代码 我们主要讨论的是角色的移动代码。我一直希望能够使用一些基…...
区块链智能合约( solidity) 安全编程
引言:本文由天玄链开源开发者提供,欢迎报名公益天玄链训练营 https://blockchain.163.com/trainingCamp 一、重入和竞态 重入和竞态在solidity 编程安全中会多次提及,历史上也造成了重大的损失。 1.1 问题分析 竞态的描述不严格…...

GUNS搭建
一、准备工作 源码下载: 链接: https://pan.baidu.com/s/1bJZzAzGJRt-NxtIQ82KlBw 提取码: criq 官方文档 二、导入代码 1、导入后端IDE 导入完成需要,需要修改yml文件中的数据库配置,改成自己的。 2、导入前端IDE 我是用npm安装的yarn npm…...
【ETCD】【源码阅读】stepWithWaitOption方法解析
在分布式系统中,ETCD 作为一个强一致性、高可用的 key-value 存储系统,广泛应用于服务发现、配置管理等场景。ETCD 在内部采用了 Raft 协议来保证集群的一致性,而日志预提案(log proposal)是 Raft 协议中至关重要的一部…...
redis 怎么样查看list
在 Redis 中,可以通过以下方法查看列表的内容或属性: 1. 查看列表中的所有元素 使用 LRANGE 命令: LRANGE key start endkey 是列表的名称。start 是起始索引,0 表示第一个元素。end 是结束索引,-1 表示最后一个元素…...
E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
我们在使用Ubuntu系统时经常性使用sudo apt install命令安装所需要的软件库,偶尔会出现如下问题: E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其…...

创建型设计模式
一、设计模式介绍 1.设计模式是什么 设计模式是指在软件开发中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案; 2.设计模式怎么来的? 满足设计原则后,慢慢迭代出来的。 3.设…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...