【YOLOv8改进 - 特征融合NECK】 HS-FPN :用于处理多尺度特征融合的网络结构,降低参数

摘要

在标准的医院血液检测中,传统过程需要医生使用显微镜从患者的血液显微图像中手动分离白细胞。然后,这些分离出的白细胞通过自动白细胞分类器进行分类,以确定血液样本中不同类型白细胞的比例和数量,从而辅助疾病诊断。这种方法不仅耗时费力,而且由于图像质量和环境条件等因素,容易出现错误,从而可能导致后续分类不正确和误诊。现代白细胞检测方法在处理具有较少白细胞特征的图像和不同白细胞规模差异方面存在局限性,导致大多数情况下结果不尽如人意。

为了解决这些问题,本文提出了一种创新的白细胞检测方法:多层次特征融合和可变形自注意力 DETR(MFDS-DETR)。为了解决白细胞规模差异问题,我们设计了高层次筛选特征融合金字塔(HS-FPN),实现多层次融合。该模型使用高层次特征作为权重,通过通道注意力模块过滤低层次特征信息,然后将筛选后的信息与高层次特征融合,从而增强模型的特征表达能力。此外,我们通过在编码器中引入多尺度可变形自注意模块,并在解码器中使用自注意和交叉可变形注意机制,解决了白细胞特征稀缺问题,这有助于提取白细胞特征图的全局特征。

通过与其他尖端白细胞检测模型在私有 WBCDD、公共 LISC 和 BCCD 数据集上的比较,验证了所提出的 MFDS-DETR 方法的有效性、优越性和通用性。我们的源代码和私有 WBCCD 数据集可在以下地址获得:https://github.com/JustlfC03/MFDS-DETR。

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

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

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

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

image-20240622094143702

HS-FPN(Hierarchical Scale-based Feature Pyramid Network)是一种用于多尺度特征融合的网络结构,旨在解决白细胞图像中的多尺度挑战,从而提高模型对白细胞的准确识别能力。HS-FPN包括两个主要组件:特征选择模块和特征融合模块。

  1. 特征选择模块:在特征选择模块中,不同尺度的特征图经过筛选过程。这个过程有助于选择高级和低级特征图中的信息。

  2. 特征融合模块:在特征融合模块中,经过筛选的特征与高级语义特征进行逐点相加。这种融合方式能够有效地将高级语义信息与低级特征属性相结合,从而提高对白细胞图像的特征表达能力。

HS-FPN利用通道注意(Channel Attention,CA)模块来利用高级语义特征作为权重,以过滤低级特征。这种筛选后的特征与高级语义特征相加,实现了多尺度特征融合,从而提高了模型的特征表达能力。通过这种方式,HS-FPN能够更好地捕获白细胞图像的全面特征信息,从而提高白细胞检测的准确性和效率。

yolov8 代码引入

# 定义HSFPN通道注意力机制类
class HSFPNChannelAttention(nn.Module):
    def __init__(self, in_planes, ratio=4, flag=True):
        super(HSFPNChannelAttention, self).__init__()
        # 自适应平均池化,将输入特征图变为1x1
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        # 自适应最大池化,将输入特征图变为1x1
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        # 卷积层1,将输入通道数降维
        self.conv1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
        # ReLU激活函数
        self.relu = nn.ReLU()
        # 卷积层2,将通道数恢复
        self.conv2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)
        
        # 标志位,决定输出是否与输入相乘
        self.flag = flag
        # Sigmoid激活函数
        self.sigmoid = nn.Sigmoid()

        # 初始化卷积层权重
        nn.init.xavier_uniform_(self.conv1.weight)
        nn.init.xavier_uniform_(self.conv2.weight)

    def forward(self, x):
        # 通过平均池化和两层卷积计算通道注意力
        avg_out = self.conv2(self.relu(self.conv1(self.avg_pool(x))))
        # 通过最大池化和两层卷积计算通道注意力
        max_out = self.conv2(self.relu(self.conv1(self.max_pool(x))))
        # 将平均池化和最大池化的结果相加
        out = avg_out + max_out
        # 根据flag决定是否与输入相乘并返回结果
        return self.sigmoid(out) * x if self.flag else self.sigmoid(out)

task与yaml配置

详见:hhttps://blog.csdn.net/shangyanaf/article/details/139877859

posted @ 2024-06-22 10:12  YOLOv8大师  阅读(45)  评论(0编辑  收藏  举报