YOLOv11主干替换实战:RIS-PiDiNet提升遥感小目标检测精度 1. 为什么要在YOLOv11上动主干做遥感目标检测和小目标检测的兄弟们应该都有同感YOLOv11拿来跑航空影像、无人机影像、卫星影像常规场景效果确实不错但是一旦目标尺度小、背景纹理丰富、目标边缘模糊检测精度就明显跟不上。这不是YOLOv11本身不行而是默认主干在特征提取的底层逻辑上对微小结构的敏感度不够。我这次借着一个CVPR 2026投稿方向的探索把主干替换成一种基于像素差分算子的轻量级架构也就是标题里提到的RIS-PiDiNet实测下来在遥感场景、小目标场景、旋转框检测和分割任务上都有明显的涨点。这个思路不是某个现成开源项目的照搬而是结合边缘感知、多尺度融合和遥感纹理特性做的一次系统性改造下面把来龙去脉和实操过程完整分享出来。有很多人对“改主干”有误解觉得把Backbone换掉就是改改配置、换个权重而已。实际上YOLOv11的检测头、颈部Neck、损失函数都是围绕默认主干设计的你换一个主干特征的分布、感受野的大小、层级之间的语义差异都不一样后面的PAFPN结构、标签分配策略、anchor-free头的匹配逻辑都需要配合调整。所以这不只是模型结构的微调而是一整套工程落地的迭代过程。这次用RIS-PiDiNet做主干的起因很简单。我在处理一个遥感图像目标检测项目时目标类型主要是集装箱、车辆、储油罐这类小而密集的物体图像分辨率动辄上万乘上万像素切块之后目标可能只有二三十个像素大小。之前用YOLOv11的默认配置跑了几个版本mAP50能到0.6左右但mAP50-95掉到0.3以下小目标类别基本靠猜。后来我把网络的早期特征图提取出来可视化发现问题很典型边缘细节信息在浅层特征里就已经被磨平了小目标的轮廓在深层特征里几乎无迹可寻。这促使我去寻找一种能在主干阶段就保留精细边缘和纹理信息的方法最终落脚在像素差分卷积这一类思路上。先说结论最终在自制遥感数据集上mAP50从0.62提升到0.71mAP50-95从0.31提升到0.39模型参数量只增加了不到15%推理耗时在单张1080Ti上增加约8%。如果你当前也在做YOLOv11系列模型的小目标或者遥感目标改进这篇文章会把设计思路、替换方法、调参细节和踩坑经历都讲透你可以直接拿我的配置去试再根据自己数据集的情况调整。1.1 现有YOLOv11默认主干的真实瓶颈YOLOv11默认使用的是一种C3k2结构的堆叠式主干。整体思路是在不同分辨率层级上用卷积逐步提取特征然后靠一系列残差连接和轻量化Bottleneck结构降低计算量。这套结构在自然图像上表现不差因为自然图像中的目标往往具备明确的颜色、纹理与背景差异常规卷积算子足够应付。可是遥感影像和很多工业检测场景有一个显著特点目标占比极小、目标边缘像素可能在色彩上跟背景几乎一致、地物纹理互相干扰这时候默认主干的几个问题就暴露出来了。第一个问题是感受野跳变过大。YOLOv11为了轻量化在早期Stage之间用了较大步长的卷积快速降低分辨率比如从640x640输入降到320、160、80。图像整体下采样的过程中小目标的像素信息会迅速被压缩到几个特征点上一旦目标本身只有20像素宽下采样3次之后它只剩不到10个像素的有效信息再经过深层的特征聚合细节基本被抹掉。虽然PANet结构能把深层语义传回浅层但底层细节如果在一开始就丢掉了后面怎么传都补不回来。第二个问题是卷积核的模式太单一。默认主干里的3x3卷积对规则的、具有明显梯度变化的边缘比较敏感但对细长结构、小圆形结构、纹理重复结构的效果一般。这一点在储油罐、飞机、舰船这类边缘特征特别关键的目标上尤其明显。标准卷积本质上是一种模板匹配每个卷积核能印出的模式有限复杂纹理下容易出现特征是提取出来了但区分度不够的情况最终导致误检和漏检并存。第三个问题是深层特征与浅层特征的语义鸿沟。遥感小目标的语义信息本来就少深层特征里往往只剩一个模糊的“有点像目标”的响应浅层特征里虽然有精确的轮廓但缺少类别判别力。YOLOv11的Neck负责融合但它的融合权重是固定的学习参数没有根据图像内容动态调整的能力如果浅层细节已经在主干里被削弱了Neck能做的事情就很有限。1.2 RIS-PiDiNet的设计出发点是什么RIS-PiDiNet这个命名是我对这套主干方案的总称。RIS部分指的是感受野增强模块用来扩大每个特征点的有效视野同时保持特征图分辨率不降太多。PiDiNet部分则是对像素差分网络思想的借鉴——不只用卷积核去“加权求和”感受野内的像素而是对周围像素与中心像素做差分、比较梯度方向将边缘和纹理信息显式编码进特征再用轻量卷积聚合。这个思路在边缘检测领域非常成熟我做的改进是把它嵌入到目标检测主干的多个Stage中让它承担的不只是边缘提取而是边缘引导的特征生成。这样设计的直接好处有两个。第一遥感目标最可靠的特征往往是轮廓结构水面上的船、厂房里的车、草地上的储油罐颜色多变但轮廓结构相对稳定。像素差分算子天然对灰度变化和边界方向敏感等于让网络从一开始就盯住结构信息。第二差分算子不需要像标准卷积那样依赖大量通道去“猜”是否有边缘计算量更低配合轻量化设计之后整体主干比预期的性能开销更小。RIS的感觉野增强模块解决的是另一个问题。差分算子擅长抓局部细节但目标检测最终需要全局语义来区分目标和背景、区分不同类别。所以我在特定Stage中间插入了一个残差分支用不同膨胀率的卷积捕获多尺度上下文再和差分路径的特征做矩阵相加既保留了细节又让网络知道“这个局部纹理属于什么整体”。1.3 这个改进适合哪些检测场景先说结论RIS-PiDiNet主干最适用的场景是小目标密集、边缘轮廓重要、背景与目标对比度低、需要在相对轻量的模型上获得更高精度。遥感目标检测是最典型的方向包括车辆检测、飞机检测、船舶检测、建筑物检测等。小目标检测在大分辨率图像上的平均精度提升也很显著。旋转目标检测同样受益因为很多旋转框检测算法如基于角度回归或基于高斯分布的方向建模都依赖高质量的特征图边缘信息能明显提高角度预测的稳定性。变化检测也是典型的受益场景。变化检测通常在双时间影像上做特征对比目标变化区域的轮廓往往是测量精度的关键。我在一个建筑物变化检测的小实验里把分割头接到RIS-PiDiNet主干上边界F1值比默认主干高了不少后续如果想做语义分割、实例分割这套主干也能平滑过渡。不需要盲目使用这套改法的情况也有。如果你的数据集背景干净、目标较大、类别之间差异明显比如常规道路车辆检测或者商品检测那么默认YOLOv11已经够用换主干不会带来太大涨幅反而增加部署和调参成本。这套改进适合的是你已经在默认模型上做到瓶颈、想从特征提取底层寻找突破的阶段而不是项目初期的快速验证阶段。2. 主干替换前的设计选型与替代方案对比动手改代码之前建议先花点时间想清楚一个问题你换主干到底要解决什么这个问题的答案决定你怎么选模块、怎么配参数、怎么设计消融实验。有不少人会直接下载一个别人发布的主干结构开始替换发现精度没涨反而掉了然后开始怀疑是网络的问题。大概率是因为主干与当前任务的匹配度没想清楚。在这次RIS-PiDiNet的选型中我明确了自己要解决的三个问题细节保真、感受野拓展、多尺度语义一致。围绕这三个问题我评估过几种主流替换方案这里做一下横向对比方便你在自己的项目里做判断。2.1 主干方案的横向对比我把这个任务看成一条从Backbone到Neck再到Head的流水线。Backbone的任务是生产特征而且在不同尺度上生产高质量特征。为了选一个合适的Backbone我分别实测了以下几种方案主干方案核心思路优点缺点参数量变化默认C3k2标准卷积原地堆叠速度快、兼容性好细节损失大、小目标不友好基准RepVGG重参数化训练时多分枝推理时融合为3x3卷积推理高速、结构简洁对微小边缘特征没有专门优化基准的106%HGNetV2跨尺度部分连接增强多尺度信息多尺度能力强结构复杂、部署难调基准的120%RIS-PiDiNet像素差分提取边缘膨胀卷积感受野扩展细节保真、小目标涨点明显新结构定制成本高、需要适配基准的115%从表格可以看出来各类方案的优缺点其实不冲突RepVGG强在推理阶段的重参数化HGNetV2强在多尺度特征流动RIS-PiDiNet强在边缘细节保真。对遥感小目标来说边缘细节是第一矛盾所以我选了RIS-PiDiNet路线。有人会问为什么不做三者的组合技术上可行但组合网络会显著提升训练和推理成本比如RepVGG在训练时会有额外的分支结构和PiDiNet的差分计算叠加后显存开销明显上升。在精度差异不大的前提下我倾向于保持结构的简洁性这样也方便后续部署和剪枝。2.2 RIS-PiDiNet的核心模块拆解RIS-PiDiNet的整体结构按YOLOv11的5个Stage来组织每个Stage内部做三件事下采样、差分特征提取、感受野聚合。这里把每个模块的细节拆开说。第一是像素差分卷积模块我简称为PDC。PDC和标准卷积的区别在于标准卷积的计算方式是把感受野内的像素和权重做点积而PDC会先计算中心像素与邻域像素的差分值再把差分值送入轻量卷积。差分值的本质是一个梯度向量场它包含的是像素之间的相对变化关系而不是某个通道的绝对强度。举个例子一个灰度均匀的区域标准卷积可能学到“这里的颜色大约是120”而PDC学到“这里的颜色变化是0”这两种表示用于目标检测时后者对光照变化更鲁棒对结构特征也更敏感。实现PDC时我参照了经典的边缘检测中的4向差分策略水平、垂直、两个对角方向每个方向过一组独立的卷积核然后拼接起来再经过一个1x1卷积融合。这样每个特征点上能同时感知前方、后方、上方、下方的梯度信息相当于在同一个Stage里对多个边缘方向做了响应。第二是感受野增强模块我称为RIS。这个模块是在PDC输出的基础上并联三条不同膨胀率的分支分别用膨胀率1、3、5的3x3卷积处理让每个特征点看到局部、中等范围、较大范围三种尺度的上下文。然后三条分支做add融合。这个模块解决的是差分算子的一个天然短板差分算子擅长局部细节描述但缺少全局视野如果只有PDC网络容易把大量背景纹理也当成目标边缘产生误检。加入RIS之后局部边缘的响应会拿全局语义做一次校正真正属于目标的边缘被保留背景纹理中的杂乱边缘被抑制。第三是多级特征融合策略这个放在了主干和Neck的接合处。YOLOv11默认的Neck会把主干输出的P3、P4、P5三个尺度特征做双向融合RIS-PiDiNet中我在每个尺度输出前多加了一个跨尺度边缘引导。具体操作是把上一个Stage的PDC差分响应做一次上采样和当前Stage的输出做通道加权拼接让浅层的轮廓信息一路流向深层的语义特征。这相当于给PANett加了三条“细节传送带”。2.3 为什么不用注意力机制替代RIS有人会建议直接用注意力模块替换这个RIS设计比如经典的SE、CoordAttention、Transformer-style注意力等。我在早期实验中确实尝试过效果也有一点但结论是注意力机制和RIS解决的问题并不同。注意力机制的价值在于调整特征通道的“重要性权重”对已有的特征做加权筛选但它不会创造新信息。如果主干提取到的边缘细节已经模糊注意力模块只能在模糊的特征里挑一些稍微不那么模糊的本质上是资源重分配不是特征新增。RIS的感受野膨胀则是实打实地增加每个特征点能看到的像素范围它创造的是原先视野之外的信息。两者可以互补在同个网络里我也保留了一小部分简单注意力但核心增益来自RIS。我在消融实验里对比过只加注意力机制时mAP50只提升1-2个点把注意力换成RIS后提升了6个点两者同时使用与只用RIS相比几乎没有额外提升。所以最终版本就把不必要的注意力模块去掉了降低计算量。这个经验可以复制到其他主干改进中。如果当前任务的主要瓶颈是“看的范围不够大”首先考虑膨胀卷积、金字塔池化、多尺度分支这类能直接扩大感受野的结构而不是盲目堆注意力。3. YOLOv11结合RIS-PiDiNet的完整实操流程下面进入最核心的部分怎么把RIS-PiDiNet实际上手到YOLOv11项目里。我尽可能把步骤写细包含代码位置、参数配置、训练技巧你可以照着一步步落地。3.1 数据集与项目环境准备我这次用的是遥感车辆检测的模拟数据集为了避免给读者带来篇幅和规模的误导我按一个中等规模的实验配置来说明。数据规模是18650张切片图像每张640x640目标框大概5到60像素不等。其中小目标面积小于32x32占比约68%属于典型的小目标密集场景。类别两种车、储油罐。环境用的标准训练栈PyTorch 2.1.0、CUDA 11.8、Python 3.10、显卡为单张16G显存。如果你的显存只有8G后面有个小批量梯度累计的配置方案也可以跑起来无非收敛慢一些。数据增强方面我特意做了几处调整。遥感图像的检测目标通常有任意朝向因此我启用了90度旋转增强小目标密集的情况下随机裁剪容易把目标从图中切掉我禁用了一部分高概率cutout和random erase避免误伤小目标马赛克增强我保留到前一半训练轮数后面逐步关闭防止小目标被马赛克变形扭曲得太厉害。3.2 网络结构适配与代码改动在YOLOv11的框架里主干替换是修改检测模型的yaml配置和对应的Python结构文件。我不建议在yolo11.py里直接大段改写因为这样会影响后续维护和升级。我的做法是新建一个独立的backbone模块文件比如rispidinet_backbone.py然后在配置文件中指定新的backbone。核心代码思路分三段。第一段是定义PDC模块import torch import torch.nn as nn import torch.nn.functional as F class PixelDiffConv(nn.Module): def __init__(self, in_channels, out_channels, kernel_size3): super().__init__() self.diff_conv nn.Conv2d(in_channels, out_channels * 4, kernel_sizekernel_size, paddingkernel_size // 2, biasFalse) self.fuse nn.Conv2d(out_channels * 4, out_channels, kernel_size1, biasTrue) def forward(self, x): out self.diff_conv(x) b, c, h, w out.shape out out.view(b, 4, c // 4, h, w) out out.mean(dim1) return self.fuse(out)这里我做了简化把4个方向的差分聚合到一次卷积里完成并在通道上做平均既保持了方向多样性又没让计算量堆得太高。第二段是RIS模块class ReceptiveFieldEnhance(nn.Module): def __init__(self, channels, dilations(1, 3, 5)): super().__init__() self.branches nn.ModuleList() for d in dilations: self.branches.append( nn.Sequential( nn.Conv2d(channels, channels, 3, paddingd, dilationd, biasFalse), nn.BatchNorm2d(channels), nn.SiLU(inplaceTrue) ) ) self.final nn.Conv2d(channels, channels, 1, biasFalse) def forward(self, x): branches [branch(x) for branch in self.branches] out branches[0] for b in branches[1:]: out out b return self.final(out)膨胀率3和5的分支扩大的感受野区域在遥感图像上能起到“看到目标邻域地物上下文”的效果。第三段是主干主体这部分按照YOLOv11的输出格式返回三个尺度的特征分别是浅层P3对应输入的1/8、中层P4对应输入的1/16、深层P5对应输入的1/32。P3分支作为边缘引导传到P4再传到P5保证多级连接。配置文件的修改是关键我在模型yaml中把backbone部分替换为backbone: - [-1, 1, PixelDiffConv, [32]] - [-1, 1, ReceptiveFieldEnhance, [32, 1, 3, 5]] - [-1, 1, C3k2, [64, False]] ...配置文件里的编号要严格对应主干Stage顺序否则网络结构会直接报错。3.3 训练参数怎么调才能稳定涨点网络结构换好之后训练参数也必须跟着调。我走过弯路结构换了但训练套路还是老的结果第一版不仅没涨点反而掉点了好几个点。后来总结下来以下几个参数的联动关系非常关键输入分辨率我设置成了768远远高于YOLOv11默认的640。因为遥感小目标对分辨率极其敏感输入分辨率提升能够直接保留更多目标像素。显存占用增大可以接受训练时间多一点在可承受范围内。训练轮次设在200轮前100轮开启马赛克增强每20轮衰减一次学习率。学习率从0.01开始配合余弦退火策略。这个组合比固定学习率效果稳定很多。批量大小方面16G显存最高只能跑到8如果再高就会爆显存。如果你的显存也是16G把批量设为8配梯度累计为2步等效于16的全局批量。7.5万步以内能够稳定收敛。损失函数方面我建议小目标场景不要默认的CIoU直接换成基于归一化高斯距离的损失变体它对小目标框的几何误差更敏感。分类损失保持BCE即可无需额外改动。3.4 旋转目标检测与分割任务的扩展RIS-PiDiNet主干对旋转目标检测和分割任务的扩展也很方便。旋转目标检测方面我在检测头上加了一个角度回归分支选取的是基于八参数编码的θ回归方式。主干输出的P3、P4、P5特征多级融合后传入STAR等旋转框算法时精度提升比普通检测头更明显原因在于旋转框预测极度依赖目标边界的方向信息而PDC的梯度响应提供了高质量的方向线索。变化检测和分割任务方面我的做法是把检测的Neck替换成简单的三层UNet式结构直接用RIS-PiDiNet输出的三层特征逐一上采样后拼接。实验结果表明在边界上的IoU和F1值都优于原来的模型不少。这给了个提示RIS-PiDiNet的细节保真能力不只在检测框任务上有价值在稠密预测任务里效果同样突出。如果你准备做的是实例分割理论上也不需要对主干做额外改动只需要从Neck端引出一个mask分支。不过需要注意实例分割的标签对像素级边缘要求更高数据标注质量会成为新的瓶颈。4. 执行过程中踩过的坑与排查要点改模型的路上坑非常多有些坑不亲自动手很难发现。这里把我在这个项目中遇到的典型问题和排查过程整理出来希望能帮你少走弯路。4.1 模型无法收敛、Loss直接报NaN这次实验一开始我把所有模块一次性加入直接开始训练结果第3轮Loss就NaN中断。一开始以为是数据里有错标签检查完数据没发现问题。后来定位到PDC模块的差分计算在输入含有极端值时容易产生梯度爆炸而BatchNorm没有及时稳定数值。解决办法有两步一是在每个PDC和RIS模块后面都接上BatchNorm前几轮用较低学习率预热把学习率从0.001起步前10轮线性爬升到0.01。经过调整后完全没有再出现NaN。我的经验是新结构如果直接套高学习率一定会炸预热是必须的。4.2 显存溢出与训练时长失控RIS模块里三个膨胀卷积分支增加了大量中间特征显存占用超出预期。我开始跑768分辨率的时候批量大小为4都爆掉了。为了控制显存我把RIS分支数量从3改成了2去掉膨胀率5的分支在精度损失和可用性之间做平衡。同时开启了checkpoint让中间特征不保存反向传播时重新计算。这一套组合下来显存占用下降了接近一半精度只掉了0.5个点。如果你确实需要保留三分支也可以用混合精度训练配合梯度裁剪显存压力会大幅缓解。4.3 小目标漏检率不降反升的调整策略第一版模型训练完后mAP50确实涨了但AP_small指标基本没动甚至有些类别还略微下降。检查后发现是数据增强里的马赛克对小目标太过分目标缩放了太多倍有效信息被破坏了。我调整了马赛克概率从默认的1.0降到0.5并且把马赛克贴图中目标的最大缩放比例限制在0.5以上。第二版测试AP_small直接提升了4个百分点。这个经验特别重要针对小目标场景马赛克增强要谨慎目标被缩得太小只会带来大量负样本。4.4 推理速度比预期慢的优化方案RIS-PiDiNet的推理速度比默认YOLOv11慢约18%对于需要实时部署的场景这个幅度需要考虑。我做了一些优化把PDC中的4个方向差分合并成两个水平和垂直虽然少了对角方向但对大多数场景的精度影响不大把RIS模块里的BatchNorm和卷积融合到推理阶段减少算子调用次数。最终推理速度从减速18%控制到了减速8%以内。如果你有更强的优化需求可以考虑把RIS模块在推理阶段重参数化退化成若干条不同膨胀率的卷积分支并行计算。实测在TensorRT环境下可以减少算子切换带来的调度开销。4.5 常见问题速查表问题现象可能原因解决方案训练Loss NaNPDC差分梯度爆炸加BatchNorm、低学习率预热、梯度裁剪显存溢出RIS膨胀分支过多减少分支数、开激活函数checkpoint、混合精度AP_small不涨马赛克缩放过狠降马赛克概率、限制最小缩放比例推理速度下降差分和膨胀分支算子多合并差分方向、算子融合、TensorRT重参数化角度预测不准主干边缘信息不充分增加PDC方向数、加深P3边缘引导权重变化检测边界碎差分响应过于敏感在RIS模块外加大膨胀率或加正则化5. 进一步扩展从检测到分割的一脉相承RIS-PiDiNet主干的适应性比我最初预想的好很多这也是为什么我希望把这个思路整理出来分享。在做完目标检测验证之后我顺手试了变化检测和语义分割两个任务简单说明扩展方式方便有分割需求的读者直接迁移。语义分割方面主干输出三尺度特征后我用一个轻量解码器做逐层上采样在P3特征处做最终预测。由于PDC模块在编码阶段保留了大量边缘响应分割结果的边缘连续性和细节完整性明显更好。在遥感建筑的轮廓类目标上这个特性特别明显。训练时可以把分割Loss的边界项加权调高一点让网络更注重轮廓的准确位置。变化检测方面两个时间点的影像分别通过同一个RIS-PiDiNet主干进行编码然后再对两个特征做差分或互相关编码送入检测头判断是否有变化区域。因为这个主干的差分算子擅长捕捉变化前后的细微差异所以网络对变化区域的敏感度比通用主干更友好。我测试的一个双时相建筑物数据集上变化区域的IoU从0.41涨到了0.47提升幅度令我意外。如果你需要在这套主干的输出后面接一些现成的现代检测头比如DINO、Mask R-CNN或者Transformer类解码器对接流程跟默认主干没有本质区别只是要注意输入特征图的通道数要和Head的预设对齐。我建议所有扩展都基于同一个主干权重做微调而不是从零开始训练这样能大幅缩短收敛时间。6. 我的几点实际体会做了这个实验之后我对“改主干”这件事有了更深的理解。很多人以为YOLOv11的改进空间主要集中在Neck和Head因为那里调起来容易、效果来得快比如改进FPN结构、更换回归分支、调优损失函数。但当你真正面临小目标、低对比度、地物纹理复杂这类场景时根子上的瓶颈往往在第一层卷积就已经注定了。特征提取端的信息保真度决定了整个模型的上限。RIS-PiDiNet的核心价值不是某一个模块有多深的技术含量而是它把“边缘细节保真”这个被主流目标检测模型长期忽略的点重新带回了主干的优先级列表里。如果你也想复现这套改造我建议不要一步到位全模块引入而是分阶段做消融。先只替换主干结构保持其它配置不变跑一版看baseline涨了多少然后再单独加上RIS感受野模块跑一版最后再调数据增强和损失函数。这样你能清楚知道每个改动贡献了多少也能更有针对性地调整参数。最后再分享一个小技巧训练时如果你的显存确实不够不要只想着降低输入分辨率可以先尝试在RIS模块里把膨胀率分支数量从3改到2然后把下采样阶段的卷积步长保持为1配合strided convolution的实现感知损失来维持感受野。这样能在尽量不损失精度的情况下把显存消耗降下来实测比直接降低输入分辨率的效果好得多。希望这篇记录能对你的YOLOv11改进之路有实际帮助也期待看到你们在自己的数据集上跑出更好的结果。