首页 > 其他分享 >【YOLOv8改进 - 特征融合NECK】SDI:多层次特征融合模块,替换contact操作

【YOLOv8改进 - 特征融合NECK】SDI:多层次特征融合模块,替换contact操作

时间:2024-07-18 17:29:17浏览次数:18  
标签:NECK target nn 特征 融合 YOLOv8 模块 SDI size

YOLOv8目标检测创新改进与实战案例专栏

专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLOv8基础解析+创新改进+实战案例

介绍

image-20240717154057072

摘要

在本文中,我们介绍了U-Net v2,一种用于医学图像分割的新型、稳健且高效的U-Net变体。它旨在增强语义信息在低级特征中的注入,同时精细化高级特征的细节。对于输入图像,我们首先通过深度神经网络编码器提取多层次特征。接下来,我们通过从高级特征中注入语义信息,并通过Hadamard积整合来自低级特征的更精细细节,来增强每一层的特征图。我们新颖的跳跃连接使所有层次的特征都具备丰富的语义特征和复杂的细节。改进后的特征随后被传递到解码器进行进一步处理和分割。我们的方法可以无缝集成到任何编码器-解码器网络中。我们在多个公开的医学图像分割数据集上评估了我们的方法,包括皮肤病变分割和息肉分割,实验结果表明,我们的新方法在保持内存和计算效率的同时,在分割准确性上优于最先进的方法。代码可在:https://github.com/yaoppeng/U-Net v2 获取。

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

SDI(Semantics and Detail Infusion)模块是U-Net v2架构中的核心组件,旨在提高医疗图像分割的效果。以下是SDI模块的详细介绍:

SDI模块的概念

SDI模块的主要目的是将高层特征中的语义信息与低层特征中的细节信息相结合,从而增强各级特征图的表示能力。这一模块通过简单高效的跳跃连接实现这一点,使得网络能够更好地捕捉图像的语义信息和细节信息。

SDI模块的结构

1. 空间和通道注意力机制

首先,SDI模块对编码器生成的每一级特征图应用空间和通道注意力机制。这一步骤使特征图能够整合局部的空间信息和全局的通道信息,公式如下:

f 1 i = ϕ c i ( ϕ s i ( f 0 i ) ) f1_i = \phi_{c_i}(\phi_{s_i}(f0_i)) f1i​=ϕci​​(ϕsi​​(f0i​))

其中, f 0 i f0_i f0i​表示第 i i i级的原始特征图, ϕ s i \phi_{s_i} ϕsi​​和 ϕ c i \phi_{c_i} ϕci​​分别表示空间和通道注意力机制的参数, f 1 i f1_i f1i​是处理后的特征图。

2. 特征图的通道数减少

接下来,通过1×1卷积将 f 1 i f1_i f1i​的通道数减少到一个超参数 c c c,得到新的特征图 f 2 i f2_i f2i​。

3. 特征图的调整

为了将特征图传送到解码器,SDI模块将每一级的特征图调整为相同的分辨率。调整后的特征图表示为 f 3 i j f3_{ij} f3ij​,其中 i i i表示目标级别, j j j表示特征图的来源级别。调整操作包括:

  • 对于 j < i j<i j<i的情况,使用自适应平均池化调整尺寸。
  • 对于 j = i j=i j=i的情况,使用恒等映射。
  • 对于 j > i j>i j>i的情况,使用双线性插值调整尺寸。
4. 特征图的平滑

调整尺寸后的特征图通过3×3卷积进行平滑,表示为 f 4 i j f4_{ij} f4ij​。

5. 哈达玛积

最后,使用哈达玛积将所有调整后的特征图融合在一起,增强每一级特征图的语义信息和细节信息,得到 f 5 i f5_i f5i​。

SDI模块的优势

  1. 语义和细节的融合:SDI模块通过将高层特征的语义信息与低层特征的细节信息相结合,增强了每一级特征图的表示能力。
  2. 简洁高效的跳跃连接:相较于传统的特征图拼接方式,SDI模块的跳跃连接更为简单高效,减少了计算复杂度和GPU内存使用。
  3. 提升分割精度:通过实验验证,SDI模块显著提升了U-Net v2在多种医疗图像分割任务中的精度。

核心代码

