【模型改进】SBA 改进 YOLO 系列:用选择性边界聚合替换 Concat,增强 VisDrone 多尺度小目标检测
2026/6/11 3:05:54 网站建设 项目流程

专栏:YOLO 全面解析与改进
任务:VisDrone2019-DET 无人机目标检测
改进对象:YOLOv8l、YOLOv9c、YOLOv10l、YOLO11l、YOLO12l、YOLO26l
改进模块:SBA(Selective Boundary Aggregation)
改进位置:YOLO Neck / PAN-FPN 中的跨尺度Concat融合节点
训练设置:300 epochs,imgsz=640,batch=128,8 GPU,seed=42

本文面向初学者,完整介绍如何将 SBA 模块迁移到 YOLO 系列检测模型中。文章先给出改进结果,再解释为什么要替换Concat、SBA 的来源与基本原理、代码和 YAML 如何修改,最后给出 6 个 SBA-YOLO 的 drawio 架构图和实验分析。


1. 改进效果先看结论

本轮实验测试了 6 个 SBA 改进模型。整体结果如下:

ModelParams(M)Inference(ms)mAP50mAP50-95PrecisionRecall
YOLO12l-SBA34.793.740.42310.25140.53870.4364
YOLOv10l-SBA33.912.970.42270.24990.57450.4256
YOLO11l-SBA33.422.580.41910.24870.53740.4316
YOLOv8l-SBA51.773.130.41530.24620.54930.4299
YOLOv9c-SBA33.642.850.41630.24400.55790.4330
YOLO26l-SBA34.292.590.41170.24220.55300.4169

最直接的结论是:

指标最优模型数值
Best mAP50YOLO12l-SBA0.4231
Best mAP50-95YOLO12l-SBA0.2514
Best PrecisionYOLOv10l-SBA0.5745
Best RecallYOLO12l-SBA0.4364
FastestYOLO11l-SBA2.58 ms

也就是说,YOLO12l-SBA 是本轮 SBA 实验的综合精度最优模型,YOLOv10l-SBA 的 Precision 最高,YOLO11l-SBA 的速度最快


2. 与原始 YOLO 基线的对比

原始 YOLO 基线结果如下:

ModelParams(M)Inference(ms)mAP50mAP50-95PrecisionRecall
YOLO12l26.403.340.42590.25140.55740.4299
YOLO11l25.322.240.41810.24640.54830.4336
YOLOv8l43.642.710.41520.24270.55030.4273
YOLOv10l25.782.560.41150.24250.54880.4185
YOLO26l26.192.240.40650.23810.55120.4150

与基线对比后,SBA 带来的变化如下。由于上一轮基线没有训练 YOLOv9c,因此 YOLOv9c-SBA 只参与本轮 SBA 横向比较,不做增量对比。

ModelΔParams(M)ΔInference(ms)ΔmAP50ΔmAP50-95ΔPrecisionΔRecall
YOLO12l-SBA+8.39+0.40-0.0028+0.0000-0.0187+0.0065
YOLOv10l-SBA+8.13+0.41+0.0112+0.0074+0.0257+0.0071
YOLO11l-SBA+8.10+0.34+0.0010+0.0023-0.0109-0.0020
YOLOv8l-SBA+8.13+0.42+0.0001+0.0035-0.0010+0.0026
YOLO26l-SBA+8.10+0.35+0.0052+0.0041+0.0018+0.0019

从结果可以看到,SBA 的收益与模型结构强相关:

  1. YOLOv10l-SBA 提升最明显,mAP50 提升 0.0112,mAP50-95 提升 0.0074,Precision 提升 0.0257。
  2. YOLO26l-SBA 有稳定小幅提升,mAP50-95 提升 0.0041。
  3. YOLOv8l-SBA 对严格定位指标有提升,mAP50-95 提升 0.0035。
  4. YOLO12l-SBA 的 Recall 提升,但 Precision 下降,最终 mAP50-95 与原版持平。
  5. YOLO11l-SBA 的 mAP50-95 小幅提升,但 Recall 略降

