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

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。

相关文章:

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.在弹出的选择配置文件中&#xf…...

知识图谱9:知识图谱的展示

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

leetcode 面试经典 150 题:验证回文串

链接验证回文串题序号125类型字符串解题方法双指针法难度简单 题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xf…...

【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 问题分析 竞态的描述不严格&#xf…...

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.设…...

仿iOS日历、飞书日历、Google日历的日模式

仿iOS日历、飞书日历、Google日历的日模式,24H内事件可自由上下拖动、自由拉伸。 以下是效果图: 具体实现比较简单,代码如下: import android.content.Context; import android.graphics.Canvas; import android.graphics.Color;…...

vuedraggable

官方文档:https://www.npmjs.com/package/vuedraggable 中文文档:http://www.itxst.com/vue-draggable/tutorial.html 案例下载地址: https://github.com/SortableJS/Vue.Draggable.git vuedraggablehttps://sortablejs.github.io/Vue.Dr…...

新手从事直播软件源码开发搭建经验与技巧

如果从YY或六间房的PC秀场直播间系统软件算起,直播软件已经在国内风云了至少10年了,站在用户角度提到直播系统大家基本都知道核心功能有开直播刷礼物等,那么如果站在直播软件源码开发搭建的技术角度去看呢?是不是要从需求调研分析…...

相机不动,机构动作----Hands Eyes

最近在研究 手眼标定,发现大家都需付费,搞啥子,说好的开源。。。 以相机在上固定不动,机械手为 EPSON_Robot 为例,详细的一步一步实例操作指引 EPSON_Robot 的192.168.0.1 2004 Server 详细操作步骤 1. 启动程序 运…...

Scala的导入

//导入 //(1) 创建包:在src上右键,新建软件包 //(2)填写包名:小写 //(3)在包上右键,创建类。自动加入包名 //(4)导入。import 包名.类名 //导入多个类 //import jh.yuanlixueyuan.bigdata.scala03.{A,B,C} //导入包下的所有的类 /…...

vue2中父子组件传值案例总结

在 Vue 2 中&#xff0c;父子组件之间的传值是通过 props 和事件来实现的。下面是详细的解释和总结&#xff1a; 1. 父组件向子组件传值 父组件可以通过 props 向子组件传递数据。以下是一个简单的示例&#xff1a; 父组件 (Parent.vue) <template><div><h1…...

功能篇:springboot中实现文件导出

### Spring Boot 中实现文件导出功能 #### 概述 在现代Web应用程序中&#xff0c;文件导出是一个常见的需求&#xff0c;允许用户将数据以特定格式&#xff08;如CSV、Excel、PDF等&#xff09;下载到本地。本文将详细介绍如何使用Spring Boot实现文件导出功能&#xff0c;并…...

Redis客户端(Jedis、RedisTemplate、Redisson)

1. 简介 Redis作为一个当下很火热的非关系型数据库&#xff0c;Java从业人员基本都离不开对Redis的使用。在Java程序中该数据库&#xff0c;需要借助于市面上的开源客户端&#xff0c;如Jedis、Spring Data Redis、Redisson&#xff0c;它们可以作为操作Redis非关系型数据库的桥…...

Mybatis中SQL的执行过程

文章目录 Mybatis 框架SQL执行过程数据库操作映射方式SQL的执行过程- SQL解析- SQL参数映射- SQL预编译- SQL执行- 结果映射- 事务处理- 缓存处理- 日志记录与监控 扩展#与$的区别- $ 符号- # 符号总结示例 Mybatis SQL分类- 动态 SQL- 静态 SQL静态SQL和动态SQL选择${}、#{}与…...

【数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;编写一个程序实现顺序栈的基本运算。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 初始化栈、销毁栈、判断栈是否为空、进栈、出栈、取…...