YOLOv10改进 | Conv篇 | 轻量级下采样方法ContextGuided(大幅度涨点)

 一、本文介绍

本文给大家带来的是改进机制是一种替换Conv的模块Context Guided Block (CG block) ,其是在CGNet论文中提出的一种模块,其基本原理是模拟人类视觉系统依赖上下文信息来理解场景。CG block 用于捕获局部特征、周围上下文和全局上下文,并将这些信息融合起来以提高准确性。(经过我检验分别在三种数据集上,大中小均进行了150轮次的实验,均有一定程度上的涨点,下面我选取了一种中等大小的数据集的结果进行了对比),同时本文的修改方法和之前的普通卷积模块也有所不同,大家需要注意看章节四进行修改。

适用检测目标:所有的目标检测均有一定的提点

推荐指数:⭐⭐⭐⭐⭐

  专栏回顾:YOLOv10改进系列专栏——本专栏持续复习各种顶会内容——科研必备 

目录

 一、本文介绍

二、ContextGuidedBlock_Down模块原理

2.1  ContextGuidedBlock_Down的基本原理

2.2  局部特征提取器

2.3  周围上下文提取器

2.4  联合特征提取器

2.5  全局上下文提取器

三、ContextGuided的核心代码

四、 手把手教你添加ContextGuided(注意看此处)

4.1 修改一

4.2 修改二 

4.3 修改三 

五、ContextGuided的yaml文件

<think>嗯,用户的问题是关于修改一段C代码,使得上电时r_down2的初始值也是35。当前的情况是r_down1的初始值是35,而r_down2是作为调整数值的寄存器,但用户希望r_down2的初始值同样设为35。现有的代码中,在函数K_Func4里,r_down2被递增,然后进行一些条件判断和赋值。 首先,我需要理解现有的代码逻辑。函数K_Func4中的操作是每次调用时r_down2自增1,然后检查是否超过50或低于25,如果是的话,就重置为25。然后将r_down设置为r_down2的值。而用户的问题是,上电时r_down2的初始值应该是35,但当前可能不是这样。 用户提到r_down1的初始值是35,这可能意味着r_down1已经被正确初始化了。而r_down2需要同样的初始化。所以,可能的解决方案是在程序启动时,将r_down2初始化为35,就像r_down1那样。这需要检查代码中r_down2的声明和初始化位置。 通常,在嵌入式系统中,全局变量或静态变量会在定义时被初始化。如果r_down2是一个全局变量,可能在代码的其他地方被初始化为某个默认值,比如0,或者没有显式初始化,导致其初始值不确定。因此,需要找到r_down2的定义位置,并显式地将其初始值设为35,例如:int r_down2 = 35;。这样,每次上电时,r_down2的初始值就是35,而不是之前的可能值。 另外,需要确认代码中是否其他地方在初始化过程中修改了r_down2的值。例如,在初始化函数中是否有对r_down2的赋值,这可能会覆盖之前的初始值。因此,需要确保在初始化流程中,r_down2没有被重新设置为其他数值。 还有一种可能是,r_down2是一个寄存器,需要通过特定的硬件初始化步骤来设置其初始值。如果是这种情况,可能需要查阅硬件文档,找到对应的寄存器地址,并在启动代码或初始化函数中写入35到该寄存器。 总结起来,步骤应该是: 1. 找到r_down2的定义位置,确保其初始值设置为35。 2. 检查是否有其他代码在初始化过程中修改了r_down2的值,如果有,需要调整。 3. 如果r_down2是硬件寄存器,需在适当的位置(如初始化函数)写入35。 需要用户确认r_down2是普通的全局变量还是映射到硬件的寄存器,以及是否有其他初始化代码影响其值。此外,确保在函数K_Func4执行前,r_down2已经被正确初始化为35,这样在第一次调用时,r_down2的值会是35,然后递增到36,之后根据条件调整。</think>要实现上电时寄存器 `r_down2` 的初始值为 35(与 `r_down1` 一致),需按以下步骤修改代码: --- ### **步骤 1:理解现有逻辑** - 原代码中 `r_down1` 初始为 35,但 `r_down2` 初始值未明确设定(可能默认为 0 或其他值)。 - 每次调用 `K_Func4` 时,`r_down2++` 自增,并通过条件 `if((r_down2>50)||(r_down2<25))` 将其限制在 25~50 范围内。 --- ### **步骤 2:修改初始化代码** #### 若 `r_down2` 是全局变量: ```c // 在全局变量定义处初始化 int r_down2 = 35; // 初始值设为 35 int r_down1 = 35; // 现有 r_down1 的初始化 ``` #### 若 `r_down2` 是硬件寄存器: 需在系统初始化函数(如 `SystemInit()`)中写入初始值: ```c void SystemInit(void) { r_down2 = 35; // 硬件寄存器初始化 // 其他初始化代码... } ``` --- ### **步骤 3:调整函数逻辑** 由于 `K_Func4` 中每次调用会执行 `r_down2++`,首次调用时值会变为 36。若需保持初始值为 35 **直到首次调用**,需修改逻辑: ```c void K_Func4(void) { static bool first_call = true; // 静态变量标记首次调用 if (first_call) { r_down2 = 35; // 强制初始化 first_call = false; } else { r_down2++; } r_f41 = 0; r_downT = 0; if ((r_down2 > 50) || (r_down2 < 25)) { r_down2 = 25; } r_down = r_down2; } ``` --- ### **关键修改总结** 1. **显式初始化**:确保 `r_down2` 定义时初始值为 35。 2. **首次调用保护**:通过静态变量避免首次调用时的自增操作。 3. **硬件寄存器处理**:若为硬件映射寄存器,需在系统初始化阶段写入初始值。 --- ### **验证方法** 1. 上电后立即读取 `r_down2` 的值,确认是否为 35。 2. 调用 `K_Func4` 后检查 `r_down2` 是否按预期自增或重置。 通过以上修改,可确保 `r_down2` 的初始值与 `r_down1` 一致为 35,同时保持原有逻辑功能不变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Snu77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值