1. 文章主要内容
本文作为前篇:一文详解YOLOv8多模态目标检测(可见光+红外图像,基于Ultralytics官方代码实现),轻松入门多模态检测领域!的补充解析,聚焦YOLOv8多模态检测的两大核心模块:双流网络架构设计与跨模态特征融合实现机理。通过可视化模型结构拆解与融合策略逐层推导,系统解析可见光-红外协同检测的技术实现路径。
2. 相关说明
建议读者优先阅读前篇源码解析博客,再搭配本文提供的架构示意图与融合流程图,可以理解的更加清楚。
3. 双模态YOLOv8结构示意图
针对之前有读者反映双模态YOLOv8的yaml文件过于复杂,我制作了一个结构图,以便更直观地理解双模态的执行流程。这个结构图借鉴了论文Cross-Modality Fusion Transformer for Multispectral Object Detection。为了方便大家理解,我提供了两幅图:第一幅是论文的原图,第二幅是我根据双模态YOLOv8制作的更详细的图。需要注意的是,如果需要撰写论文,建议使用第一幅图,因为它更为美观、简洁。
4. 跨模态特征融合
从上面的第二幅详细结构图可以看出,双模态YOLOv8的输入部分与单模态不同,采用了双分支输入,分别处理RGB可见光图像和IR红外图像。尽管IR图像原本只有一个通道,但在进行后续的融合和拼接操作时,需要将其通道升维,使其与RGB图像的初始3个通道维度一致。
双模态的关键在于RIFusion粗粒度融合模块和ADD最终融合模块的配合使用。这两者的组合在三个不同的层级上进行融合,分别对应检测层P3、P4和P5的不同尺度。与原YOLOv8模型相比,主要的改变在于双模态输入的双分支结构,以及新增的RIFusion和ADD融合模块。接下来,我们将重点分析这两个模块的作用和结构。
4.1.1 RIFusion粗粒度融合模块
在展开RIFusion模块的具体设计前,需要先理解多模态特征融合的通用范式。大多数多模态目标检测模型在特征层融合阶段遵循“分阶段递进”策略:第一个块是粗粒度融合模块,第二个块属于深度语义融合,也可以叫做最终的融合模块(当然有可能多个融合模块,我想表明的是这个深度融合模块一般是要存在的),此时这个最终融合模块的输出就可以送到检测头进行分类和定位。那么粗粒度融合模块和深度语义融合模块有什么作用,也就是为什么要这么做?
在红外-可见光双模态目标检测中,两种图像因设备差异存在固有语义鸿沟:红外图像捕捉热辐射信息但缺乏纹理,可见光图像保留细节但对光照敏感。若直接融合特征,可能引发两类问题:一是强模态特征掩盖弱模态信息,例如夜间红外的显著热信号压制可见光的微弱纹理,导致车牌、衣着等关键细节丢失;二是模态噪声叠加放大干扰,例如红外的非均匀性噪声与可见光的反光噪声通过简单相加形成更复杂的噪声干扰。
为解决这些问题,研究者需同步实现两个目标:一是动态提取互补特征,例如在夜间强化红外热目标以补偿可见光缺失的纹理,而在白天利用可见光细节优化红外模糊轮廓;二是通过优化融合过程抑制冗余噪声,例如对冲突区域降权、对噪声通道过滤。值得注意的是,这两个目标本质上是关联的——当互补特征被充分激活时,冗余噪声的影响会自然减弱。因此,核心矛盾转化为如何设计融合模块的交互机制,从而在保留关键信息的同时抑制干扰。
现在,先来看看RIFusion的粗粒度融合结构示意图,博主对源码进行了分析并制作出了一张示意图供大家参考,如下图所示:
在解析RIFusion模块的设计时,首先需要明确其数据处理流程:模块接收RGB与IR模态的特征图拼接(Concate)结果作为输入,比如将RGB通道置于前、IR通道置于后。这一拼接特征会经过一个改进的SENet通道注意力机制,通过自适应权重计算对关键通道进行增强,同时引入残差连接(即输入特征直接与注意力加权后的输出相加),以保留原始模态的底层信息。
需要特别说明的是,虽然上述第二幅详细结构示意图中标注每个模态分支存在“Add”操作(即融合特征与原始特征相加),但实际代码实现与图示存在差异——其本质流程是先将拼接后的特征通过注意力加权与残差连接完成融合,再通过通道分割还原为RGB和IR两个独立分支。此时,两个分支的特征均已融入对方的上下文信息(例如RGB特征携带了IR的热辐射线索,IR特征嵌入了RGB的纹理细节),这种隐式的跨模态交互有效缓解了语义鸿沟问题,为后续深层融合提供了对齐更优的特征基础。为了加深大家对融合机制的理解,博主这里结合RIFusion模块和前向传播的代码给大家分析通道注意力在多模态图像融合中的关键作用,先给出RIFusion的具体代码,我们一步步仔细分析__init__构造函数:
class RIFusion(nn.Module):
# Concatenate a list of tensors along dimension
def __init__(self, c1,r=16,dimension=1):
super().__init__()
self.c1=c1*2
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.fc = nn.Sequential(
nn.Linear(self.c1, self.c1 // r, bias=False),
nn.ReLU(inplace=True),
nn.Linear(self.c1 // r, self.c1, bias=False),
nn.Sigmoid()
# nn.Sigmoid(inplace=True)
)
def forward(self, x):
# return x
b, _, _, _ = x.size()
y = self.avg_pool(x).view(b, self.c1)
y = self.fc(y).view(b, self.c1, 1, 1)
x1=x*y
return x+torch.cat((x1[:,self.c1//2:,...],x1[:,:self.c1//2,...]),dim=1)
1.self.avg_pool = nn.AdaptiveAvgPool2d(1):这行代码实现全局平均池化功能,其作用是将输入特征图的每个通道的空间维度(H×W)压缩为一个标量值(1×1),从而生成通道级别的统计量(通道描述符)。例如,若输入特征维度为 C×H×W(C为通道数,H和W为高和宽),经过该操作后输出维度为 C×1×1。此时每个通道的描述符仅反映该通道自身的全局空间信息(如红外或可见光通道的均值),而不同通道之间(例如拼接后的RGB通道与IR通道)并未进行任何交互,通道描述符的生成过程完全独立。
2.nn.Linear(self.c1, self.c1 // r, bias=False):这行代码通过缩减因子r对通道进行降维(例如将通道数从c1压缩至c1//r),迫使网络在低维空间中学习紧凑的通道交互关系。此时,每个低维通道由原始通道的线性组合构成(例如:新通道1可能是0.3×原始通道1 + 0.7×原始通道2 - 0.2×原始通道3),这种组合能够提取跨模态的关键关联性——正是通过这种线性映射,原本独立的RGB与IR通道在低维空间内实现了信息交互。例如:若原始通道包含红外的热辐射特征与可见光的纹理特征,降维后可能生成一个融合两者特性的新通道,为后续跨模态互补提供基础。 下面给出一个具体的例子:
从而我们可以得到这几种情况:RGB高纹理和IR高热辐射区域强强联合、RGB低纹理被IR高热辐射区域辅助增加、IR低热辐被RGB高纹理辅助、RGB噪声与IR噪声共同被抑制等情况。 每个情况我都来举一个进行说明:
3.nn.ReLU(inplace=True):ReLU激活函数的主要作用是引入非线性,增强通道间关系的表达能力。例如,在降维过程中,一些噪声组合的通道权值可能为负数,ReLU通过抑制这些负权值,进一步筛选出有效特征组合。
4.nn.Linear(self.c1 // r, self.c1, bias=False):这行代码是将通道维度从c1//r 升维到c1,目的是生成与通道数匹配的权重向量。举个例子来说明:
在多模态图像融合过程中,从低维通道恢复到高维通道时,每个高维通道的权重由低维通道的线性组合生成。具体而言,这些权重由Wup矩阵决定,而Wup矩阵会根据具体任务(如目标检测)的损失函数通过反向传播进行优化迭代,使其参数更贴合实际任务需求。在这一过程中,生成的高维通道权重会分别针对输入特征图的前半部分(RGB通道)和后半部分(IR通道)进行优化,以增强各自模态中显著的特征信息。同时,这种加权过程不仅强化了RGB或IR的显著特征,还融合了对应模态的上下文信息,从而为后续的融合操作打下了基础,实现了粗粒度的融合效果。
4.nn.Sigmoid():Sigmoid函数将升维后的权重值约束至[0,1]区间,从而与原始特征图进行逐通道加权,通过抑制低权重噪声并强化高响应特征,实现有效信息筛选
5.在前向计算过程中,原始输入特征图x由RGB和IR特征图组成。代码中使用torch.cat对加权后的特征图进行拼接,其中后半部分通道(IR)与原始特征图的前半部分通道(RGB)相加。这种操作可能违背了残差连接的原理(存在一定问题),因为残差连接应保持原始特征信息的完整性,以便于特征复用和梯度信息流的顺畅。
x+torch.cat((x1[:,self.c1//2:,...],x1[:,:self.c1//2,...]),dim=1)
6.在模型前向传播函数_predict_once中,RIFusion模块的输入x3由RGB和IR特征图沿通道维度拼接构成。该模块(m)通过torch.chunk将输入特征沿通道维度拆分为独立分支,与拼接前的RGB/IR结构形成对应关系,为后续跨模态融合提供基础处理框架。
elif m.f==-3:
if(len(list(m.named_parameters()))>0):
x3=torch.cat([rgb,ir],dim=1)
x3=m(x3)
rgb,ir = torch.chunk(x3, 2, dim=1)
x=[]#中间层
4.1.2 Add最终融合模块
源码中ADD模块仅通过Add操作将两个分支的输出直接相加,而未引入动态权重机制(如Mamba或Transformer等对融合权重进行自适应学习)。这种简单的线性叠加虽能实现基础特征融合,但相比更优的模型设计,缺乏对跨模态交互权重的精细化调控能力。
5. 跨模态特征融合
本文基于YOLOv8多模态目标检测框架,聚焦RIFusion模块的设计原理与源码实现,通过结构图与代码的双维度对照解析,揭示其跨模态特征融合机制的核心逻辑。文章旨在帮助读者快速理解多模态检测的关键技术要点,欢迎评论区交流讨论。若内容对您有所启发,请点赞、收藏支持,后续将陆续更新代码解读与论文深度解析。