YoloV8分割改进策略:下采样改进|HWD改进下采样

本文介绍了在YoloV8分割任务中,通过引入基于Haar小波的下采样(HWD)模块来改进下采样操作,以保留更多空间信息并提高分割性能。HWD模块可以轻易集成到现有CNN架构,减少信息丢失,增强语义分割的准确性。实验证明,这种改进方法在多个数据集上提升了分割性能,且不显著增加计算开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要

本文使用HWD改进下采样,在YoloV8分割测试中实现涨点。改进简单容易理解,推荐大家使用!

论文解读

在卷积神经网络(CNNs)中,极大池化或跨行卷积等下采样操作被广泛用于聚合局部特征、扩大感受野和最小化计算开销。然而,对于语义分割任务,在局部邻域上汇集特征可能会导致重要空间信息的丢失,这对于逐像素预测至关重要。为了解决这个问题,作者引入了一个简单而有效的下采样操作,称为基于Haar小波的下采样(HWD)模块。该模块可以很容易地集成到CNN中,以增强语义分割模型的性能。HWD的核心思想是利用Haar小波变换降低特征图的空间分辨率,同时尽可能多地保留信息。所提出的HWD模块能够(1)有效地提高不同CNN架构下不同模态图像数据集的分割性能;(2)与传统下采样方法相比,可以有效降低信息的不确定性。
亮点:

• 为卷积神经网络(CNNs)提出了一种新颖的基于小波的下采样模块(HWD)。首次尝试探索在深度卷积神经网络(DCNNs)的下采样阶段禁止(或阻碍)信息丢失的可行性,以改善语义分割任务的性能。

• 探索了卷积神经网络中信息不确定性的度量方法,并提出了一种新的指标,即特征熵指数(FEI),用于评估下采样特征图与预测结果之间的信息不确定性或特征重要性。

• 提出的HWD模块可以直接替换跨行卷积或池化层,而不会显著增加计算开销,并且可以轻松地集成到当前的分割架构中。与七种最先进的分割方法相比,综合实验证明了HWD模块的有效性。

在这里插入图片描述

过大量的实验证明,本研究提出的下采样新方法可以轻松的整合到目前主流的深度学习语义分割模型中,在多个公开及私有数据集中都获得分割性能的显著提升,且整体计算效率没有显著区别。此外,对采样后的特征图质量进行独立评估表明,相对于传统的下采样操作,本研究提出的无损下采样技术在分割模型中保留了目标物体的更多的上下文信息,从而间接证明了下采样操作中最大限度保留特征信息对于深度学习语义分割任务的重要性。

在这里插入图片描述

YoloV8官方结果

YOLOv8m-seg summary (fused): 245 layers, 27225858 parameters, 0 gradients, 110.0 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95)     Mask(P          R      mAP50  mAP50-95): 100%|██████████| 164/164 [00:25<00:00,  6.36it/s]
                   all       2621      11379      0.245      0.236      0.178     0.0922      0.244      0.216      0.165     0.0749
                person       2621       8517      0.483      0.508      0.483      0.263      0.478      0.473      0.443      0.202
                   car       2621       1547      0.275      0.281      0.227      0.115      0.275      0.254      0.209     0.0937
                   cup       2621        728      0.256     0.0728     0.0596      0.033       0.25     0.0632     0.0569     0.0319
               bicycle       2621        260     0.0659     0.0117     0.0121    0.00472     0.0718     0.0115    0.00947     0.0036
                   dog       2621        167      0.191      0.177     0.0954     0.0482      0.179      0.137     0.0811     0.0371
                   cat       2621        160      0.202      0.369      0.188     0.0888      0.212      0.356       0.19     0.0817
Speed: 0.1ms preprocess, 3.0ms inference, 0.0ms loss, 1.0ms postprocess per image

改进方法

安装pytorch_wavelets,执行命令:

pip install pytorch_wavelets -i https://pypi.tuna.tsinghua.edu.cn/simple

安装

pip install pywavelets -i https://pypi.tuna.tsinghua.edu.cn/simple    

修改lowlevel.py,路径如下图:
在这里插入图片描述
如果找不到也不用担心,训练的时候回报错,根据报错的信息也能找到。
修改lowlevel.py的sfb1d函数,在250左右,如下图:
在这里插入图片描述
代码如下:

    g0 = torch.as_tensor(torch.cat([g0]*C,dim=0),dtype=lo.dtype)
    g1 = torch.as_tensor(torch.cat([g1]*C,dim=0),dtype=lo.dtype)

g0和g1的类型和lo的类型保持一致。否则,无法使用半精度混合训练。