因此,SBA 更适合被理解为一种“跨尺度融合方式改造”,它并不必然让所有指标同时提升,而是改变了 Neck 中信息融合的方式,使不同 YOLO 架构表现出不同的精度、召回和速度取舍。


3. 为什么要替换 Concat

YOLO 系列 Neck 通常采用 PAN-FPN 结构进行多尺度特征融合。最常见的融合方式是:

-[[-1,6],1,Concat,[1]]

Concat的优点是简单、稳定、开销低。它只是把两个特征图沿通道维度拼接起来,然后交给后续的 C2f、C3k2、A2C2f 或 RepNCSPELAN4 继续处理。

但在 VisDrone 这类无人机检测场景中,简单拼接存在三个问题:

  1. 低层细节和高层语义没有选择机制
    低层特征包含边界、纹理和小目标细节,高层特征包含语义和上下文。Concat 只是拼接,不判断哪些信息更重要。
  2. 背景噪声容易一起进入 Neck
    无人机图像中道路、建筑、树木、阴影、标线都可能产生干扰。简单拼接会把目标信息和背景噪声一起传递给后续模块。
  3. 跨尺度对齐不足
    P3、P4、P5 的感受野和语义层级不同,直接拼接可能导致细节和语义融合不充分,尤其影响小目标和密集目标。

SBA 的目标就是让跨尺度融合从“直接拼接”变成“有选择地聚合低层边界细节和高层语义信息”。


4. SBA 模块来源与思想

本文使用的 SBA 是Selective Boundary Aggregation。在本项目中,SBA 相关参考主要来自两个 PDF:

  1. 2212.11677v1.pdfDuAT: Dual-Aggregation Transformer Network for Medical Image Segmentation
  2. 2603.22841v1.pdfUAV-DETR: DETR for Anti-Drone Target Detection

在 DuAT 中,SBA 用于聚合低层特征中的边界信息和高层特征中的语义信息,从而更好地保留边界细节并定位目标区域。虽然原始任务是医学图像分割,但这个思想对无人机小目标检测同样有意义。

在 UAV-DETR 中,SBA 被放入无人机检测 Neck 中,配合跨尺度特征重校准与融合网络,用于过滤背景噪声并融合不同尺度的特征。这一点与 VisDrone 的任务特性非常接近:目标小、背景复杂、尺度变化大。

因此,本文将 SBA 引入 YOLO 的 Neck 中,用它替换原来的Concat融合节点。


5. SBA 模块结构

当前项目中加入的 SBA 模块位于:

ultralytics/nn/modules/block.py

核心代码如下:

