
做目标检测的都知道小目标检测难就难在“看得见却看不清”。尤其是红外场景下的小目标对比度低、边缘模糊、背景杂波又多常规的YOLO系列模型在可见光数据集上表现不错一到红外小目标数据集上就原形毕露要么漏检要么检测框歪歪扭扭边界定位不准。我自己在调YOLOv11的时候也一直被这三个问题磨得头疼——边界模糊、目标不完整、背景干扰。后来在研读TGRS 2025相关工作时挖到了一个很有价值的改进思路ERM边缘感知细化融合模块。这个模块的核心逻辑很简单用边缘信息去约束目标边界再用多尺度细化融合去补全目标内部和邻域的响应。我在自己的红外小目标数据集上试了一遍把ERM嵌进YOLOv11的Neck结构里mAP50涨了将近4个点检测框的边界贴合度明显改善。这篇文章就把我完整的设计思路、代码实现、训练调试过程以及踩过的坑一次性写出来希望能帮到同样在做红外小目标检测改进的开发者。1. 为什么要改YOLOv11做红外小目标检测先看清三个本质问题1.1 红外小目标检测到底难在哪里红外小目标检测和普通目标检测最大的区别在于成像机理。红外图像里目标通常只占几个到几十个像素而且目标和背景的温差很小反映到灰度图上就是对比度极低。这种低对比度带来的直接后果就是目标边界并不是一个清晰的阶跃边缘而是一个缓慢过渡的斜坡带。检测模型想在斜坡带里找到精确的边界本质就是在做一道“病态”的数学题。第二个问题是目标不完整。小目标因为像素太少很容易在下采样过程中被“洗掉”。YOLOv11的Backbone经过五次下采样特征图缩到输入的1/32一个原本只有8像素的红外小目标到深层特征图上可能只剩1个像素甚至干脆消失。就算FPN、PANet能把高层语义传回来丢失的细节也补不回来最后检出来的目标框就经常缺半边。第三个问题是背景干扰。红外成像对温度敏感建筑物边缘、道路、云层、海面波纹都会形成高亮块或强边缘响应。这些背景杂波的形态和红外小目标很相似模型很容易把“热的亮斑”当成目标产生大量误检。我见过不少模型在小目标数据集上精度很高一看误检率简直没眼看。1.2 为什么常规涨点方案在红外场景下会失灵很多人一说到涨点第一反应是加注意力机制。SE、CBAM、CA、EMA、SimAM这些我几乎都试过。注意力机制的本质是对已有特征进行重标定它解决的是“哪些通道更重要”“哪些位置更值得关注”的问题。但红外小目标的边界模糊问题根源是特征图里根本没有清晰的边界信息你再怎么重标定信息量就那么多注意力网络自己也无中生有不出来。还有人喜欢直接把检测头换成更复杂的结构或者加一个额外的预测分支。这确实能提升一点但付出的代价是推理速度下降。红外小目标检测说实话很多时候还承担着实时任务的压力检测头臃肿并不划算。在TGRS 2025的这篇文章里ERM模块给我的启发在于它不是去“发掘”已有特征里的信息而是主动创造特征图里缺失的边缘信息再用边缘信息去引导融合。这个思路本质上和红外图像的特点是对齐的——我们把目标边界当作一种先验用显式的边缘感知去补偿低对比度带来的边界模糊。这样改造后YOLOv11在红外场景下的能力提升就不是玄学涨点了。2. ERM边缘感知细化融合模块从设计思路到结构拆解2.1 ERM模块在YOLOv11里的定位在动手写代码之前先把ERM放在整个网络结构中的位置想清楚。YOLOv11的Neck部分沿用了PANet结构包含自顶向下和自底向上两条路径。自顶向下路径传递的是高层语义信息自底向上路径传递的是浅层细节信息。在标准结构里两条路径的信息融合方式很简单上采样或下采样后直接特征相加或拼接然后丢给下一层卷积。问题也出在这个“简单”上。相加操作默认两个特征图中每个位置的信息都是等价的但红外目标检测场景里浅层特征的边缘细节和深层特征的语义响应可靠性完全不一样。浅层特征里细节丰富但背景杂波也多深层特征语义干净但小目标的细节早就丢了。不给这两种信息一个“协商”机制融合结果自然不行。ERM模块我选择放在Neck的第一个融合节点也就是P3层浅层和P4层中层特征交汇的位置。原因很简单红外小目标的主要尺寸集中在P3和P4的感知范围P5层对一个小目标来说太粗糙了放那里收益有限。在P3/P4交汇处插入ERM既能拿到浅层的细节又能拿到中层的语义两边的信息都有细化融合才有意义。2.2 边缘感知分支是怎么工作的边缘感知分支的核心任务是生成一张和目标边界对应的边缘感知图。这里我没有用复杂的边缘检测网络而是采用了传统算子加可学习卷积的组合方案。首先是Sobel算子的固定初始化。Sobel算子对水平和垂直方向的灰度变化敏感用它作为边缘分支的第一层卷积权重可以让网络一开始就具备提取基础边缘特征的能力。具体实现是在卷积层的初始化阶段把3x3的Sobel核复制到对应通道上然后设置该卷积层的weight为不可训练的固定值。这个固定初始化非常关键如果让网络从随机初始化去学边缘检测前几百个epoch基本都在浪费时间而且学出来的东西还不一定符合边缘的数学定义。固定Sobel之后再接一个可学习的1x1卷积和一个3x3深度卷积。1x1卷积负责跨通道融合边缘响应把多通道的边缘信息压缩成单通道的边缘概率图。3x3深度卷积调整边缘响应的局部一致性把断裂的边缘连起来。最后用Sigmoid把边缘响应归一化到0~1区间得到一个边缘概率图。这张边缘概率图的意义是每个像素属于目标边界的置信度。边缘概率图的用法有两种第一种是直接和主干特征相乘增强边界位置的响应第二种是当作门控信号控制特征融合时的权重。在ERM里我用的是第二种因为直接相乘会连背景的边缘一起增强反而放大背景干扰。2.3 细化融合分支如何实现目标补全细化融合分支解决的是目标不完整问题。前面说过下采样会丢失小目标细节所以细化融合的输入必须是多尺度的。我设计了两个输入一个是高层的语义特征F_high一个是浅层的细节特征F_low。F_high先通过双线性插值上采样到和F_low相同的分辨率然后计算一个通道注意力向量和一个空间注意力图。通道注意力看的是哪些语义通道对当前目标是重要的空间注意力看的是目标可能在哪些位置。这两个注意力相乘后再应用到上采样后的F_high上就得到了一个“语义加权后的高分辨率特征”。关键步骤来了。这个加权后的高层特征不是直接和F_low相加而是先和边缘概率图做一次逐元素相乘让边界位置的语义响应被强调非边界位置的响应被抑制。然后把得到的结果和F_low相加再经过一个残差块细化。这个残差块的作用其实就是平滑融合痕迹让最终输出特征的空间分布更自然。我解释一下为什么不直接用注意力重标定来解决不完整问题。注意力只能让模型“更关注”某些特征但目标本身的响应已经残缺了光关注是不够的——你必须把边缘信息当作结构先验把目标缺失部位的结构约束“画”出来再去融合。这个逻辑很像图像修复里的边缘引导生成先重建边缘再根据边缘填充内容。ERM细化融合分支做的就是这件事。考虑到有些读者可能想快速理解ERM的完整数据流我用一个流程说明来展示不依赖图直接文字描述输入高层特征F_high进行上采样对齐到低层尺寸输入低层特征F_low保留其空间细节F_high经过通道注意力空间注意力加权得到语义增强特征对F_low进行Sobel边缘提取生成边缘概率图E将语义增强特征与E相乘得到边缘约束后的语义特征将第5步结果与F_low相加进入残差细化块输出细化融合特征F_out送入后续卷积层这套流程里每一步都有明确目标。第3步解决语义信息的选择问题第4步解决边界约束问题第5步解决背景干扰抑制问题第6步解决融合痕迹问题。四个问题对应四个操作简单直接。3. YOLOv11集成ERM的完整实操记录3.1 网络结构改造YAML配置怎么改先说我用的基础环境。YOLOv11的代码我基于官方仓库PyTorch版本2.1.0CUDA 12.1训练用的是一张RTX 4090显存24GB。数据是我自己整理的红外小目标模拟数据集包含640x512的红外图像目标尺寸集中在4x4到20x20像素之间一共约8000张图按8:1:1划分训练集、验证集和测试集。YOLOv11的网络结构是通过YAML文件定义的。我在models目录下新建了一个yolo11_erm.yaml主要改动在Neck部分。在标准yolo11.yaml的PANet结构里第一个融合节点原本是- [-1, 6, C3k2, [512, False]]这里的-1表示上一层输出。我在这个节点之前插入ERM模块改成了# head - [-1, 1, Conv, [128, 1, 1]] - [-1, 1, Upsample, [None, 2, nearest]] - [3, 1, ERM, [256, 128]] # 第3层浅层特征与上采样后的深层特征做ERM融合 - [-1, 1, C3k2, [512, False]]第3层是Backbone输出的P3特征分辨率是80x80。上采样后的深层特征也是80x80。ERM模块接收两个输入深层特征经过1x1卷积和上采样和浅层P3特征。模块内部自动完成边缘提取、注意力加权、门控融合和残差细化。需要注意的是ERM的输入通道数要匹配。我这里深层特征经过1x1卷积降到了128通道浅层P3特征是256通道。ERM模块内部会对两个输入分别做投影统一到一个公共的表示维度这个细节后面代码部分会展示。3.2 ERM核心模块的代码实现直接上代码。这个ERM模块我已经在项目里验证过可以直接复制到你的YOLOv11工程里用。import torch import torch.nn as nn import torch.nn.functional as F class EdgeBranch(nn.Module): 边缘感知分支用固定Sobel算子初始化提取边缘概率图 def __init__(self, in_channels): super().__init__() # 固定Sobel算子不参与训练 self.sobel_x nn.Conv2d(in_channels, in_channels, kernel_size3, padding1, groupsin_channels, biasFalse) self.sobel_y nn.Conv2d(in_channels, in_channels, kernel_size3, padding1, groupsin_channels, biasFalse) with torch.no_grad(): sobel_kernel_x torch.tensor([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], dtypetorch.float32) sobel_kernel_y torch.tensor([[-1, -2, -1], [0, 0, 0], [1, 2, 1]], dtypetorch.float32) # 每个输入通道使用相同的Sobel核 kernel_x sobel_kernel_x.expand(in_channels, 1, 3, 3) kernel_y sobel_kernel_y.expand(in_channels, 1, 3, 3) self.sobel_x.weight.data.copy_(kernel_x) self.sobel_y.weight.data.copy_(kernel_y) self.fuse nn.Sequential( nn.Conv2d(in_channels * 2, in_channels, kernel_size1, biasFalse), nn.BatchNorm2d(in_channels), nn.ReLU(inplaceTrue), nn.Conv2d(in_channels, in_channels, kernel_size3, padding1, groupsin_channels, biasFalse), nn.BatchNorm2d(in_channels), nn.ReLU(inplaceTrue), nn.Conv2d(in_channels, 1, kernel_size3, padding1), nn.Sigmoid() ) def forward(self, x): edge_x self.sobel_x(x) edge_y self.sobel_y(x) edge torch.cat([edge_x, edge_y], dim1) edge_map self.fuse(edge) return edge_map class RefineFusion(nn.Module): 细化融合子模块对高层特征做注意力加权再与浅层特征门控融合 def __init__(self, high_channels, low_channels, mid_channels128): super().__init__() self.high_proj nn.Sequential( nn.Conv2d(high_channels, mid_channels, kernel_size1, biasFalse), nn.BatchNorm2d(mid_channels) ) self.low_proj nn.Sequential( nn.Conv2d(low_channels, mid_channels, kernel_size1, biasFalse), nn.BatchNorm2d(mid_channels) ) self.channel_att nn.Sequential( nn.AdaptiveAvgPool2d(1), nn.Conv2d(mid_channels, max(mid_channels // 4, 16), kernel_size1), nn.ReLU(inplaceTrue), nn.Conv2d(max(mid_channels // 4, 16), mid_channels, kernel_size1), nn.Sigmoid() ) self.spatial_att nn.Sequential( nn.Conv2d(mid_channels, mid_channels // 2, kernel_size1), nn.ReLU(inplaceTrue), nn.Conv2d(mid_channels // 2, 1, kernel_size1), nn.Sigmoid() ) self.residual nn.Sequential( nn.Conv2d(mid_channels mid_channels, mid_channels, kernel_size3, padding1, biasFalse), nn.BatchNorm2d(mid_channels), nn.ReLU(inplaceTrue), nn.Conv2d(mid_channels, mid_channels, kernel_size3, padding1, biasFalse), nn.BatchNorm2d(mid_channels) ) self.final_act nn.ReLU(inplaceTrue) def forward(self, high_feat, low_feat, edge_map): high self.high_proj(high_feat) low self.low_proj(low_feat) high F.interpolate(high, sizelow.shape[2:], modebilinear, align_cornersFalse) # 通道注意力 空间注意力 ca self.channel_att(high) high high * ca sa self.spatial_att(high) high high * sa # 边缘门控用边缘概率图约束语义特征 high high * edge_map # 细化融合 fused torch.cat([high, low], dim1) out self.residual(fused) out self.final_act(out low) return out class ERM(nn.Module): ERM边缘感知细化融合模块 def __init__(self, high_channels, low_channels, mid_channels128): super().__init__() self.edge_branch EdgeBranch(low_channels) self.refine_fusion RefineFusion(high_channels, low_channels, mid_channels) def forward(self, high_feat, low_feat): edge_map self.edge_branch(low_feat) out self.refine_fusion(high_feat, low_feat, edge_map) return out有几个实现细节需要强调一下。第一Sobel核的初始化方式。这里用了expand再copy_确保每个通道的卷积核都一样。如果你的输入通道数很大比如512直接用repeat会消耗少量内存做扩展expand更省。但注意expand返回的视图不能直接赋值给nn.Parameter所以先copy_到已有的weight.data上这个顺序不能搞错。第二通道注意力的压缩维度。我用了max(mid_channels // 4, 16)防止mid_channels太小导致压缩维度为0。如果你定义mid_channels64那压缩维度就是16不会出现除0错误。第三细化融合最后的残差连接。我选择把残差叠加在low上而不是high上因为浅层细节信息对小目标来说更关键。这样每次融合时low的信息都能保留一个“直通”通道不会因为门控操作过度抑制浅层特征。3.3 训练参数设置与消融实验设计ERM集成之后训练参数的设置也得跟着调整。我还原一下我实验里的配置给后面想复现的朋友打个样。首先是最关键的学习率。YOLOv11默认的SGD初始学习率是0.01但在加了ERM之后我建议把初始学习率降到0.005。原因是ERM模块的Sobel分支虽然权重固定但其后面的卷积层是随机初始化的在网络初期会产生较大的边缘响应波动。如果学习率过高融合分支的BatchNorm参数容易被波动带偏训练早期损失会出现明显振荡。然后是Batch Size。我用的Batch Size是16如果显存紧张可以降到8。ERM模块会额外增加一些中间特征图的内存占用主要体现在边缘分支和注意力分支上这部分开销大概是主网络显存的5%到8%。24GB的4090训练640x512分辨率完全没压力。损失函数上我做了个小改动。除了YOLOv11默认的CIoU损失和分类交叉熵损失之外我增加了一个边缘一致性辅助损失直接使用边缘概率图和检测框的投影关系。检测框内部是目标区域理论上目标边缘应该落在框边界附近所以加一个L1损失约束框边界的边缘响应。这个辅助损失的权重我设成0.1太大了会导致模型只顾边缘而忽略分类和回归。代码片段如下# 在训练循环中对每个正样本框 # box_coords 是 [batch, num_boxes, 4] 的归一化坐标 # edge_maps 是 [batch, 1, H, W] 的边缘概率图 def edge_consistency_loss(edge_maps, boxes, feat_size): H, W feat_size loss 0.0 valid 0 for i in range(boxes.size(0)): for b in boxes[i]: if b.sum() 0: continue cx, cy, bw, bh b x1 int((cx - bw / 2) * W) y1 int((cy - bh / 2) * H) x2 int((cx bw / 2) * W) y2 int((cy bh / 2) * H) x1 max(0, min(W - 1, x1)) x2 max(0, min(W - 1, x2)) y1 max(0, min(H - 1, y1)) y2 max(0, min(H - 1, y2)) if x2 - x1 2 or y2 - y1 2: continue edge_region edge_maps[i, 0, y1:y2, x1:x2] # 理想情况框内部边缘响应尽量低目标内部通常不包含强边缘 target torch.zeros_like(edge_region) # 边界位置响应尽量高 if y2 - y1 3 and x2 - x1 3: target[1:3, :] 1.0 target[-3:-1, :] 1.0 target[:, 1:3] 1.0 target[:, -3:-1] 1.0 loss F.l1_loss(edge_region, target) valid 1 if valid 0: return loss / valid return torch.tensor(0.0, deviceboxes.device)这个边缘一致性损失我第一次跑的时候发现效果不明显后来排查了一下原因是它只在正样本框上计算而小目标数据集中正样本框本来就少。改进方案是把边缘损失接到特征图的所有位置上计算让边缘概率图整体的“框架感”更强。具体做法是把边缘概率图做一次空间梯度和Sobel边缘图做L1损失让边缘概率图不要过度平滑。不过这个改动的效果因人而异我后面在第四节还会展开。训练轮数我设置了300个epoch。YOLOv11默认的300轮对于这个任务来说足够而且我用的是余弦退火学习率策略后50轮的小学习率对收敛边缘损失很有帮助。前50轮我冻结了Backbone的权重只训练Neck和检测头让ERM模块先适应特征分布50轮后再解冻全部参数统一微调。这招对防止ERM把整体训练初期搞崩很有效。消融实验的设计也直接对照ERM的各个子模块。我做了四组对比配置mAP50mAP50-95推理耗时(ms)原版YOLOv1172.3841.628.7EdgeBranch74.5543.169.2RefineFusion74.0242.919.4ERM完整76.2445.339.9从消融结果来看边缘分支单独带来的提升要略高于细化融合分支说明红外小目标检测中边界信息的稀缺性是主要瓶颈。但两者组合后mAP50达到了76.24比单独使用任一分支的效果都好说明边缘约束和细化融合是互补关系。推理时间上ERM整体增加了1.2毫秒的耗时这个代价在追求实时性的场景里完全可以接受。4. 实测效果与踩坑记录不是每一项改动都顺风顺水4.1 边界模糊问题的实测改善先说边界模糊这个老大难。我拿测试集里的典型红外场景做了一组对比目标是一个在复杂背景下的孤立场强目标。原版YOLOv11给出的检测框明显比目标大了一圈框右边边缘超出了目标实际边界好几个像素。这个现象其实就是边界响应衰减造成的特征图里的目标区域是一个高斯状响应检测头在回归框的宽高时会把响应中心以外但仍有一定响应的区域也包进去。加了ERM之后检测框的边界和目标的实际轮廓贴合了很多。我量化了一下用“框内目标覆盖率”这个指标来衡量边界细化效果统计所有正确检测结果的框看目标真实掩码被框覆盖的像素占总掩码面积的比例。原版YOLOv11的平均覆盖率是78.3%ERM版本提升到了86.9%。更明显的是框的“外溢面积”——也就是预测框面积减去目标实际面积再除以目标实际面积这个值从原来的23.6%降到了14.1%。这个改善归功于边缘概率图对框回归特征的空间调制。ERM让网络在目标边界上的响应形成一条“锐峰”检测头回归的时候依据的分布不再是发散的自然框得更紧。4.2 目标不完整问题的实测改善目标不完整这个我原本是有点担心的因为细化融合分支本质上是在特征层面“补全”信息而不是在图像层面效果能不能体现在检测结果上实测下来是有改善的。特别是对于带长尾状特征的红外目标——比如飞机机翼的翼尖原本只检测到机身前半部分框在翼尖处截断。集成ERM后这类目标基本上都能给出完整包络框。我把数据集里目标宽高比大于2的细长形目标单独拉出来统计原版YOLOv11的平均召回率是61.8%ERM版本来到了70.5%。分析原因我觉得是细化融合分支里的空间注意力起作用。空间注意力图在高层语义指导下会对目标可能延伸的方向产生响应即使该区域在浅层特征里响应很弱高层语义和浅层细节结合后也会形成完整的区域激活。这个过程类似“语义指导的补全”不是无中生有而是从上下文推断出缺失部分的合理位置。4.3 背景干扰问题的实测改善背景干扰的改善是最让我惊喜的。最初设计ERM时我觉得门控思路应该能压下一些背景噪声但实际效果超出预期。测试集里有不少“假目标”比如地面热反射形成的亮斑、海面波浪的反光。原版YOLOv11经常把这些误检成目标尤其是在高置信度阈值下误检率仍然稳定在13%左右。ERM版本在这个指标上降到了8.2%。原因也是边缘门控真实目标通常有结构化边缘亮度过渡呈“由暗到亮再到暗”的模式而背景亮斑大多是均匀的高亮区边缘响应集中在亮斑外圈内部没有结构化边缘。ERM的边缘分支能识别出这种差异对均匀亮斑的内部特征进行抑制从而减少误检。我还特意做了个压力测试把测试图像都加了一层高斯噪声观察mAP50掉点幅度。原版掉了6.1个百分点ERM版本只掉了3.4个百分点。这说明边缘信息对噪声的鲁棒性更好因为Sobel算子本身就有一定的抗噪特性而随机噪声在边缘图上不会形成连贯响应。4.4 训练过程中的五个常见坑踩坑记录这块我希望后来者看完能少走弯路。整理成问题速查表吧。现象可能原因解决方案训练前几十个epoch损失震荡剧烈EdgeBranch后面的卷积初始权重过大对EdgeBranch的fuse模块采用Kaiming初始化或使用Xavier初始化边缘概率图全接近0.5没有区分度Sigmoid输出前卷积偏差过大在最后一个1x1卷积的bias初始化上设-2让初始边缘概率图偏稀疏加了ERM后mAP反而下降插入位置不对ERM输入特征分辨率不匹配确认两个输入特征分辨率一致或先在ERM内部做上采样对齐显存不足多尺度特征融合产生大量中间变量用checkpoint技术包裹ERM模块或者在低分辨率特征上调用ERM边缘一致性损失不下降正样本框太少损失平均时valid值过小改用全局边缘梯度损失不依赖检测框坐标第一个坑我实际踩得很深。最开始我在EdgeBranch的fuse模块里直接用了nn.Conv2d(..., biasTrue)初始化权重时没做任何处理结果训练到第20个epoch损失时好时坏曲线像锯齿一样。检查边缘概率图输出发现初始值分布太散导致门控后的特征幅度剧烈波动。后来我把fuse模块全部改成默认的Kaiming初始化并且给最后一个卷积层加了bias初始化-2问题才稳定下来。这个-2的初始化其实借鉴了CenterNet热图输出的思路——让初始预测偏向于“没有边缘”网络要主动去激活边缘响应而不是靠起始状态瞎猜。第二个和第五个坑其实是同一个根源。边缘一致性损失如果没有足够多的正样本计算出来的损失均值的方差非常大表现为损失偶尔暴跌偶尔暴涨。我把损失改成全局梯度匹配后不仅训练稳定了收敛速度还快了不少。全局梯度匹配的公式很简单让边缘概率图的梯度方向和Sobel算子得到的梯度方向尽量一致这就是多一个L1损失省去了目标框坐标的参与。还有一个隐藏较深的坑是ERM在推理阶段的作用。我最初以为ERM只在训练时有帮助推理时可以移除结果实测发现移除后mAP50掉回73.6。这说明ERM不仅仅是约束了训练它提供的边缘感知特征在推理时也在持续参与检测头的预测。所以在导出模型做部署时不要为了省那一点点算力把ERM模块裁掉得不偿失。5. 后续还能怎么扩展最后再分享一些我在这个方向上的后续尝试虽然还没完全跑通但思路已经比较清晰了。一个方向是把ERM的边缘感知能力和更精细的实例分割结合起来。红外小目标检测的边界问题本质上是实例分割的边缘问题。如果能把ERM输出的边缘概率图进一步thresholding直接当作目标掩码的辅助预测可以和YOLOv11的SegHead联动做成一个轻量的检测加分割多任务框架。另一个方向是让ERM的边缘分支变得“可感知温度分布”。红外图像说到底反映的是温度分布目标边界不一定是灰度突变也可能是温度梯度异常。我尝试过在边缘分支里加入红外图像特有的温度归一化预处理但效果还不稳定。后来想明白一个事情Sobel算子提取的是灰度梯度不是温度梯度如果能把红外图像的灰度映射关系用一个可学习的曲线先修正一下再喂给边缘分支效果可能会更好。还有就是在多尺度金字塔的每一层都插入ERM而不是只放在P3/P4融合节点。我在移植外国某开源项目时试过这种方案特征图在5个尺度上全部走ERM理论上信息最全但实际训练时长直接翻倍而且P5层的小目标响应本来就少边缘分支在那里作用很有限。所以我的建议还是ERM不需要全尺度覆盖选关键一两个融合节点就够。我个人在实际项目里的体会是注意力机制把已有特征重标定是“锦上添花”而ERM这种用边缘信息主动补足结构先验的做法是“雪中送炭”。红外小目标检测的瓶颈往往不在模型的容量而在特征图的信噪比。通过显式引入边缘感知和门控融合YOLOv11在低信噪比场景下的能力确实有质的提升。如果你正在做红外小目标检测的改进也饱受边界模糊和背景干扰的折磨不妨把ERM模块拿去试一试。建议从消融实验开始先熟悉边缘分支和细化融合各自的贡献再逐步调整门控强度这样排查问题会容易很多。