YOLO目标检测创新改进与实战案例专栏
专栏目录: YOLO有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
专栏链接: YOLO基础解析+创新改进+实战案例
介绍
摘要
摘要——红外小目标检测是计算机视觉中的一项重要任务,涉及识别和定位红外图像中的微小目标,这些目标通常只有几个像素。然而,由于目标体积小且红外图像背景通常复杂,这项任务面临诸多挑战。本文提出了一种深度学习方法HCF-Net,通过多个实用模块显著提升红外小目标检测性能。具体而言,该方法包括并行化的感知补丁注意力(PPA)模块、维度感知选择性融合(DASI)模块和多膨胀通道优化(MDCR)模块。PPA模块使用多分支特征提取策略来捕捉不同尺度和层次的特征信息。DASI模块实现了自适应的通道选择和融合。MDCR模块通过多层深度可分离卷积捕捉不同感受野范围的空间特征。大量实验结果表明,在SIRST红外单帧图像数据集上,所提出的HCF-Net表现优异,超越了其他传统和深度学习模型。代码可在https://github.com/zhengshuchen/HCFNet获取。
文章链接
论文地址:论文地址
代码地址:代码地址
基本原理
HCF-Net(Hierarchical Context Fusion Network)是一种用于红外小目标检测的深度学习模型,旨在提高对红外图像中微小目标的识别和定位能力。
网络架构:HCF-Net采用了一种升级版的U-Net架构,主要由三个关键模块组成:Parallelized Patch-Aware Attention(PPA)模块、Dimension-Aware Selective Integration(DASI)模块和Multi-Dilated Channel Refiner(MDCR)模块。这些模块在不同层级上解决了红外小目标检测中的挑战 。
PPA模块:
- Hierarchical Feature Fusion:PPA模块利用分层特征融合和注意力机制,以在多次下采样过程中保持和增强小目标的表示,确保关键信息在整个网络中得以保留[T1]。
- Multi-Branch Feature Extraction:PPA采用多分支特征提取策略,以捕获不同尺度和级别的特征信息,从而提高小目标检测的准确性 。
DASI模块:
- Adaptive Feature Fusion:DASI模块增强了U-Net中的跳跃连接,专注于高低维特征的自适应选择和精细融合,以增强小目标的显著性 。
MDCR模块:
- Spatial Feature Refinement:MDCR模块通过多个深度可分离卷积层捕获不同感受野范围的空间特征,更细致地建模目标和背景之间的差异,提高了定位小目标的能力 。
Multi-Dilated Channel Refiner(MDCR)模块是HCF-Net中的关键组成部分,旨在增强网络对红外小目标检测的特征表示和区分能力。
MDCR模块的目的:MDCR模块旨在通过采用多种扩张率的深度可分离卷积层,捕获不同感受野大小的空间特征,从而实现对目标和背景之间差异的详细建模,提升网络有效区分小目标的能力 。
MDCR模块的结构:
- 输入特征的划分:MDCR模块将输入特征F_a沿通道维度划分为四个独立的头部,生成对应的(a_i),其中i从1到4。每个头部对应特定的特征集合 。
- 深度可分离扩张卷积:每个头部经历独立的深度可分离扩张卷积,具有不同的扩张率,最终生成(a'_i),其中i从1到4。这些卷积的扩张率分别标记为d1、d2、d3和d4 。
- 特征增强:通过对各个头部应用深度可分离扩张卷积,MDCR模块增强了特征表示和网络的区分能力 。
MDCR模块的有效性:
- 捕获空间特征:MDCR模块在不同感受野范围内捕获空间特征,使网络更好地理解红外图像中目标的上下文和细节 。
- 区分小目标:通过利用具有不同扩张率的多个深度可分离卷积层,MDCR模块增强了网络区分小目标和背景的能力,提高了检测性能 。
如下图所示MDCR沿着通道维度将输入特征$\mathbf{F}_{a}\in\mathbb{R}^{H\times W\times C}$分成四个不同的头,生成$(\mathbf{a}i){i=1}^4\in\mathbb{R}^{H\times W\times\frac{C}{4}}$。然后,每个头部以不同的扩张率分别进行深度可分离的扩张卷积,得到$(\mathbf{a}^{\prime}i){i=1}^4\in\mathbb{R}^{H\times W\times\frac{C}{4}}$。将卷积扩张率分别命名为$d1、d2、d3$和$d4$。
$$\mathbf{a}_i^{\prime}=DDWConv(\mathbf{a}_i),$$
其中,$\mathbf{a}_i^{\prime}$表示对第$i$个头部进行深度可分离扩张卷积后获得的特征。操作$DDWConv()$表示深度可分离扩张卷积,$i$取值为1、2、3、4。
MDCR通过通道分割和重组来增强特征表示。具体来说,我们将$\mathbf{a'}i$分割成单个通道,从而得到每个头部的$(\mathbf{a}^{j}{i})_{j=1}^{\frac{C}{4}}\in\mathbb{R}^{H\times W\times1}$。然后,我们将这些通道交错排列,形成$(\mathbf{h}j){j=1}^{\frac{C}{4}}\in\mathbb{R}^{H\times W\times4}$,从而增强多尺度特征的多样性。随后,我们使用点式卷积法进行组间和跨组信息融合,得到输出$\mathbf{F}_{o}\in\mathbb{R}^{H\times W\times C}$,实现轻量高效的聚合效果。
$$\mathbf{h}_j=Winner([\mathbf{a}^j_1, \mathbf{a}^j_2, \mathbf{a}^j_3, \mathbf{a}^j_4]), \mathbf{F}_{o}=\delta(B(W_{outer}([\mathbf{h}_1, \mathbf{h}_2, \ldots, \mathbf{h}_j])))$$
其中,$W{inner}$和$W{outer}$是用于点卷积的权重矩阵。这里,$\mathbf{a}^j_i$表示第$i$个头的第$j$个通道,而$\mathbf{h}_j$表示第$j$组特征。$i \in {1, 2, 3, 4}$,$j \in {1, 2, \ldots, \frac{C}{4}}$。函数$\delta()$和$\mathcal{B}()$分别对应于整流线性单元(ReLU)和批量归一化(BN)。
YOLOv8引入
class MDCR(nn.Module):
def __init__(self, in_features, out_features, norm_type='bn', activation=True, rate=[1, 6, 12, 18]):
super().__init__()
# 定义四个卷积块,每个块使用不同的扩张率进行深度可分离卷积
self.block1 = conv_block(
in_features=in_features//4,
out_features=out_features//4,
padding=rate[0],
dilation=rate[0],
norm_type=norm_type,
activation=activation,
groups=128
)
self.block2 = conv_block(
in_features=in_features//4,
out_features=out_features//4,
padding=rate[1],
dilation=rate[1],
norm_type=norm_type,
activation=activation,
groups=128
)
self.block3 = conv_block(
in_features=in_features//4,
out_features=out_features//4,
padding=rate[2],
dilation=rate[2],
norm_type=norm_type,
activation=activation,
groups=128
)
self.block4 = conv_block(
in_features=in_features//4,
out_features=out_features//4,
padding=rate[3],
dilation=rate[3],
norm_type=norm_type,
activation=activation,
groups=128
)
# 定义输出的尺寸调整卷积块和最终输出卷积块
self.out_s = conv_block(
in_features=4,
out_features=4,
kernel_size=(1, 1),
padding=(0, 0),
norm_type=norm_type,
activation=activation,
)
self.out = conv_block(
in_features=out_features,
out_features=out_features,
kernel_size=(1, 1),
padding=(0, 0),
norm_type=norm_type,
activation=activation,
)
def forward(self, x):
split_tensors = []
x = torch.chunk(x, 4, dim=1) # 沿通道维度将输入张量分成四个部分
x1 = self.block1(x[0])
x2 = self.block2(x[1])
x3 = self.block3(x[2])
x4 = self.block4(x[3])
# 对每个通道进行操作,拼接和处理
for channel in range(x1.size(1)):
channel_tensors = [tensor[:, channel:channel + 1, :, :] for tensor in [x1, x2, x3, x4]]
concatenated_channel = self.out_s(torch.cat(channel_tensors, dim=1)) # 在通道维度上拼接
split_tensors.append(concatenated_channel)
x = torch.cat(split_tensors, dim=1) # 沿通道维度拼接
x = self.out(x) # 最终输出
return x
task与yaml配置
详见:https://blog.csdn.net/shangyanaf/article/details/140104977