classSBA(nn.Module):def__init__(self,inc,input_dim=64):super().__init__()self.input_dim=input_dim self.d_in1=Conv(input_dim//2,input_dim//2,1)self.d_in2=Conv(input_dim//2,input_dim//2,1)self.conv=Conv(input_dim,input_dim,3)self.fc1=nn.Conv2d(inc[1],input_dim//2,kernel_size=1,bias=False)self.fc2=nn.Conv2d(inc[0],input_dim//2,kernel_size=1,bias=False)self.Sigmoid=nn.Sigmoid()defforward(self,x):H_feature,L_feature=x L_feature=self.fc1(L_feature)H_feature=self.fc2(H_feature)g_L_feature=self.Sigmoid(L_feature)g_H_feature=self.Sigmoid(H_feature)L_feature=self.d_in1(L_feature)H_feature=self.d_in2(H_feature)L_feature=L_feature+L_feature*g_L_feature+(1-g_L_feature)*Upsample(g_H_feature*H_feature,size=L_feature.size()[2:],align_corners=False)H_feature=H_feature+H_feature*g_H_feature+(1-g_H_feature)*Upsample(g_L_feature*L_feature,size=H_feature.size()[2:],align_corners=False)H_feature=Upsample(H_feature,size=L_feature.size()[2:])out=self.conv(torch.cat([H_feature,L_feature],dim=1))returnout

为了方便理解,可以把 SBA 拆成四步:

步骤作用
通道压缩将两个输入分支统一压缩到input_dim / 2
Sigmoid 门控分别生成高层语义分支和低层细节分支的选择权重
双向补偿低层特征吸收高层语义,高层特征吸收低层细节
融合输出将增强后的两路特征拼接,再用 3x3 卷积输出

与普通Concat不同,SBA 不是简单地把两个张量拼接,而是先用门控机制做选择性增强,再输出一个新的融合特征。


6. SBA 在 YOLO 中的适配方式

原始 YOLO Neck 中通常有 4 个跨尺度融合点:

Top-down: P5 -> P4 Top-down: P4 -> P3 Bottom-up: P3 -> P4 Bottom-up: P4 -> P5

原始写法通常是:

-[[-1,6],1,Concat,[1]]

本文改为:

-[[-1,6],1,SBA,[512]]

这里的[512]表示 SBA 输出通道数。也就是说,SBA 替换 Concat 后不再输出两个分支通道数之和,而是直接输出指定通道数的融合特征。

以 YOLO26l-SBA 为例,Neck 的关键改动如下:

head:-[-1,1,nn.Upsample,[None,2,"nearest"]]-[[-1,6],1,SBA,[512]]# SBA(P5, P4)-[-1,2,C3k2,[512,True]]-[-1,1,nn.Upsample,[None,2,"nearest"]]-[[-1,4],1,SBA,[256]]# SBA(P4, P3)-[-1,2,C3k2,[256,True]]-[-1,1,Conv,[256,3,2]]-[[-1,13],1,SBA,[512]]# SBA(P3, P4)-[-1,2,C3k2,[512,True]]-[-1,1,Conv,[512,3,2]]-[[-1,10],1,SBA,[1024]]# SBA(P4, P5)-[-1,1,C3k2,[1024,True,0.5,True]]-[[16,19,22],1,Detect,[nc]]

这样做的好处是:YOLO 的 P3、P4、P5 检测头仍然保持不变,但 Neck 中每一次跨尺度融合都从静态拼接变成了选择性聚合。


7. 代码改进过程

7.1 在 block.py 中加入 SBA

SBA类加入:

ultralytics/nn/modules/block.py

同时在__all__中加入:

"SBA",

7.2 在 modules 中导出 SBA

修改:

ultralytics/nn/modules/__init__.py

.block导入列表中加入:

SBA,

并在__all__中加入:

"SBA",

7.3 修改 parse_model 支持 SBA

由于 SBA 的输入是两个特征分支,且输出通道由 YAML 指定,所以需要在parse_model()中单独处理:

elifmisSBA:c2=args[0]ifc2!=nc:c2=make_divisible(min(c2,max_channels)*width,8)args=[[ch[x]forxinf],c2,*args[1:]]

这段代码的含义是:

  1. 从 YAML 读取 SBA 输出通道c2
  2. 根据当前模型宽度系数自动缩放通道。
  3. 自动把两个输入分支的通道数[ch[x] for x in f]传给 SBA。

因此 YAML 中只需要写:

-[[-1,6],1,SBA,[512]]

不需要手动写输入通道。

7.4 新增 6 个 SBA 模型配置

本文新增了 6 个配置文件:

模型YAML
YOLOv8l-SBAultralytics/cfg/models/v8/yolov8l-sba.yaml
YOLOv9c-SBAultralytics/cfg/models/v9/yolov9c-sba.yaml
YOLOv10l-SBAultralytics/cfg/models/v10/yolov10l-sba.yaml
YOLO11l-SBAultralytics/cfg/models/11/yolo11l-sba.yaml
YOLO12l-SBAultralytics/cfg/models/12/yolo12l-sba.yaml
YOLO26l-SBAultralytics/cfg/models/26/yolo26l-sba.yaml

各模型检测头输入保持为原来的 P3/P4/P5 输出:

模型检测头类型Detect 输入
YOLOv8l-SBADetect[15, 18, 21]
YOLOv9c-SBADetect[15, 18, 21]
YOLOv10l-SBAv10Detect[16, 19, 22]
YOLO11l-SBADetect[16, 19, 22]
YOLO12l-SBADetect[14, 17, 20]
YOLO26l-SBADetect[16, 19, 22]

7.5 修改 benchmark 脚本

benchmark_visdrone_fixed.py中新增 SBA 模型集合:

SBA_YOLO_MODELS={"YOLOv8l-SBA":"ultralytics/cfg/models/v8/yolov8l-sba.yaml","YOLOv9c-SBA":"ultralytics/cfg/models/v9/yolov9c-sba.yaml","YOLOv10l-SBA":"ultralytics/cfg/models/v10/yolov10l-sba.yaml","YOLO11l-SBA":"ultralytics/cfg/models/11/yolo11l-sba.yaml","YOLO12l-SBA":"ultralytics/cfg/models/12/yolo12l-sba.yaml","YOLO26l-SBA":"ultralytics/cfg/models/26/yolo26l-sba.yaml",}

并将默认测试变体设置为:

parser.add_argument("--variant",choices=("baseline","sba","both"),default="sba",)

这样直接运行脚本时,只会测试 SBA 改进模型。


8. 一键训练和验证

在服务器上直接运行:

python benchmark_visdrone_fixed.py

或显式指定训练参数:

python benchmark_visdrone_fixed.py\--dataultralytics/cfg/datasets/VisDrone.yaml\--epochs300\--batch128\--imgsz640\--device0,1,2,3,4,5,6,7\--workers4

脚本会依次训练并验证:

YOLOv8l-SBA YOLOv9c-SBA YOLOv10l-SBA YOLO11l-SBA YOLO12l-SBA YOLO26l-SBA

训练结束后,会生成:

benchmark_results_VisDrone_fixed.csv benchmark_results_VisDrone_fixed.md runs/benchmark_VisDrone/ runs/.benchmark_results/

9. 改进后的 drawio 架构图

本文提供了可编辑 drawio 源文件和 Markdown 可直接显示的 SVG 预览图。

总图:

assets/sba_yolo_visdrone/sba_yolo_architectures.drawio

单模型 drawio:

assets/sba_yolo_visdrone/yolov8l_sba.drawio assets/sba_yolo_visdrone/yolov9c_sba.drawio assets/sba_yolo_visdrone/yolov10l_sba.drawio assets/sba_yolo_visdrone/yolo11l_sba.drawio assets/sba_yolo_visdrone/yolo12l_sba.drawio assets/sba_yolo_visdrone/yolo26l_sba.drawio

图中颜色含义如下:

颜色含义
紫色Backbone 或 Neck 中的主特征模块
绿色SPPF、SPPELAN、PSA、C2PSA 等上下文模块
红色Upsample
蓝色下采样卷积、ADown 或 SCDown
橙色SBA 融合模块
青色Detect / v10Detect

9.1 YOLOv8l-SBA

YOLOv8l-SBA 保留 C2f + SPPF 的主体结构,将 PAN-FPN 中 4 个Concat融合点替换为 SBA。

9.2 YOLOv9c-SBA

YOLOv9c-SBA 使用 RepNCSPELAN4、ADown 和 SPPELAN,本文将其 Neck 中的跨尺度拼接改为 SBA 选择性融合。

9.3 YOLOv10l-SBA

YOLOv10l-SBA 使用 C2fCIB、SCDown、PSA 和 v10Detect。实验中它获得了本轮最高 Precision。

9.4 YOLO11l-SBA

YOLO11l-SBA 使用 C3k2、SPPF 和 C2PSA。它在本轮实验中推理速度最快,同时 mAP50-95 相比原版略有提升。

9.5 YOLO12l-SBA

YOLO12l-SBA 使用 A2C2f 作为主要 Neck 模块。本轮实验中它的 mAP50 和 mAP50-95 排名第一。

9.6 YOLO26l-SBA

YOLO26l-SBA 保留 YOLO26 的 end-to-end 设置,并使用 SBA 替换原始 Neck 中的 Concat。它相较 YOLO26l 在 mAP50 和 mAP50-95 上都有小幅提升。


10. 实验结果分析

10.1 YOLOv10l-SBA 的提升最明显

从增量表看,YOLOv10l-SBA 是 SBA 改造中提升最明显的模型:

指标YOLOv10lYOLOv10l-SBA提升
mAP500.41150.4227+0.0112
mAP50-950.24250.2499+0.0074
Precision0.54880.5745+0.0257
Recall0.41850.4256+0.0071

这说明 SBA 与 YOLOv10l 的 C2fCIB、SCDown、PSA 和 v10Detect 组合较为适配。尤其 Precision 提升明显,说明 SBA 替换 Concat 后能够更好地抑制一部分背景噪声和误检。

10.2 YOLO12l-SBA 综合结果仍然最强

虽然 YOLO12l-SBA 相比原始 YOLO12l 没有提升 mAP50-95,但它在所有 SBA 模型中仍然排名第一:

指标YOLO12l-SBA
mAP500.4231
mAP50-950.2514
Recall0.4364

它的 Recall 比原始 YOLO12l 高 0.0065,说明 SBA 对 YOLO12l 的召回有帮助,但 Precision 下降较明显。因此,如果后续继续优化 YOLO12l-SBA,可以重点考虑降低误检,例如调整置信度阈值、损失函数或标签分配策略。

10.3 YOLO11l-SBA 是速度优先版本

YOLO11l-SBA 的推理耗时为 2.58 ms,是本轮 SBA 模型中最快的。相比原始 YOLO11l,它的 mAP50-95 从 0.2464 提升到 0.2487,但 Recall 从 0.4336 降到 0.4316。

因此,YOLO11l-SBA 可以作为速度优先方案。如果应用场景要求实时处理,例如无人机巡检或边缘设备快速预警,它比 YOLO12l-SBA 更适合部署。

10.4 YOLO26l-SBA 有稳定小幅提升

YOLO26l-SBA 相比 YOLO26l:

指标YOLO26lYOLO26l-SBA提升
mAP500.40650.4117+0.0052
mAP50-950.23810.2422+0.0041
Precision0.55120.5530+0.0018
Recall0.41500.4169+0.0019

这说明 SBA 对 YOLO26l 是稳定正收益,只是代价是参数量和推理时间增加。

10.5 类别层面的观察

从 YOLO12l-SBA 的类别结果看,carbus依然是最容易检测的类别:

ClassmAP50mAP50-95
car0.80830.5678
bus0.60500.4494

弱类别仍然集中在小目标和易混淆目标:

ClassmAP50mAP50-95
bicycle0.16310.0708
awning-tricycle0.14560.0855

这说明 SBA 改善了跨尺度融合,但还不能单独解决极小目标、遮挡和类别混淆问题。后续仍然需要结合 P2 检测头、更强的数据增强或更适合小目标的损失函数。


11. 初学者复现 checklist

如果你想从零复现本实验,可以按下面顺序检查。

  1. 确认SBA已加入:
ultralytics/nn/modules/block.py
  1. 确认SBA已在模块入口导出:
ultralytics/nn/modules/__init__.py
  1. 确认parse_model()已支持SBA
ultralytics/nn/tasks.py
  1. 确认 6 个 SBA YAML 存在:
ultralytics/cfg/models/v8/yolov8l-sba.yaml ultralytics/cfg/models/v9/yolov9c-sba.yaml ultralytics/cfg/models/v10/yolov10l-sba.yaml ultralytics/cfg/models/11/yolo11l-sba.yaml ultralytics/cfg/models/12/yolo12l-sba.yaml ultralytics/cfg/models/26/yolo26l-sba.yaml
  1. 先用一个模型检查是否能构建:
python-c"from ultralytics import YOLO; YOLO('ultralytics/cfg/models/v10/yolov10l-sba.yaml')"
  1. 运行完整 benchmark:
python benchmark_visdrone_fixed.py
  1. 查看输出结果:
benchmark_results_VisDrone_fixed.csv benchmark_results_VisDrone_fixed.md runs/benchmark_VisDrone/
  1. 打开结构图:
assets/sba_yolo_visdrone/sba_yolo_architectures.drawio

12. 后续改进方向

12.1 只替换部分 Concat

当前做法是替换 Neck 中所有 4 个Concat。后续可以做消融:

Top-down only Bottom-up only 只替换 P3 融合 只替换 P4/P5 融合

这样可以判断 SBA 到底在哪个尺度最有效。

12.2 与轻量化模块结合

SBA 会增加参数量,当前多数模型增加约 8M 参数。后续可以尝试:

  1. 降低 SBA 的输出通道。
  2. 使用 depthwise separable convolution 替换 SBA 内部 3x3 Conv。
  3. 只在小目标相关的 P3/P4 路径使用 SBA。

12.3 与 P2 小目标检测头结合

VisDrone 中极小目标很多,P3 仍然可能不够细。后续可以在 SBA Neck 基础上加入 P2 检测头,重点观察pedestrianpeoplebicyclemotor等类别是否提升。

12.4 与 DORGM 组合

SBA 主要改 Neck 融合方式,DORGM 主要增强 Detect 前特征表达。二者作用点不同,后续可以尝试:

SBA Neck + DORGM Head

但组合后参数和计算量会进一步增加,需要做速度和精度权衡。


13. 总结

本文将 Selective Boundary Aggregation 引入 YOLO 系列目标检测模型,用 SBA 替换 Neck / PAN-FPN 中的跨尺度Concat融合节点,并在 VisDrone2019-DET 数据集上进行验证。实验表明:

  1. YOLO12l-SBA 在本轮 SBA 模型中综合精度最高,mAP50 为 0.4231,mAP50-95 为 0.2514。
  2. YOLOv10l-SBA 相比原始 YOLOv10l 提升最明显,mAP50 提升 0.0112,mAP50-95 提升 0.0074,Precision 提升 0.0257。
  3. YOLO11l-SBA 是本轮最快模型,推理耗时为 2.58 ms,适合速度优先场景。
  4. YOLO26l-SBA 相比原始 YOLO26l 各项指标均有小幅提升,说明 SBA 对 YOLO26l 是稳定正收益。
  5. SBA 能增强跨尺度信息融合,但不能单独解决 VisDrone 中极小目标、遮挡和类别混淆问题,后续仍需结合 P2 检测头、轻量化设计和更适合小目标的训练策略。

整体来看,SBA 不是简单增加一个注意力模块,而是把 YOLO Neck 中的“静态拼接”改成“选择性边界与语义聚合”。对于无人机目标检测这类小目标密集、背景复杂、尺度变化明显的场景,它是一个值得继续消融和优化的结构改进方向。


参考资料

  1. 2212.11677v1.pdf:DuAT: Dual-Aggregation Transformer Network for Medical Image Segmentation.
  2. 2603.22841v1.pdf:UAV-DETR: DETR for Anti-Drone Target Detection.
  3. VisDrone 官方数据集仓库:https://github.com/VisDrone/VisDrone-Dataset
  4. Ultralytics VisDrone 数据集文档:https://docs.ultralytics.com/datasets/detect/visdrone/

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询