论文介绍
题目:LSM-YOLO: A Compact and Effective ROI Detector for Medical Detection
论文地址:https://arxiv.org/pdf/2408.14087
QQ深度学习交流群:719278780
扫描下方二维码,加入深度学习论文指南星球!
加入即可获得,模块缝合、制作、写作技巧,学会“结构”创新、“创新点”创新,从三区到顶会,小论文大论文,毕业一站式服务
创新点
提出了轻量化的医疗检测模型LSM-YOLO:
引入了两个关键模块:
轻量化自适应提取 (Lightweight Adaptive Extraction, LAE):该模块通过提取多尺度特征图,保留更多上下文信息和高分辨率细节,同时减少噪声的影响。相比传统卷积,LAE显著减少了参数和计算成本。
多路径分流特征匹配 (Multipath Shunt Feature Matching, MSFM):通过改进高阶语义特征和低阶视觉特征的融合,MSFM提升了小目标的检测性能,使得模型在处理医疗图像中小病灶时表现出色。
设计了新的特征融合方法:
性能表现:
实时性与轻量化设计:
作者设计了一种名为“轻量化分流匹配 YOLO (Lightweight Shunt Matching-YOLO, LSM-YOLO)”的模型,专注于在保持高检测准确率的同时实现实时性和轻量化,适合医疗图像ROI(感兴趣区域)的自动检测。
结合LAE和MSFM模块,实现了从高分辨率到低分辨率的特征提取和特征融合,同时设计了具有残差连接和无残差连接的MSFM模块版本,以适应不同的检测阶段。
在多个医疗数据集(胰腺肿瘤、血细胞检测和脑肿瘤检测)上进行测试,显示出LSM-YOLO相比其他主流模型具有更高的检测准确率和更低的参数量。例如,在胰腺肿瘤数据集上,LSM-YOLO以极低的参数量(2.87M)实现了48.6%的AP(平均准确率),超过了其他主流模型。
模型设计注重轻量化,便于部署到资源受限的医疗设备中,同时保证了实时检测的能力,为实际医疗应用提供了可能性。
方法
1. 模型架构概览
主要由以下模块组成:
Backbone(骨干网络):用于提取多尺度特征。
Head(检测头):对提取的特征进行进一步处理和融合,最终生成检测结果。
Output Heads(输出头):包含多个检测头(如大目标、中目标、小目标、极小目标),分别处理不同尺度的目标。
2. 核心模块描述
2.1 轻量化自适应提取(Lightweight Adaptive Extraction, LAE)
功能:对输入特征图进行多尺度下采样,提取丰富的上下文信息和高分辨率细节,同时减少计算成本。
结构:
一条分支负责轻量化提取。
另一条分支负责自适应提取,通过加权处理输入特征图的局部和全局信息。
通过组卷积降低计算复杂度。
使用两条分支并行提取特征:
结合后实现高效的信息保留和提取。
2.2 多路径分流特征匹配(Multipath Shunt Feature Matching, MSFM)
功能:融合不同层级的特征,增强高阶语义特征和低阶空间特征的匹配能力。
结构:
带残差连接的版本:用于骨干网络,增强特征表达能力。
无残差连接的版本:用于检测头,避免多余的信息叠加。
通道信息分流:通过全局池化和卷积提取全局语义信息。
空间信息分流:提取特征图的高度和宽度信息,辅助捕获小目标的上下文。
采用分流概念,将输入特征划分为不同部分进行处理:
两种版本:
2.3 接受场注意卷积(Receptive-Field Attention Convolution, RFABlock)
功能:引入注意力机制,提升卷积对目标区域和背景区域的区分能力。
位置:主要用于骨干网络的特征提取阶段。
3. 多尺度特征融合
模型设计了多尺度特征融合机制:
基于改进的路径聚合特征金字塔网络(Path Aggregation-Feature Pyramid Network, PA-FPN),融合高分辨率和低分辨率特征。
在特征融合后,分配到四个检测头,分别处理不同尺度的目标区域。
4. 损失函数
模型的损失函数包含三个部分:
分类损失:使用二元交叉熵损失(Binary Cross-Entropy Loss)。
边界框回归损失:
分布焦点损失(Distribution Focal Loss, DFL):提高边界框的定位精度。
SCYLLA-IoU损失(SIoU Loss):优化边界框的回归效果。
整体损失:上述三部分按权重组合,确保分类和回归的平衡
即插即用模块作用
LAE 作为一个即插即用模块:
医疗图像检测
特定场景:如 CT、MRI、血液检测等医疗图像,尤其是在检测肿瘤、小病灶或其他小目标时。
作用:提取丰富的多尺度特征,增强对小目标及其上下文的关注能力,同时减少噪声影响。
小目标检测任务
特定场景:如自然场景下的小物体检测(例如密集场景中的人脸、车辆等)或具有强背景干扰的目标。
作用:通过在多尺度采样中保留边界信息,有效检测小目标,并提高模型的定位和分类精度。
计算资源有限的环境
特定场景:如边缘设备部署、嵌入式系统、实时检测需求的场景。
作用:以极低的参数量和计算成本完成高效特征提取,满足实时性和轻量化的需求。
噪声干扰较大的检测任务
特定场景:如目标与背景差异较小或图像质量较差的场景(例如低分辨率图像)。
作用:通过自适应提取路径,动态调整对高信息熵区域的关注度,减少噪声干扰,提升特征表达能力。
消融实验结果
通过对 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 Detection
def 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-size
if p is None:
p = k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-pad
return p
class Conv(nn.Module):
"""Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)."""
default_act = nn.SiLU() # default activation
def __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 Extraction
def __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, 4
att = 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, 4
x = 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 x
if __name__ == '__main__':
input = torch.randn(1, 16, 64, 64) # B C H W
block = LAE(ch=16)
output = block(input)
print(input.size()) print(output.size())
便捷下载方式
浏览打开网址:https://github.com/ai-dawang/PlugNPlay-Modules
更多分析可见原文