如果这样不行,则需要下载pytorch_wavelets,在pytorch_wavelets源码中修改后,编译安装。
github链接:https://github.com/fbcotter/pytorch_wavelets,下载后,解压,找到lowlevel.py,如下图:
在这里插入图片描述
修改方法同上。

在block.py中加入HWD模块,如下图:

在这里插入图片描述
代码:

from pytorch_wavelets import DWTForward

class HWD(nn.Module):
    def __init__(self, in_ch, out_ch):
        super(HWD, self).__init__()
        self.wt = DWTForward(J=1, mode='zero', wave='haar')
        self.conv_bn_relu = nn.Sequential(
            nn.Conv2d(in_ch * 4, out_ch, kernel_size=1, stride=1),
            nn.BatchNorm2d(out_ch),
            nn.ReLU(inplace=True),
        )

    def forward(self, x):
        yL, yH = self.wt(x)
        y_HL = yH[0][:, :, 0, ::]
        y_LH = yH[0][:, :, 1, ::]
        y_HH = yH[0][:, :, 2, ::]
        x = torch.cat([yL, y_HL, y_LH, y_HH], dim=1)
        x = self.conv_bn_relu(x)
        return x

在__init__.py中导入HWD,如下图:
在这里插入图片描述
在这里插入图片描述
在task.py中导入HWD模块,如下图:
在这里插入图片描述
在task.py的parse_model函数中,加入HWD模块,如下图:
在这里插入图片描述
代码:

        elif m is HWD:
            args = [ch[f], int(min(*args, max_channels) * width)]
            print(args)
            c2 = args[1]

修改ultralytics/cfg/models/v8/yolov8-seg.yaml配置文件,代码如下:


# YOLOv8.0n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 3, C2f, [128, True]]
  - [-1, 1, HWD, [256]] # 3-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, HWD, [512]] # 5-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, HWD, [1024]] # 7-P5/32
  - [-1, 3, C2f, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 3, C2f, [512]] # 12

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 3, C2f, [256]] # 15 (P3/8-small)

  - [-1, 1, HWD, [256]]
  - [[-1, 12], 1, Concat, [1]] # cat head P4
  - [-1, 3, C2f, [512]] # 18 (P4/16-medium)

  - [-1, 1, HWD, [512]]
  - [[-1, 9], 1, Concat, [1]] # cat head P5
  - [-1, 3, C2f, [1024]] # 21 (P5/32-large)

  - [[15, 18, 21], 1, Segment, [nc, 32, 256]] # Segment(P3, P4, P5)

在项目的根目录添加train.py脚本,代码如下:

from ultralytics import YOLO
import os

if __name__ == '__main__':
    # 加载模型
    model = YOLO(model="ultralytics/cfg/models/v8/yolov8m-seg.yaml") # 从头开始构建新模型
    print(model)

    # Use the model
    results = model.train(data="seg.yaml", epochs=200, device='0', batch=8, seed=42)  # 训练模

训练完成后,就可以看到测试结果!

在项目的根目录添加val.py脚本,代码如下:


from ultralytics import YOLO


if __name__ == '__main__':
    # Load a model
    model = YOLO('runs/segment/train7/weights/best.pt')  # load a custom model
    print(model)

    # Validate the model
    metrics = model.val(split='val')  # no arguments needed, dataset and settings remembered

split='val’代表使用验证集做测试,如果改为split=‘test’,则使用测试集做测试!

在项目的根目录添加test.py脚本,代码如下:

from ultralytics import YOLO


if __name__ == '__main__':
    # Load a model
    # model = YOLO('yolov8m.pt')  # load an official model
    model = YOLO('runs/segment/train6/weights/best.pt')  # load a custom model
    results = model.predict(source="ultralytics/assets", device='0',show=True,save=True,save_txt=True,save_conf=True)  # predict on an image
    print(results)

test脚本测试assets文件夹下面的图片,save设置为true,则保存图片的测试结果!
在这里插入图片描述

测试结果

YOLOv8m-seg summary (fused): 257 layers, 25661442 parameters, 0 gradients, 106.7 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95)     Mask(P          R      mAP50  mAP50-95): 100%|██████████| 164/164 [00:24<00:00,  6.58it/s]
                   all       2621      11379      0.328      0.225        0.2      0.106      0.273      0.233      0.183     0.0872
                person       2621       8517      0.574      0.484      0.496      0.275      0.489      0.489      0.462      0.219
                   car       2621       1547      0.461      0.234      0.235       0.12      0.368      0.243      0.216     0.0957
                   cup       2621        728       0.25     0.0879     0.0644     0.0355      0.209     0.0934      0.065     0.0338
               bicycle       2621        260     0.0682     0.0154    0.00983    0.00392     0.0816     0.0253    0.00588    0.00147
                   dog       2621        167      0.275       0.21      0.156     0.0836      0.211      0.228      0.149      0.075
                   cat       2621        160      0.342      0.319      0.239      0.116       0.28      0.319      0.201     0.0986
