尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

YOLO26即插即用改进:LSB局部特征连续传输模块原理与工程实践

YOLO26即插即用改进:LSB局部特征连续传输模块原理与工程实践 改动网络结构的目标检测项目里最怕的不是模型精度不够而是“论文里看起来很美的模块放进自己的代码库后训练直接崩掉”。最近在跟进 YOLO26 社区改进时留意到 CVPR 2025 的 nnWNet 里提到一个叫 LSB 的局部特征连续传输模块很多人在讨论它的“即插即用”属性和精度提升效果。本文不准备照着论文翻译一遍而是从工程角度出发把 LSB 模块的原理、代码实现、在 YOLO26 中的接入方式以及训练和部署时需要注意的问题完整梳理一遍。如果你正在做 YOLO26 改进或者想给自己的检测网络接入一种轻量级特征传输模块这篇文章可以直接作为一份落地笔记来用。1. 背景YOLO26 与目标检测网络改进的基本思路1.1 YOLO 系列演进到 YOLO26 之后改进空间在哪里YOLO 系列从一开始就是一个非常“工程向”的目标检测框架。从 YOLOv5 开始模型结构、训练流程、部署导出被逐步整合到统一代码库中后面出现的 YOLOv8、YOLOv9、YOLOv10 等版本虽然各自侧重点不同但大体都能在同一个工程框架内完成训练和导出。YOLO26 可以理解为社区在已有 YOLO 版本基础上继续结构迭代的产物它保留了 YOLO 系列“快速训练、容易部署、结构清晰”的特点同时在主干网络、颈部特征融合、检测头三个方面都留出了较大的自定义空间。很多同学在接触 YOLO26 改进时会遇到同样的问题主干网络已经做得比较成熟了从头设计一个全新的 Backbone 既不现实也没有必要。真正能带来精度收益的往往是那些插入到现有网络中间、只改变特征表达方式而不影响整体数据流的轻量级模块。这也是为什么“注意力机制”“特征增强模块”“多尺度融合模块”这些方向在 YOLO 改进中经久不衰。1.2 目标检测网络改进的常见方向从实际改进案例来看目标检测网络的优化大致可以分成三条路线结构重参数化在训练时使用复杂的多分支结构推理时再合并成单分支。这种做法的优点是推理速度几乎不损失缺点是实现难度高对训练技巧依赖较强。注意力机制与特征增强在网络的特定位置引入通道注意力、空间注意力或更复杂的特征交互机制例如 SE、CBAM、CA、EMA 等。这类模块的插入方式比较灵活通常是“即插即用”的。颈部特征融合策略通过改进 FPN、PAN 这类特征金字塔结构让浅层细节信息和深层语义信息更好地融合典型如 BiFPN、AFPN 等。LSB 模块属于第二条路线和第三条路线之间的一种结构。它没有去改 YOLO26 的主干网络整体设计而是在特征图的局部区域内做连续的信息传输从而增强特征表达。这种思路既不会大幅增加参数量也不会破坏原有网络结构所以社区里把它称为“即插即用”模块。1.3 nnWNet 与 LSB 模块的引入价值nnWNet 是 CVPR 2025 上提出的一个网络结构论文公开后社区对其中局部特征传输部分关注度很高。LSB 的中文描述可以叫“局部特征连续传输模块”它和数字图像处理里常说的 LSB最低有效位完全不是一个概念这里需要先区分开。LSB 模块的定位是在特征图的局部邻域内建立一种连续、多步的信息传递方式让每一个位置的最终特征不仅包含当前位置的信息还包含邻域位置经过逐步传递后的信息。相比普通卷积的直接邻域聚合LSB 强调“连续”和“多步”这样可以在不扩大感受野的前提下让局部特征之间的关联更加紧密。对 YOLO26 这类目标检测网络来说在颈部或主干后段接入 LSB 模块能改善小目标和遮挡目标的检测效果特别是在低光环境、模糊边缘这类条件下局部特征连续性带来的收益会更明显。2. LSB 模块核心概念局部特征连续传输到底做了什么2.1 从 CNN 的局部感受野说起卷积神经网络的基本操作可以理解为“局部感知”。一个 3×3 的卷积核每次只看到输入特征图上一个小窗口然后通过滑动窗口遍历整张特征图。这种设计带来了两个非常好的性质参数共享和平移等变性。但同时也引入了一个问题一次卷积只能让信息在很小的邻域内流动如果两个像素在特征图上距离较远它们之间的信息交互需要经过多层卷积才能实现。更深层的网络中这个“信息逐步传递”的过程被网络层数天然覆盖所以普通 ResNet、CSPNet 这类结构能通过堆叠层数来扩大感受野。但目标检测网络中为了平衡速度和精度网络深度是有限的不能一味靠加深网络来增强特征交互。2.2 LSB 模块的基本思想LSB 模块的设计思路比较直接既然单层卷积只能做一步局部交互那我就把一个局部窗口内的信息交互拆成多个小步骤让特征图在模块内部连续传递两次甚至更多次。每一步都只处理很小的邻域但经过多步累加后局部区域内的信息就被充分地“盘活”了。用一句话概括LSB 模块内的特征传输不是一次到位而是以小步快跑的方式在局部区域内连续流动。这样做的直接好处是不增加太大的计算量因为每一步使用的都是轻量级卷积。不改变特征图尺寸插入到现有网络时不会破坏后续结构。能保留更多局部细节特别适合低光环境和小目标检测。2.3 LSB 与注意力机制的区别很多同学会把 LSB 和注意力模块混在一起实际上两者的作用方式完全不同。注意力机制的核心是“加权”它会计算每个位置或每个通道的重要程度然后把重要特征放大、无关特征抑制。SE 模块在通道维度做全局池化和重新标定CBAM 在空间和通道两个维度分别做注意力权重计算。LSB 模块的核心是“传递”它并不显式地计算注意力权重而是通过局部窗口内的多步特征变换让信息在空间位置上发生迁移。严格来说LSB 更像是一种轻量级的局部特征交互结构你可以把它理解为“更聪明的卷积”而不是“注意力”。当然实际使用时 LSB 也可以和注意力模块串联使用两个模块不冲突。2.4 为什么这种“即插即用”模块容易提升精度目标检测网络的不同层特征含义差别很大。浅层特征包含更多边缘、纹理和颜色信息深层特征包含更多语义信息。普通卷积在每一层都在“重新提取特征”但层与层之间的局部关联性并不一定被充分利用。LSB 模块在特征图上额外增加了一条“局部连续传输”路径相当于在不改变网络主体结构的前提下让特征在局部区域内进行了额外的信息融合。之所以说它“即插即用”是因为模块的输入输出形状完全一致可以直接替换 YOLO26 网络结构中的某个模块或者插在某个阶段之后。既不需要改变检测头的设计也不需要修改损失函数和训练策略。对于大多数目标检测改进任务来说这种低侵入性的模块是性价比最高的选择。3. 环境准备搭建 YOLO26 运行环境3.1 环境依赖YOLO26 的代码仓库目前仍处于快速迭代阶段不同分支的结构和接口可能存在差异。本文的示例基于 PyTorch 环境版本需要根据你的项目实际情况调整重点演示配置思路。建议环境如下依赖项建议版本操作系统Ubuntu 20.04 / 22.04Windows 10/11 也可Python3.8 及以上PyTorch1.13 或 2.xCUDA11.7 或更高版本torchvision与 PyTorch 对应版本其他依赖numpy、opencv-python、pyyaml、tqdm如果使用 NVIDIA GPU需要提前安装好显卡驱动和 CUDA 工具包。如果只是想在 CPU 环境下跑通流程也可以但训练速度会比较慢建议至少用一块 8GB 显存的 GPU 来训练 YOLO26 的 small 版本。3.2 获取 YOLO26 源码YOLO26 源码可以通过 GitHub 仓库克隆或者直接下载压缩包。社区中比较通用且本文示例代码基于以下仓库结构yolo26/ ├── data/ ├── models/ │ ├── common.py │ ├── yolo.py │ └── yolo26.yaml ├── runs/ ├── train.py ├── detect.py └── requirements.txt如果你使用的仓库目录结构不同例如对应的是ultralytics框架下的包结构那么模块注册和 yaml 编写的位置会略有差异但整体思路是一样的。3.3 验证基础环境代码下载完成后先安装依赖cd yolo26 pip install -r requirements.txt然后跑一次简单的检测验证环境是否正常python detect.py --source data/images/bus.jpg --weights yolov26s.pt如果能在runs/detect/下看到检测结果说明环境已经就绪。如果这一步就报错优先检查 PyTorch 版本和 CUDA 是否匹配。4. 完整实战在 YOLO26 中集成 LSB 模块4.1 LSB 模块的代码编写LSB 模块的论文官方源码目前并未完全统一社区复现版本也较多。在 YOLO26 中接入时不一定要严格复刻论文实现更重要的是理解“局部连续传输”这个思想并把一个可训练、可收敛的模块嵌入网络。下面给出一个基于 PyTorch 的思路型实现它包含两次深度卷积的局部信息传递配合 1×1 卷积做通道压缩和恢复适合嵌入 YOLO26 的颈部或主干后段。# 文件路径models/lsb_module.py import torch import torch.nn as nn import torch.nn.functional as F class LSB(nn.Module): 局部特征连续传输模块 思路型实现在不改变输入输出尺寸的前提下 通过两个轻量级深度卷积完成局部窗口内的连续特征传递。 def __init__(self, in_channels, ratio4, use_normTrue): super().__init__() hidden_channels max(int(in_channels // ratio), 16) self.reduce nn.Conv2d(in_channels, hidden_channels, 1, biasFalse) self.expand nn.Conv2d(hidden_channels, in_channels, 1, biasFalse) self.dw_conv1 nn.Conv2d( hidden_channels, hidden_channels, kernel_size3, stride1, padding1, groupshidden_channels, biasFalse, ) self.dw_conv2 nn.Conv2d( hidden_channels, hidden_channels, kernel_size3, stride1, padding1, groupshidden_channels, biasFalse, ) if use_norm: self.norm nn.BatchNorm2d(hidden_channels) else: self.norm nn.Identity() self.act nn.SiLU(inplaceTrue) def forward(self, x): identity x # 通道压缩降低后续计算量 x self.reduce(x) # 第一次局部信息传递 x1 self.dw_conv1(x) x1 self.norm(x1) x1 self.act(x1) # 第二次局部信息传递让信息在局部区域内连续流动 x2 self.dw_conv2(x1) x2 self.norm(x2) x2 self.act(x2) # 融合两次传递结果并恢复通道数 x self.expand(x1 x2) # 残差连接保证梯度稳定 return x identity这段代码有几个关键设计需要解释1×1 卷积先降维LSB 模块内部使用1×1卷积把通道先压缩完成局部特征传递后再恢复。这样可以显著减少深度卷积的计算量让模块整体保持轻量。两个深度卷积做连续传递深度卷积的参数量远小于普通卷积但已经能在空间局部窗口内完成信息交换。连续两个深度卷积相当于在局部区域走了两步信息传递更充分。残差连接模块最后保留了原始输入避免因信息变换造成梯度消失也让模块在训练初期更容易收敛。如果你希望模块更强可以把dw_conv1和dw_conv2换成带有空洞卷积的变体或者将第二个深度卷积的 padding 调整为 2 来轻微扩大感受野。但要注意改动过大可能会破坏模块的轻量性。4.2 将 LSB 注册到 YOLO26 网络YOLO26 的网络结构由models/common.py文件中的模块类和models/yolo26.yaml文件共同决定。要让 YOLO26 认识 LSB需要先在common.py中导入并注册这个模块。打开models/common.py在文件开头添加导入# 文件路径models/common.py from models.lsb_module import LSB然后在文件末尾或合适位置添加别名# 注册到 YOLO 模块解析表 def lsb_module(c1, c2, n1): LSB 模块c1 为输入通道c2 为输出通道n 为重复次数。 这里 c1 c2因为模块不改变通道数。 return LSB(c1, ratio4) # 也可以写成标准形式便于 yaml 里调用 m { LSB: LSB, }不同 YOLO 版本对自定义模块的注册方式不同。有些仓库要求把新模块追加到解析字典中有些则会在parse_model函数中动态查找。如果你使用的仓库在加载 yaml 时报Module not found或KeyError: LSB就需要去models/yolo.py中找到模块解析部分把LSB加到支持列表里。4.3 修改 yaml 网络结构YOLO26 的网络结构文件通常以 yaml 格式保存。下面是一个在颈部接入 LSB 模块的示例配置片段。它展示的是在 PAN-FPN 特征融合之前插入 LSB 的一种做法。# 文件路径models/yolo26-lsb.yaml # 这里只展示与 LSB 相关的关键片段 backbone: # ... 原有主干网络结构保持不变 ... # 在 neck 阶段对主干输出的三个有效特征层分别做 LSB 增强 neck: - [LSB, 256] # 对 P3 特征层做局部连续传输 - [LSB, 512] # 对 P4 特征层做局部连续传输 - [LSB, 1024] # 对 P5 特征层做局部连续传输 head: # ... 检测头部分保持不变 ...注意不同 YOLO26 仓库的 yaml 格式差别较大有些仓库的[LSB, 256]写法是[-1, 256, 1, LSB]需要按照实际仓库语法调整。核心思路是在特征图的通道数和空间尺寸不变的前提下把LSB模块作为一个网络节点插入到需要增强的位置。如果你不确定该插在哪一层一个比较稳妥的方法是把 LSB 插在主干网络最后输出的特征层之后以及在颈部上采样之前各插入一次。这样既不会破坏跨层连接又能让重要的特征层获得局部连续传输能力。4.4 开始训练yaml 修改完成后就可以开始训练自己的数据集。训练命令和原版 YOLO26 基本一致只需要将--cfg指向新的 yaml 文件。python train.py \ --data your_dataset.yaml \ --cfg models/yolo26-lsb.yaml \ --weights yolov26s.pt \ --epochs 100 \ --batch-size 16 \ --imgsz 640 \ --device 0如果你的仓库是基于ultralytics风格的数据格式那么data文件需要写成# 文件路径dataset.yaml train: ./datasets/coco128/images/train2017 val: ./datasets/coco128/images/val2017 nc: 80 names: [ person, bicycle, car, motorcycle, airplane, bus, train, truck, boat, traffic light, # ... 其他类别 ... ]训练约 20 个 epoch 后可以先用验证集观察一波指标重点看 mAP50 和 mAP50-95 是否相比原版 YOLO26 有提升。如果训练初期 loss 震荡明显可以适当降低学习率或增加 warmup 轮数。4.5 训练结果观察训练完成后模型会保存到runs/train/exp*/weights/目录下。通常我们需要关注三个文件文件用途best.pt验证集表现最好的权重用于测试和部署last.pt最后一个 epoch 的权重用于恢复训练results.csv训练过程中的指标变化记录通过results.csv里的val/box_loss、val/cls_loss、metrics/mAP50(B)等字段可以判断 LSB 模块是否真的带来了收益。如果在验证集上 mAP 没有提升不要急着否定模块先检查是不是插入位置不合理或训练超参数没有调优。5. 低光与复杂场景下的改进效果5.1 LSB 在低光检测中的可能作用YOLO26 社区中一个很热门的方向是低光环境检测。低光图像通常对比度低、噪声大、边缘信息模糊普通卷积在提取特征时容易把边缘细节“洗掉”。LSB 模块因为强调局部邻域内的连续信息传递在理论上可以在一定程度上保留和增强这些弱特征。不过这并不代表接入 LSB 后低光检测效果一定会大幅提升。低光检测往往还需要配合图像增强预处理、数据增强策略或专门的损失函数。如果你要做低光场景下的 YOLO26 改进建议把 LSB 模块和 Mosaic、MixUp 等数据增强手段一起使用并且用低光图像单独做一次验证集评估。5.2 如何量化改进收益很多刚接触改进项目的同学会有一个误区换了一个模块看了几次 loss 曲线就认为改进有效。实际上衡量一个模块有没有用至少需要以下四组数据原版 YOLO26 在验证集上的 mAP50 和 mAP50-95。加入 LSB 后使用相同训练参数得到的 mAP50 和 mAP50-95。相同硬件条件下单张图片的推理耗时。模块带来的参数量和计算量增量。只有当新模型在精度上有提升且推理耗时和参数量增量在可接受范围内时这次改进才有实际落地价值。建议在实验记录表中把这几项数据统一记录下来方便后续对比和复现。6. 常见问题与排查思路在实际集成 LSB 模块和训练 YOLO26 的过程中经常会遇到一些报错和性能问题。下面把最常见的几类问题列出来并给出对应的排查方法。问题现象常见原因解决思路yaml 加载时报KeyError: LSB模块没有注册到解析字典中在models/yolo.py中找到模块解析处把 LSB 加入支持列表训练时提示shape mismatch输入通道数和 LSB 初始化通道数不一致检查common.py中解析到的c1、c2是否与 yaml 中的通道数一致训练不收敛loss 持续震荡学习率过大或 warmup 不足降低初始学习率增加 warmup epoch 数显存不足 OOMLSB 模块插入过多或批量过大减少 batch size或者减少 LSB 插入次数推理时模型速度明显变慢模块内部深度卷积计算量偏高增大ratio值进一步降低隐藏层通道数验证集精度反而下降插入位置不合理破坏了原有跨层连接尝试把 LSB 插入到特征融合前、主干输出后等非关键路径上如果训练时出现 loss 为 NaN 的情况优先检查以下几个方面是否存在除零操作、BatchNorm 的 momentum 是否设置过高、初始学习率是否过大、输入数据中是否存在异常标注。如果模型完全不收敛可以先把 backbone 权重冻结住只训练新增的 LSB 模块和检测头跑 20 个 epoch 后再解冻整个网络。这样能更快判断模块本身是否有问题。7. 最佳实践与工程建议7.1 改进落地规范在 YOLO26 等项目中做模块改进时建议从一开始就遵循基本的工程规范模块独立成文件不要把自定义模块的代码直接堆在common.py中单独创建models/lsb_module.py保持代码清晰。配置与代码分离不同的网络结构使用不同的 yaml 文件不要反复修改同一个 yaml方便回退对比。实验记录保持完整每次训练前记录数据集、超参数、模块插入位置训练后记录精度、速度、显存占用。后续写改进报告或论文时会轻松很多。先小规模验证再大规模训练先用小数据集、小模型验证模块可以正常收敛再完整训练能节省大量时间。7.2 训练策略建议接入 LSB 模块后建议在原版 YOLO26 训练参数基础上做小范围调整而不是全面改动。学习率可以从原版默认值开始如果发现收敛变慢再适当降低。批大小尽量保持与硬件条件匹配LSB 模块参数量不大通常不需要大幅降低 batch size。如果数据集较小建议使用冻结主干训练的方式让新增模块先稳定下来。使用 AMP自动混合精度训练可以降低显存占用同时保持精度。7.3 部署到边缘设备RK3588的注意事项很多实际项目需要把 YOLO26 部署到 RK3588 这类边缘设备上。RK3588 是瑞芯微推出的一款高性能 SoC支持 NPU 加速和 INT8 量化。YOLO26 接入 LSB 模块后部署流程与普通 YOLO 模型基本一致但有几个细节需要特别注意。首先LSB 模块中的BatchNorm2d在导出 ONNX 时需要被折叠到卷积层中。PyTorch 在导出 ONNX 时通常会自动处理这一步但如果某些仓库的导出脚本没有做优化可能会保留 BN 节点导致边缘端推理速度下降。其次深度卷积groupschannels在部分 NPU 工具链上支持不友好。如果部署时发现 RK3588 上的推理速度异常慢需要检查工具链是否对深度卷积做了优化。针对这种情况一个常见的做法是在部署版本中将深度卷积替换为普通 3×3 卷积虽然参数量略有增加但兼容性更好。导出 ONNX 的通用流程如下python export.py \ --weights runs/train/exp/weights/best.pt \ --include onnx \ --opset 12 \ --simplify导出后使用 RKNN 工具链将 ONNX 模型转换为 RKNN 格式。INT8 量化时建议准备 500 到 1000 张覆盖各类场景的校准图片量化效果会更稳定。7.4 代码与可复现性管理改进项目的代码管理同样重要。建议每次实验都创建一个单独的 Git 分支或标签至少记录以下信息基础代码仓库的 commit ID。数据集版本和路径。修改了哪些文件。训练超参数。训练日志和权重文件路径。这样即使三个月后回头复现实验也能快速定位到当时的代码和配置。对于发论文或做横向项目来说这种规范能省下大量沟通成本。8. 总结与下一阶段学习建议本文从 YOLO26 改进的角度出发详细介绍了 CVPR 2025 nnWNet 中 LSB 局部特征连续传输模块的设计思路和集成方法。我们一起完成了 LSB 模块的代码编写、模块注册、yaml 配置修改和训练流程验证也讨论了低光环境检测、RK3588 边缘部署等实际场景下的注意事项。核心要点可以整理成下面几条LSB 模块的核心是局部连续信息传递不是注意力机制。模块输入输出形状一致可以做到“即插即用”。集成时重点检查模块注册和 yaml 格式避免报错。改进是否有效需要用原版与改进版的精度、速度、参数量数据对比来判断。边缘部署时要关注 BatchNorm 折叠和深度卷积的工具链兼容性。下一步你可以继续沿着两个方向深入学习。第一个方向是网络结构改进尝试把 LSB 与其他注意力机制或特征融合模块结合或者将模块推广到 YOLO26 的检测头内部。第二个方向是部署优化学习 RKNN 工具链的模型转换流程以及量化对精度的影响。无论选择哪个方向都要记住改进模块只是方法最终目标是让模型在真实数据、真实硬件上获得稳定收益。动手把代码跑起来用数据说话才是最有价值的实践。
返回列表