目录
- 论文介绍
- 题目:
- 论文地址:
- 创新点
- 方法
- 模型总体架构
- 核心模块描述
- 1. 轻量级自适应提取(LAE)模块:
- 2. 多路径旁路特征匹配(MSFM)模块:
- 3. RFABlock(感受野注意力卷积)模块:
- 即插即用模块作用
- 消融实验结果
- 核心代码
论文介绍
题目:
LSM-YOLO: A Compact and Effective ROI Detector for Medical Detection
论文地址:
链接: https://arxiv.org/pdf/2408.14087
创新点
-
轻量级模型设计:提出了一种新型的模型,名为 Lightweight Shunt Matching-YOLO (LSM-YOLO),它结合了 Lightweight Adaptive Extraction (LAE) 和 Multipath Shunt Feature Matching (MSFM),旨在提高医学图像中感兴趣区域(ROI)的检测性能,同时保持模型的轻量化。
-
多尺度特征提取:通过 LAE 模块,模型能够在多尺度特征图上提取更多的上下文信息和高分辨率细节,减少噪声的影响,同时提取医学图像中 ROI 的详细特征。
-
特征融合机制:MSFM 模块用于进一步优化高级语义特征和低级视觉特征的融合,使得 ROI 特征与邻近特征之间的融合更好,从而提高检测率,辅助诊断。
-
改进的检测性能:实验结果表明,LSM-YOLO 在胰腺肿瘤私有数据集上达到了 48.6% 的 AP,BCCD 血细胞检测公共数据集上达到了 65.1% 的 AP,以及 Br35h 脑肿瘤检测公共数据集上达到了 73.0% 的 AP,均优于现有技术。
-
参数和计算成本的最小化:LSM-YOLO 在上述三个数据集上实现了最先进的性能,同时参数成本最小。
-
针对小目标检测的优化:为了解决医学成像中众多小目标的问题,LSM-YOLO 优化了输出头,扩展了 Path Aggregation-Feature Pyramid Network (PA-FPN) 结构,以提高对小目标的检测能力。
-
注意力机制的引入:通过引入 RFABlock(Receptive-Field Attention Convolutional operation),模型在特征提取的初始阶段学习对象区域与其周围环境之间的相似性和差异性。
-
多尺度特征的平衡:LSM-YOLO 通过平衡高级语义信息和低级视觉信息,解决了仅依赖单尺度特征时可能遗漏的细节信息问题。
方法
模型总体架构
LSM-YOLO模型的总体架构包含一个用于特征提取的骨干网络,一个用于特征整合的头部结构,以及四个输出头用于最终的检测输出。该模型通过轻量级自适应提取(LAE)模块来获取多尺度的特征图,并利用多路径旁路特征匹配(MSFM)模块来精细融合高低层次的语义和视觉特征。此外,模型中还引入了RFABlock来扩大感受野,通过将注意力机制整合到卷积过程中,增强模型对对象区域及其周围环境特征的学习能力。这样的设计使得LSM-YOLO在保持模型轻量化的同时,能够有效提升医学图像中感兴趣区域的检测性能。
核心模块描述
LSM-YOLO模型的核心模块包括:
1. 轻量级自适应提取(LAE)模块:
这个模块负责从医学图像中提取多尺度的特征图。它通过智能地减少参数数量和计算量,同时保留尽可能多的信息丰富的特征,来增强模型对感兴趣区域的细节特征的捕捉能力。LAE模块通过两个并行的分支工作,一个分支集中于将图像的高度和宽度信息映射到通道上,另一个分支计算相应的信息权重,从而在下采样过程中减少边缘信息的丢失。
2. 多路径旁路特征匹配(MSFM)模块:
该模块用于进一步优化高级语义特征和低级视觉特征的融合。它通过分析输入特征张量在高度、宽度和通道维度上的信息,来增强模型对不同尺度目标的捕获能力。MSFM模块采用旁路结构,通过分割操作保留原始特征,并通过空间和通道信息的交互,提升模型对感兴趣区域及其周围环境特征的学习能力。
3. RFABlock(感受野注意力卷积)模块:
这个模块通过引入空间注意力机制到卷积操作中,增强模型在特征提取初期对对象区域与其周围环境之间相似性和差异性的学习。它有助于模型在早期阶段就识别出对象区域,为后续的特征融合和目标检测提供更准确的特征表示。
即插即用模块作用
LAE 作为一个即插即用模块:
任务:
- 目标检测:识别图像中的一个或多个目标,如医学图像中的肿瘤、交通监控中的车辆和行人。
- 图像分割:将图像分割成不同的区域或对象,如在医学图像中分割出不同的组织和器官。
- 特征提取:从图像中提取有用的特征,用于后续的分类、识别或其他分析任务。
LAE模块因其轻量化和高效的特征提取能力,特别适合于需要实时或近实时处理的应用场景,以及计算资源受限的环境。
消融实验结果
- 通过对 RFABlock、LAE 和 MSFM 三个核心模块的独立及联合测试,展示了它们对模型性能的显著影响。单独使用每个模块均能提升检测性能,其中 MSFM 贡献最大,而三者协同使用时达到最佳效果,AP50:95 提升至 48.6%。这表明三个模块在特征提取、融合和上下文理解中的作用互补且设计合理。
- 表5 针对 LAE 模块内部的轻量化提取(LE)、自适应提取(AE)和维度映射(DM)三个组件进行了测试,发现每个组件单独启用均能提升检测性能,联合使用时效果更优,其中 DM 的加入进一步强化了上下文特征的整合能力,使 AP50:95 达到 48.6%。这验证了 LAE 模块在高效提取多尺度特征上的设计优势。
- 表6 测试了 MSFM 模块中空间信息处理和通道信息处理的独立及联合效果,发现两者单独启用时各自提高了检测性能,而同时启用时 AP50:95 提升至最高的 48.6%。这表明空间与通道信息处理在特征融合上具有显著的互补性,有助于增强 ROI 区域与邻域特征的交互,提升检测精度和鲁棒性。
核心代码
import torch
import torch.nn as nn
from einops import rearrange
# 论文地址:https://arxiv.org/pdf/2408.14087
# 论文:LSM-YOLO: A Compact and Effective ROI Detector for Medical Detectiondef autopad(k, p=None, d=1): # kernel, padding, dilation"""Pad to 'same' shape outputs."""if d > 1:k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k] # actual kernel-sizeif p is None:p = k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-padreturn pclass Conv(nn.Module):"""Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)."""default_act = nn.SiLU() # default activationdef __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):"""Initialize Conv layer with given arguments including activation."""super().__init__()self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)self.bn = nn.BatchNorm2d(c2)self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()def forward(self, x):"""Apply convolution, batch normalization and activation to input tensor."""return self.act(self.bn(self.conv(x)))def forward_fuse(self, x):"""Perform transposed convolution of 2D data."""return self.act(self.conv(x))class LAE(nn.Module):# Light-weight Adaptive Extractiondef __init__(self, ch, group=16) -> None:super().__init__()self.softmax = nn.Softmax(dim=-1)self.attention = nn.Sequential(nn.AvgPool2d(kernel_size=3, stride=1, padding=1),Conv(ch, ch, k=1))self.ds_conv = Conv(ch, ch * 4, k=3, s=2, g=(ch // group))def forward(self, x):# bs, ch, 2*h, 2*w => bs, ch, h, w, 4att = rearrange(self.attention(x), 'bs ch (s1 h) (s2 w) -> bs ch h w (s1 s2)', s1=2, s2=2)att = self.softmax(att)# bs, 4 * ch, h, w => bs, ch, h, w, 4x = rearrange(self.ds_conv(x), 'bs (s ch) h w -> bs ch h w s', s=4)x = torch.sum(x * att, dim=-1)return xif __name__ == '__main__':input = torch.randn(1, 16, 64, 64) # B C H Wblock = LAE(ch=16)output = block(input)print(input.size()) print(output.size())