class SDI(nn.Module):
    def __init__(self, channel):
        super().__init__()
        
        # 创建一个包含4个卷积层的模块列表,每个卷积层的输入和输出通道数都为channel,卷积核大小为3x3,步长为1,填充为1
        self.convs = nn.ModuleList(
            [nn.Conv2d(channel, channel, kernel_size=3, stride=1, padding=1) for _ in range(4)])

    def forward(self, xs, anchor):
        # 创建一个与anchor形状相同的全1张量
        ans = torch.ones_like(anchor)
        target_size = anchor.shape[-1]  # 获取anchor的最后一个维度大小,即目标大小

        for i, x in enumerate(xs):
            # 如果当前张量x的最后一个维度大于目标大小,使用自适应平均池化将其调整为目标大小
            if x.shape[-1] > target_size:
                x = F.adaptive_avg_pool2d(x, (target_size, target_size))
            # 如果当前张量x的最后一个维度小于目标大小,使用双线性插值将其调整为目标大小
            elif x.shape[-1] < target_size:
                x = F.interpolate(x, size=(target_size, target_size),
                                  mode='bilinear', align_corners=True)
            
            # 将调整大小后的张量x经过对应的卷积层,并将结果与ans相乘
            ans = ans * self.convs[i](x)

        return ans  # 返回最终结果

下载YoloV8代码

直接下载

GitHub地址

image-20240116225427653

Git Clone

git clone https://github.com/ultralytics/ultralytics

安装环境

进入代码根目录并安装依赖。

image-20240116230741813

image-20240116230741813

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

在最新版本中,官方已经废弃了requirements.txt文件,转而将所有必要的代码和依赖整合进了ultralytics包中。因此,用户只需安装这个单一的ultralytics库,就能获得所需的全部功能和环境依赖。

pip install ultralytics

引入代码

在根目录下的ultralytics/nn/目录,新建一个 featureFusion目录,然后新建一个以 SDI为文件名的py文件, 把代码拷贝进去。

SDI无法直接在YOLOv8中修改,需要进行修改:

  • 通道数适配: 允许不同卷积层处理不同数量的输入通道,适应多尺度特征融合的需求。
  • 目标大小基准: 以第一个输入张量的高度和宽度作为目标大小,适应YOLOv8的特征图尺寸对齐需求。
  • 调整大小条件:基于高度和宽度进行调整,以确保特征图在多尺度融合时的一致性。
  1. 卷积层的通道数适配

    • 原始代码:
      self.convs = nn.ModuleList([nn.Conv2d(channel, channel, kernel_size=3, stride=1, padding=1) for _ in range(4)])
      
      每个卷积层的输入和输出通道数都相同。
    • 修改后的代码:
      self.convs = nn.ModuleList([nn.Conv2d(channel, channels[0], kernel_size=3, stride=1, padding=1) for channel in channels])
      
      每个卷积层的输入通道数由channels列表中的值指定,输出通道数为channels[0]。这一修改允许每个卷积层处理不同数量的输入通道,这在融合不同层次特征时更灵活,特别是对于YOLOv8这种多尺度特征融合的检测网络。
  2. 目标大小的获取和处理

    • 原始代码:
      target_size = anchor.shape[-1]
      
      使用的是anchor的最后一个维度大小作为目标大小。
    • 修改后的代码:
      target_size = xs[0].shape[2:]
      
      使用的是第一个输入张量的高度和宽度维度作为目标大小。
  3. 调整大小的条件判断

    • 原始代码:
      if x.shape[-1] > target_size:
          x = F.adaptive_avg_pool2d(x, (target_size, target_size))
      elif x.shape[-1] < target_size:
          x = F.interpolate(x, size=(target_size, target_size), mode='bilinear', align_corners=True)
      
      基于最后一个维度进行判断和调整。
    • 修改后的代码:
      if x.shape[-1] > target_size[-1]:
          x = F.adaptive_avg_pool2d(x, (target_size[0], target_size[1]))
      elif x.shape[-1] < target_size[-1]:
          x = F.interpolate(x, size=(target_size[0], target_size[1]), mode='bilinear', align_corners=True)
      
      基于最后两个维度(高度和宽度)进行判断和调整。这更适合YOLOv8的多尺度特征融合需求,因为YOLOv8需要在不同分辨率之间进行特征对齐和融合。
import torch
import torch.nn as nn
import torch.nn.functional as F


class SDI(nn.Module):
    def __init__(self, channels):
        super().__init__()
 
        self.convs = nn.ModuleList([nn.Conv2d(channel, channels[0], kernel_size=3, stride=1, padding=1) for channel in channels])
 
 
    def forward(self, xs):
        ans = torch.ones_like(xs[0])
        target_size = xs[0].shape[2:]
        for i, x in enumerate(xs):
            if x.shape[-1] > target_size[-1]:
                x = F.adaptive_avg_pool2d(x, (target_size[0], target_size[1]))
            elif x.shape[-1] < target_size[-1]:
                x = F.interpolate(x, size=(target_size[0], target_size[1]),
                                      mode='bilinear', align_corners=True)
            ans = ans * self.convs[i](x)
        return ans
    
    
 

注册

ultralytics/nn/tasks.py中进行如下操作:

步骤1:

from ultralytics.nn.featureFusion.SDI import SDI

步骤2

修改def parse_model(d, ch, verbose=True):

        elif m is SDI:
            args = [[ch[x] for x in f]]

