YOLO模型结构解析:Backbone、Neck、Head

YOLO发展到今天,结构上已经非常成熟了。很多初学者一上来就看网络结构图,结果被各种CSP、FPN、PAN、Decoupled Head搞得一头雾水。我刚开始接触YOLOv5的时候也是这样,对着图看了半天,感觉每个模块都认识,但连起来就不知道怎么回事了。

其实说白了,YOLO的结构就三部分:Backbone(骨干网络)负责提取特征,Neck(颈部)负责融合特征,Head(头部)负责输出预测。今天我就把这三大块掰开揉碎了讲清楚。

核心理解:Backbone是"眼睛",Neck是"大脑的整合区",Head是"嘴巴"——眼睛看东西,大脑整合信息,嘴巴说出结果。

一、Backbone:CSPDarknet

Backbone的任务很简单:从输入图片中提取特征。YOLOv5/v8用的都是CSPDarknet结构。这个名字听起来唬人,拆开看就明白了——CSP + Darknet。

Darknet是YOLO作者自己设计的网络,核心就是一堆卷积+BN+LeakyReLU。而CSP(Cross Stage Partial)是一种跨阶段部分连接的结构,它把特征图分成两部分,一部分正常卷积,另一部分直接拼过来。

为什么要这么干?我在项目里遇到过一个问题:网络越深,梯度消失越严重,训练越慢。CSP结构就是为了解决这个——它让梯度能直接回传到前面的层,训练起来快得多。

组件 作用 我的经验
CBS(Conv+BN+SiLU) 基础卷积块 SiLU比ReLU平滑,小模型效果更好
CSP模块 跨阶段特征融合 减少计算量约20%,精度不掉
SPPF 多尺度池化 比SPP快2倍,效果一样

YOLOv5的Backbone输出三个尺度的特征图,大小分别是原图的1/8、1/16、1/32。这三个尺度对应着检测不同大小的物体——小物体用大特征图,大物体用小特征图。

小技巧:如果你要检测的目标特别小(比如人脸、车牌),可以修改Backbone的输出尺度,增加一个1/4尺度的特征图。我做过一个车牌识别项目,加了1/4尺度后,小车牌召回率提升了12%。

二、Neck:FPN + PAN

Backbone提取了特征,但有个问题:浅层特征语义信息少但位置准,深层特征语义丰富但位置模糊。Neck就是干这个的——把不同尺度的特征融合起来。

YOLO用的是FPN(特征金字塔) + PAN(路径聚合网络)的组合。FPN是从上往下传语义信息,PAN是从下往上传位置信息。两者结合,每个尺度的特征图既有丰富的语义,又有精确的位置。

我记得第一次自己搭YOLO的时候,觉得Neck这部分可有可无。直到有一次做小目标检测,去掉Neck后mAP直接掉了8个点。嗯,从那以后我再也不敢省Neck了。

具体流程是这样的:

  1. Backbone输出三个尺度的特征图:P3(1/8)、P4(1/16)、P5(1/32)
  2. FPN路径:P5上采样→与P4融合→再上采样→与P3融合
  3. PAN路径:融合后的P3下采样→与P4融合→再下采样→与P5融合
  4. 最终输出三个融合后的特征图,送入Head

注意:FPN和PAN的融合方式不是简单的相加。YOLOv5用的是torch.cat拼接,然后过一层卷积。YOLOv8改成了add相加,计算量更小。如果你自己改模型,要注意这个区别。

三、Head:Decoupled Head

Head是模型的最后一部分,负责从特征图中预测出目标的类别和位置。YOLOv5用的是Coupled Head(耦合头),也就是分类和回归共享同一个卷积层。YOLOv8改成了Decoupled Head(解耦头),分类和回归分开走。

为什么要解耦?你想想看,分类任务关注的是"这是什么",回归任务关注的是"它在哪里"。这两个任务需要的特征其实不一样。耦合在一起,互相干扰。解耦之后,每个任务可以专注学自己的东西。

我在实际部署中发现,Decoupled Head在复杂场景下效果更好。比如一个场景里同时有猫和狗,而且它们挨得很近,解耦头能更准确地分开它们。

对比项 Coupled Head(YOLOv5) Decoupled Head(YOLOv8)
结构 一个卷积输出所有 两个分支分别输出
参数量 少 多(约多15%)
精度 一般 更高(mAP提升1-2%)
推理速度 快 稍慢(但可忽略)

Decoupled Head的具体结构:

  • 分类分支:2个卷积层,输出通道数为类别数
  • 回归分支:2个卷积层,输出通道数为4(x, y, w, h)
  • 分布聚焦分支:YOLOv8新增,用于更精确的回归

关键点:Decoupled Head的每个分支最后都接了一个1x1卷积,目的是把特征图映射到目标维度。这个1x1卷积虽然小,但不能省——我试过去掉它,精度直接掉了3个点。

四、整体结构图

下面这张图展示了YOLO的完整结构。从输入图片开始,经过Backbone提取特征,Neck融合特征,最后Head输出预测。每个部分各司其职,缺一不可。

YOLO模型整体结构 输入图片 Backbone:CSPDarknet 提取多尺度特征(P3/P4/P5) Neck:FPN + PAN 特征融合(语义+位置) Head:Decoupled Head 分类分支 + 回归分支 预测结果 三个尺度输出 检测大/中/小物体

五、实战中的选择建议

讲完理论,说说实际项目中怎么选。我做过十几个YOLO部署项目,总结了几条经验:

  • 追求速度:用YOLOv5的Coupled Head,参数量少,推理快。适合边缘设备。
  • 追求精度:用YOLOv8的Decoupled Head,mAP更高。适合服务器端。
  • 小目标检测:修改Neck,增加一个更浅层的特征融合。我试过,效果立竿见影。
  • 资源受限:缩小Backbone的深度和宽度。YOLOv5的n/s/m/l/x系列就是干这个的。

我的习惯:先在YOLOv8m上跑通,再根据实际场景剪枝。不要一上来就用最大的模型,那是浪费算力。我曾经在一个项目里用YOLOv8x,结果推理速度只有5fps,换成YOLOv8m后速度到30fps,精度只掉了0.5个点。

好了,这一章的内容就到这里。Backbone、Neck、Head这三个概念搞清楚了,YOLO的结构你就掌握了八成。剩下的两成,是在实际项目中踩坑踩出来的——这个我们后面慢慢聊。