Speed: 0.1ms preprocess, 3.1ms inference, 0.0ms loss, 0.9ms postprocess per image

总结

将下采样改为HWD后,涨点明显。欢迎大家在自己的数据集上做尝试!


### YOLOv8 改进卷积模块的方法及实现技巧 #### 背景介绍 YOLOv8 是一种高效的实时目标检测算法,其性能依赖于卷积神经网络的设计。为了进一步提升模型效率和精度,可以通过优化卷积模块来减少计算量并提高特征提取能力。 --- #### 方法一:采用 Ghost 卷积轻量化模块 Ghost 卷积是一种轻量化的卷积设计方法,通过线性变换生成更多的特征图而不增加额外的计算开销[^1]。具体来说: - **核心思想** Ghost 卷积利用一组基础特征图经过简单的线性变换生成更多特征图,从而显著降低参数数量和计算复杂度。 - **实现方式** 在 YOLOv8 中引入 Ghost 卷积可以替换原有的标准卷积层。以下是其实现代码示例: ```python import torch.nn as nn class GhostConv(nn.Module): def __init__(self, inp, oup, kernel_size=1, ratio=2, dw_size=3, stride=1, relu=True): super(GhostConv, self).__init__() self.oup = oup init_channels = int(oup // ratio) new_channels = init_channels * (ratio - 1) self.primary_conv = nn.Sequential( nn.Conv2d(inp, init_channels, kernel_size, stride, kernel_size//2, bias=False), nn.BatchNorm2d(init_channels), nn.ReLU(inplace=True) if relu else nn.Identity(), ) self.cheap_operation = nn.Sequential( nn.Conv2d(init_channels, new_channels, dw_size, 1, dw_size//2, groups=init_channels, bias=False), nn.BatchNorm2d(new_channels), nn.ReLU(inplace=True) if relu else nn.Identity(), ) def forward(self, x): x1 = self.primary_conv(x) x2 = self.cheap_operation(x1) out = torch.cat([x1, x2], dim=1) return out[:, :self.oup, :, :] ``` 上述代码定义了一个 Ghost 卷积模块,其中 `ratio` 控制生成特征图的比例,`dw_size` 定义深度可分离卷积核大小。 --- #### 方法二:集成 ScConv 模块 ScConv(Squeeze and Convolutions Convolution)是一种增强局部感受野的卷积结构,能够有效捕捉多尺度上下文信息[^2]。将其应用于 YOLOv8 的骨干网络中可以改善特征表达能力。 - **操作流程** 需要在项目目录下创建一个新的 ADD 文件夹,并在该文件夹中保存自定义的 `yolov8-ScConv.yaml` 模型配置文件。随后修改训练脚本以加载此配置文件。 - **代码实现** 下面是一个简化版的 ScConv 实现代码片段: ```python import torch.nn.functional as F from torch import nn class ScConv(nn.Module): def __init__(self, in_planes, planes, pool_size=4, norm_layer=None): super(ScConv, self).__init__() self.pool_size = pool_size mid_planes = max(in_planes // 16, 16) self.gap_fc = nn.Linear(pool_size*pool_size, mid_planes, bias=False) self.attention_fc = nn.Linear(mid_planes, pool_size*pool_size, bias=False) self.conv = nn.Conv2d(in_planes, planes, kernel_size=1, padding=0, bias=False) self.bn = norm_layer(planes) if norm_layer is not None else nn.BatchNorm2d(planes) def forward(self, x): batch_size = x.size(0) pooling_space = F.adaptive_avg_pool2d(x, output_size=(self.pool_size, self.pool_size)).view(batch_size, -1) gap_out = self.gap_fc(pooling_space).relu() attention_weight = self.attention_fc(gap_out).sigmoid().view(batch_size, 1, self.pool_size, self.pool_size) weighted_x = x.mul(F.interpolate(attention_weight, size=x.shape[-2:], mode='bilinear', align_corners=True)) out = self.bn(self.conv(weighted_x)) return out.relu_() ``` 这段代码实现了 ScConv 的基本功能,包括全局平均池化、注意力机制以及最终的卷积运算。 --- #### 注意事项 - 替换原有卷积模块时需注意保持输入输出通道数一致,以免破坏整体架构。 - 自定义模块应充分测试其收敛性和泛化能力,必要时调整超参数设置。 - 修改后的模型需要重新训练或微调权重才能达到最佳效果。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI智韵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值