YOLO12改进-模块-引入边缘 - 可学习局部显著核模块LLSKM 引导网络捕捉小目标的点、边缘等显著特征,提升检测敏感性与多尺度适应性。
红外小目标检测(ISTD)面临目标尺寸小、对比度低、尺度变化大等挑战,传统模型驱动方法(如基于人类视觉系统的局部显著核)能有效提取 “中心减邻域” 特征(如高斯状强度模式、边缘),但参数固定缺乏适应性;数据驱动的 CNN 虽能自动学习特征,但对小目标敏感性不足且模型复杂。LLSKM(Learnable Local Saliency Kernel Module)旨在融合两者优势,将传统显著核的 “中心减邻域” 原理嵌入神经网络,通过可学习参数和注意力机制提升检测性能。
上面是原模型,下面是改进模型
1. 可学习局部显著核模块LLSKM 介绍
“中心减邻域” 原理:模拟人类视觉系统对显著目标的感知机制,通过中心像素与邻域像素的差异(如拉普拉斯高斯核 LoG)突出目标的点或边缘特征,核心公式为中心权重与邻域权重的差值运算。
可学习参数与注意力机制:将传统固定参数(如抑制因子 θ)替换为可学习参数,通过全局通道注意力模块动态调整不同通道的特征响应,使核函数自适应输入数据的显著特征(如自动区分边缘或点状目标)。
LLSKM(Learnable Local Saliency Kernel Module)有 Recip 和 Diff 两种结构 :
Recip 结构(图 a)
输入与卷积处理:输入特征图X尺寸为C×H×W(C为通道数,H为高度,W为宽度 )。通过两个并行路径处理,Wsum是加权卷积(Weighted CNN),对输入特征图进行加权求和操作;W是邻域卷积(Neighbor CNN),负责提取邻域特征 。
通道注意力机制:输入特征图X经通道注意力(Channel Attention)模块处理,得到权重系数θa 。通道注意力模块包含平均池化(AP)、卷积(Conv)、批量归一化(BN)、ReLU 激活函数、又一组卷积和 BN 操作,最后经 Sigmoid 激活得到权重系数,范围在[0,1] 。
输出计算:Wsum的输出减去W的输出,并与θa进行逐元素相乘,最后得到输出Y 。
Diff 结构(图 b)
输入与卷积处理:同样输入特征图X尺寸为C×H×W 。Wsum加权卷积和W普通卷积(Vanilla CNN)并行处理输入,此外增加了Wc中心卷积(Central CNN)处理输入 。
通道注意力机制:输入特征图X经通道注意力模块得到权重系数θc ,通道注意力模块结构与 Recip 类似 。
输出计算:Wsum的输出减去W的输出,再加上θc与Wc输出的逐元素乘积,得到输出Y 。这种结构引入中心增强项,改善了 Recip 结构中中心特征丢失的问题 。
2. YOLOv12与LLSKM的结合
LLSKM 与 YOLOv8 结合,能借助 LLSKM 增强对红外小目标等的显著特征捕捉,提升 YOLOv8 在小目标检测场景中的敏感性与准确性;
3. LLSKM代码部分
https://github.com/tgf123/YOLOv8_improve/blob/master/YOLOV12.md
4. 将LLSKM引入到YOLOv12中
第一: 先新建一个change_model,将下面的核心代码复制到下面这个路径当中,如下图如所示。YOLOv12\ultralytics\change_model。
第二:在task.py中导入包
第三:在task.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV12.YAMY文件中
第五:运行代码
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorldif __name__=="__main__":# 使用自己的YOLOv12.yamy文件搭建模型并加载预训练权重训练模型model = YOLO(r"E:\Part_time_job_orders\YOLO_NEW\YOLOv12_all\ultralytics\cfg\models\12\yolo12_LLSKM.yaml")# .load(r'E:\Part_time_job_orders\YOLO_NEW\YOLOv12\yolo12n.pt') # build from YAML and transfer weightsresults = model.train(data=r'E:\Part_time_job_orders\YOLO\YOLOv12\ultralytics\cfg\datasets\VOC_my.yaml',epochs=300,imgsz=640,batch=64,# cache = False,# single_cls = False, # 是否是单类别检测# workers = 0,# resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',amp = True)