关键词:SAHI 、 注意力机制 、 鲁棒性 、 空间注意力

背景

  在传统的卷积神经网络中,所有的卷积核权重都是固定的,无法根据输入图画动态调整;
但在方针检测中,因为不同方针之间的差异性和复杂性,需求网络能够自适应地重视感兴趣的区域,同时疏忽背景信息。

前语

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

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

原理

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

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

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。如下所示:

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操作尽管能够用于增强模型的鲁棒性,但也或许会对模型的性能造成一定的影响,需求根据详细应用场景进行调整。

*本文正在参与 人工智能创作者扶持方案 ” *