【SAHI】即插即用| SAHI操作可有效解决小目标检测过程中的难点!实现涨点

简介: 【SAHI】即插即用| SAHI操作可有效解决小目标检测过程中的难点!实现涨点

背景

  在传统的卷积神经网络中,所有的卷积核权重都是固定的,无法根据输入图像动态调整; 但在目标检测中,由于不同目标之间的差异性和复杂性,需要网络能够自适应地关注感兴趣的区域,同时忽略背景信息。

前言

  SAHI主要是为了优化目标检测网络中的注意力机制而设计的,SAHI是SahiConv2d的缩写,全称为Saliency Attentive Histological Image。

  它能够自适应地调整感受野大小,从而使神经网络在处理不同尺度的目标时具有更好的性能。SAHI在卷积计算时动态地调整卷积核的权重,使其更加关注感兴趣的区域,从而提高了网络的性能。 在目标检测中,SahiConv2d可以用于替代传统的卷积操作,使得网络能够更好地适应不同的目标和场景,提高目标检测的精度和鲁棒性。

原理

  SAHI的基本原理是使用视觉显著性模型,通过计算每个像素的显著性值,将显著性值高的区域定义为感兴趣区域(ROI),从而减少对不相关区域的处理,提高处理效率。

具体流程如下: 1.使用深度卷积神经网络进行图像特征提取。 2.使用全局池化层获取整个图像的特征向量。 3.使用逐像素分类的方法计算每个像素的显著性值,以获得像素级别的显著图。 4.将显著图与全局特征向量相结合,生成显著性特征图,以表征整个图像的显著性。 5.基于显著性特征图进行感兴趣区域(ROI)提取。 6.使用目标检测算法对感兴趣区域进行进一步处理。

python

复制代码

import torch.nn.functional as F
class SahiConv2d(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True):
        super(SahiConv2d, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride=stride, padding=padding, dilation=dilation, groups=groups, bias=bias)
    def forward(self, x):
        # 生成随机的sahi mask,大小和输入张量一样
        sahi_mask = torch.randint_like(x, high=2)
        sahi_mask = sahi_mask.type(torch.float32)
        # 将sahi mask应用到输入张量中
        x = x * sahi_mask
        # 使用卷积层对sahi操作后的输入张量进行卷积
        x = self.conv(x)
        return x

实操

  我们以AlexNet为模板,进行SIHI改造(在这里便于向大家展示,故而选择大家都熟悉的网络进行改造),将原有的nn.Conv2d函数替换为SahiConv2d 函数,将nn.Sequential中的nn.MaxPool2d替换为全局自适应池化层nn.AdaptiveAvgPool2d。如下所示:

ini

复制代码

