YOLOv8模型改进 第二十九讲 添加可学习小波变换节点 Learnable Wavelet Transform Node 提高小目标检测能力,增强细节特征

        在图像去模糊领域,多尺度架构虽被广泛应用,但存在固有缺陷。在渐进恢复过程中,由于底层空间分辨率小,向上传递的特征语义精确但空间模糊,导致多尺度网络在空间细节恢复能力上受限。为提升高频细节部分的恢复质量,引入频率域变换成为一种思路。离散小波变换(DWT)因在处理突变信号图像及利用现实模糊轨迹连续性方面具有优势,被考虑应用于算法中。为使 2D - DWT 更贴合数据分布和特征层空间,作者设计了 LWN,通过可学习的方式增强算法对细节信息的恢复能力。

YOLOv8原模型
改进后的

1. 可学习小波变换节点LWN介绍 

        小波变换可将信号分解为高频和低频分量,分解出代表细节的高频部分和反映大致轮廓的低频部分,让我们能从不同频率角度分析信号。

        LWN 围绕小波卷积构建。先通过小波卷积层将输入特征图投影到小波域,接着分离小波域分量,用深度卷积提取变换特征,再经 1×1 卷积扩展缩放通道,最后经小波逆变换将特征图还原到空间域输出。

 2. 接下来,我们将详细介绍如何将LWN合集成到 YOLOv8 模型中        

这是我的GitHub代码:tgf123/YOLOv8_improve (github.com)

这是改进讲解:YOLOv8模型改进 第二十九讲 添加可学习小波变换节点 Learnable Wavelet Transform Node 提高小目标检测能力,增强细节特征_哔哩哔哩_bilibili

2.1  如何添加

        1. 首先,在我上传的代码中yolov8_improve中找到LWN.py代码部分,它包含两个部分一个是LWN.py的核心代码,一个是yolov8模型的配置文件。 

​​​​​       

        2. 然后我们在ultralytics文件夹下面创建一个新的文件夹,名字叫做change_models, 然后再这个文件夹下面创建LWN.py文件,然后将LWN的核心代码放入其中

    3. 在 task.py文件中导入C2f_LWN

     4. 然后将C2f_LWN添加到下面当中

        5. 最后将配置文件复制到下面文件夹下

        6. 运行代码跑通 

from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld

if __name__=="__main__":

    # 使用自己的YOLOv8.yamy文件搭建模型并加载预训练权重训练模型
    model = YOLO(r"D:\model\yolov8\ultralytics\cfg\models\v8\yolov8_LWN.yaml")\
        .load(r'D:\model\yolov8\yolov8n.pt')  # build from YAML and transfer weights

    results = model.train(data=r'D:\model\yolov8\ultralytics\cfg\datasets\VOC_my.yaml',
                          epochs=300,
                          imgsz=640,
                          batch=32,
                          # cache = False,
                          # single_cls = False,  # 是否是单类别检测
                          # workers = 0,
                         # resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',
                          amp = False
                          )

Pbds全称为Perfectly Balanced Red-Black Tree,是一种平衡查找树的数据结构,它是C++标准库中的`<ext/pb_ds/rb_tree>`模块提供的一种高级模板容器,主要用于高效地存储和查找数据。它是在红黑树基础上进行了优化,保证了常数级的平均时间复杂度。 **特点:** 1. **自平衡**:插入、删除操作后的调整过程保证了树的高度最大为log(n),这使得查询操作的时间复杂度保持在O(log n)。 2. **内存效率高**:支持迭代器,可以像普通的数组或vector一样访问元素。 3. **模板化**:适用于各种数据类型,并支持自定义比较函数。 **实践示例(C++17开始引入std::any,旧版本需第三方库如Boost):** ```cpp #include <ext/pb_ds/tree_policy.hpp> // 引入PBDS策略 using namespace __gnu_pbds; // 使用namespace // 定义一个关联值类型的树模板,键为int,值为std::string template <typename K, typename V> using rb_tree = tree<K, null_type, less<K>, rb_tree_tag, tree_order_statistics_node_update>; int main() { // 创建一个rb_tree实例 rb_tree<int, std::string> myTree; // 插入元素 myTree.insert({5, "Hello"}); myTree.insert({10, "World"}); // 查找最小值 auto it = myTree.begin(); if (it != myTree.end()) { std::cout << "Smallest key is " << *it.first << " with value " << it->second << '\n'; } // 计算第3大的值 auto third_largest = myTree.order_of_key(3); // 获取值为3之前的所有节点个数 if (third_largest > 0) { it = myTree.lower_bound(third_largest); if (it != myTree.end()) { std::cout << "Third largest key is " << *it.first << " with value " << it->second << '\n'; } } return 0; } ``` **相关问题--:** 1. Pbds的红黑树相比标准的红黑树有哪些优势? 2. 如何使用Pbds的rb_tree进行范围查找? 3. 在实际项目中,何时会选择使用Pbds而不是普通的二叉搜索树?
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值