image-20240717160404939

配置yolov8_SDI.yaml

ultralytics/cfg/models/v8/yolov8_SDI.yaml

# Ultralytics YOLO 

标签:NECK,target,nn,特征,融合,YOLOv8,模块,SDI,size
From: https://blog.csdn.net/shangyanaf/article/details/140498153

相关文章

  • 云边端融合创新,构建产业新发展!
    7月10日至11日,2024算力互联网大会(重庆)明月湖·π全球创新大会在重庆举办。大会以“算力互联普惠化赋能新质生产力”为主题,围绕算力互联互通、算力互联网发展与实践,聚焦全球科技创新热点话题,探讨科技创新未来发展趋势及全国一体化算力体系建设。 天翼云科技有限公司西南中心资......
  • Datawhale AI夏令营第二期——机器学习 基于神经网络stack融合策略的多模型融合
    #AI夏令营#Datawhale夏令营基于神经网络stack融合策略的多模型融合改进点:1.数据清洗,异常值替换(板块2)2.基于神经网络的stack模型融合(板块5)根据大佬的提示对Task3所做的改进,大佬链接:http://t.csdnimg.cn/RSC3o1.模型导入导入所需要包:importpandasaspdimportnumpy......
  • 使用预训练模型(yolov8、MobileNetV2、ResNet50)与Gradio构建图像目标检测Web应用
    简介:  利用gradio设计一个web运用,实现图片主体物的识别。  1)用户可以通过网页提交一张图片。  2)web应用将输出这张图片中主体物的名称(中英文都可以)。  3)可以使用预训练的模型。利用预训练实现对物体识别准备工作在开始之前,请确保你的环境中已安装了以下依赖......
  • 电商设计与AI技术的融合:美间的创新之路
    近年来,随着电商行业的飞速发展,商家们纷纷寻找新的方式来提高竞争力,降低成本,提高效率。在这一背景下,群核科技推出的美间·AI创意商拍工具应运而生,成为了电商商家们的新宠。从拼流量到拼AI美间·AI创意商拍工具的推出,使得电商商家只需一张白底图,通过一键换背景,即可生成超真实......
  • 电商设计与AI技术的融合:美间的创新之路
    近年来,随着电商行业的飞速发展,商家们纷纷寻找新的方式来提高竞争力,降低成本,提高效率。在这一背景下,群核科技推出的美间·AI创意商拍工具应运而生,成为了电商商家们的新宠。从拼流量到拼AI美间·AI创意商拍工具的推出,使得电商商家只需一张白底图,通过一键换背景,即可生成超真实......
  • 多源谱嵌入融合学习算法(Multi-source Spectral Embedding Fusion Learning Algorithm,
    多源谱嵌入融合学习算法(Multi-sourceSpectralEmbeddingFusionLearningAlgorithm,简称MSEF)是一种专门设计用于处理多源数据的高级学习方法,其目标是在不同数据源之间建立一致的表示,从而提高聚类性能和数据理解的全面性。这种算法的核心在于利用全局和局部谱嵌入的融合,以......
  • 探索 GraphRAG:图结构与生成式模型的融合
    在当今数据驱动的时代,处理和理解复杂的图结构数据成为了一项重要的任务。GraphRAG(GraphRetrieval-AugmentedGeneration)作为一种新兴的技术,为解决图相关的问题提供了创新的思路和方法。一、GraphRAG简介GraphRAG是一种结合了图结构数据和生成式模型的技术框架。它旨在......
  • AI绘画 IC-Light:图像打光控制和背景融合生产力工具,最全ComfyUI操作指南
    大家好,我是设计师阿威今天给大家分享一下AI绘画StableDiffusion当中的IC-Light,这是一款图像打光控制和背景融合的光影模型。IC-Ligh简介IC-Light是一款由Controlnet作者lllyasviel创作的最新作品,用于实现操控图像光照效果的项目。当前该项目已经发布了两种类型的模型:文......
  • 【图像】红外与可见光融合图像识别经典算法
    红外与可见光融合图像识别经典算法一、红外与可见光图像融合的基础二、图像融合技术概览三、经典融合算法与实例1.基于拉普拉斯金字塔的融合2.基于小波变换的融合四、结论在图像识别领域,红外图像与可见光图像的融合技术开辟了一条新的路径,不仅增强了图像的细节......
  • pytorch下yolov8模型实现目标检测(全网最简洁快速,一眼懂)
    最近研究了一个目标检测项目,需要对水稻进行检测,yolov8的模型官网都封装好了,官网地址:Home-UltralyticsYOLODocs,本文给急需目标检测的同学参考,非常急的那种,废话少说,下面是所有代码:importosimporttorchfromultralyticsimportYOLOos.environ['KMP_DUPLICATE_LIB_OK']......