import torch
import torch.nn as nn
from typing import Any
class AlexNet(nn.Module):
    def __init__(self, num_classes: int = 4) -> None:
        super(AlexNet, self).__init__()
        self.features = nn.Sequential(
            SahiConv2d(3, 64, kernel_size=11, stride=4, padding=2),
            nn.ReLU(inplace=True),
            nn.AdaptiveAvgPool2d((3, 2)),
            # nn.MaxPool2d(kernel_size=3, stride=2),
            SahiConv2d(64, 192, kernel_size=5, padding=2),
            nn.ReLU(inplace=True),
            nn.AdaptiveAvgPool2d((3, 2)),
            # nn.MaxPool2d(kernel_size=3, stride=2),
            SahiConv2d(192, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            SahiConv2d(384, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            SahiConv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            # nn.MaxPool2d(kernel_size=3, stride=2),
            nn.AdaptiveAvgPool2d((3, 2)),
        )
        self.avgpool = nn.AdaptiveAvgPool2d((6, 6))
        self.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(256 * 6 * 6, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, num_classes),
        )
    def forward(self, x: torch.Tensor) -> torch.Tensor:
        x = self.features(x)
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x
def alexnet(pretrained: bool = False, progress: bool = True, **kwargs: Any) -> AlexNet:
    model = AlexNet(**kwargs)
    if pretrained:
        pass
    return model
if __name__ == "__main__":
    x = torch.zeros(1, 3, 224, 224)
    net = alexnet(pretrained=False)
    y = net(x)
    print(y.shape)
    
>>> torch.Size([1, 4])

  以上代码中,我们定义了一个名为SahiConv2d的PyTorch模块,其继承自nn.Module类,实现了对输入张量进行sahi操作的功能。具体实现方式如下:

  首先,我们在构造函数中定义了一个常规的卷积层,其输入通道数、输出通道数、卷积核大小等参数可以自由设定。注意到我们没有指定该卷积层是否需要进行偏置操作(bias=True),这是因为我们将在sahi操作中使用一个随机的sahi mask来替代偏置操作。 接着,在forward函数中,我们首先生成一个与输入张量相同大小的随机二值化的sahi mask。在生成sahi mask时,我们使用了PyTorch中的randint函数,其可以在指定范围内生成随机整数张量。 然后,我们将sahi mask的数据类型转换为torch.float32,并将其应用到输入张量中,得到经过sahi操作后的输入张量。 最后,我们使用常规卷积层对经过sahi操作的输入张量进行卷积,得到卷积结果。

嵌入yolo

  在YOLO(You Only Look Once)目标检测网络中,共有三个不同大小的特征图,它们分别对应着不同的检测尺度。这三个特征图分别被称为S(小), M(中)和L(大)特征图{8.0, 16.0, 32.0}。 具体来说,这三个特征图是通过对输入图像进行下采样得到的,每个特征图都包含了一定数量的网格单元(grid cell),每个网格单元负责检测一定范围内的目标。S特征图的网格单元最小,M特征图的网格单元比S特征图大,L特征图的网格单元最大。

  因此,S特征图负责检测较小的目标,L特征图负责检测较大的目标,而M特征图则负责检测中等大小的目标。这三个特征图的输出都被送入YOLO的最终分类器和回归器,从而检测图像中的目标。

  例如有一小目标的数据集(小于或等于32px),那么我们必然是需要在S特征图上进行坐标回归,这个时候我们可以在S特征图上进行sahi操作,进而提高小目标的检测

结尾

  需要注意的是,由于sahi mask是随机生成的,因此每次进行sahi操作时得到的结果会略有不同。此外,sahi操作虽然可以用于增强模型的鲁棒性,但也可能会对模型的性能造成一定的影响,需要根据具体应用场景进行调整。

链接:github.com/kivenyangmi…


相关文章
|
3天前
|
机器学习/深度学习 算法 数据可视化
基于深度混合架构的智能量化交易系统研究: 融合SSDA与LSTM自编码器的特征提取与决策优化方法
本文探讨了在量化交易中结合时序特征和静态特征的混合建模方法。通过整合堆叠稀疏降噪自编码器(SSDA)和基于LSTM的自编码器(LSTM-AE),构建了一个能够全面捕捉市场动态特性的交易系统。SSDA通过降噪技术提取股票数据的鲁棒表示,LSTM-AE则专注于捕捉市场的时序依赖关系。系统采用A2C算法进行强化学习,通过多维度的奖励计算机制,实现了在可接受的风险水平下最大化收益的目标。实验结果显示,该系统在不同波动特征的股票上表现出差异化的适应能力,特别是在存在明确市场趋势的情况下,决策准确性较高。
20 5
基于深度混合架构的智能量化交易系统研究: 融合SSDA与LSTM自编码器的特征提取与决策优化方法
|
1月前
|
机器学习/深度学习 计算机视觉 网络架构
【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测
【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目DWRSeg是一种高效的实时语义分割网络,通过将多尺度特征提取分为区域残差化和语义残差化两步,提高了特征提取效率。它引入了Dilation-wise Residual (DWR) 和 Simple Inverted Residual (SIR) 模块,优化了不同网络阶段的感受野。在Cityscapes和CamVid数据集上的实验表明,DWRSeg在准确性和推理速度之间取得了最佳平衡,达到了72.7%的mIoU,每秒319.5帧。代码和模型已公开。
【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测
|
7月前
|
机器学习/深度学习 编解码 自然语言处理
YOLOv8改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
YOLOv8改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
469 2
|
7月前
|
机器学习/深度学习 自然语言处理
YOLOv5改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
YOLOv5改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
358 2
|
5月前
|
机器学习/深度学习 移动开发 自然语言处理
【YOLOv8改进- 多模块融合改进】GhostConv + ContextAggregation 幽灵卷积与上下文聚合模块融合改进,助力小目标高效涨点
【YOLOv8改进- 多模块融合改进】GhostConv + ContextAggregation 幽灵卷积与上下文聚合模块融合改进,助力小目标高效涨点
|
7月前
|
机器学习/深度学习
YOLOv8改进 | 细节创新篇 | iAFF迭代注意力特征融合助力多目标细节涨点
YOLOv8改进 | 细节创新篇 | iAFF迭代注意力特征融合助力多目标细节涨点
597 0
|
5月前
|
测试技术 计算机视觉 网络架构
【YOLOv8改进 - 特征融合】CARAFE:轻量级新型上采样算子,助力细节提升
【YOLOv8改进 - 特征融合】CARAFE:轻量级新型上采样算子,助力细节提升
|
7月前
|
机器学习/深度学习 编解码 算法
YOLOv8改进 | 主干网络 | 增加网络结构增强小目标检测能力【独家创新——附结构图】
YOLOv8在小目标检测上存在挑战,因卷积导致信息丢失。本文教程将原网络结构替换为更适合小目标检测的backbone,并提供结构图。通过讲解原理和手把手教学,指导如何修改代码,提供完整代码实现,适合新手实践。文章探讨了大特征图对小目标检测的重要性,如细节保留、定位精度、特征丰富度和上下文信息,并介绍了FPN等方法。YOLOv8流程包括预处理、特征提取、融合和检测。修改后的网络结构增加了上采样和concatenate步骤,以利用更大特征图检测小目标。完整代码和修改后的结构图可在文中链接获取。
|
7月前
|
机器学习/深度学习 计算机视觉 网络架构
【FCN】端到端式语义分割的开篇之作! 从中窥探后续语义分割网络的核心模块(一)
【FCN】端到端式语义分割的开篇之作! 从中窥探后续语义分割网络的核心模块(一)
439 0
【FCN】端到端式语义分割的开篇之作! 从中窥探后续语义分割网络的核心模块(一)
|
7月前
|
机器学习/深度学习 数据挖掘 测试技术
DETR即插即用 | RefineBox进一步细化DETR家族的检测框,无痛涨点
DETR即插即用 | RefineBox进一步细化DETR家族的检测框,无痛涨点
398 1
下一篇
DataWorks