yolov8n(补充)
yolov8详细网络详解补充
1. Detect 模块 (解耦检测头)
文件路径:ultralytics/nn/modules/head.py
这是 YOLOv8 的最终输出层。与 YOLOv5 不同,v8 不再在一个卷积层里同时预测类别和坐标,而是分两条路走。
Python
1 | class Detect(nn.Module): |
详细解析:
- 解耦 (Decoupling):
- Box 分支 (
cv2):只专注于“物体轮廓在哪”。它需要高精度的边缘信息,所以通常使用标准卷积。 - Cls 分支 (
cv3):只专注于“这是什么物体”。它需要语义信息,YOLOv8 为了在 RK3566 等设备上提速,这里默认使用了DWConv(深度可分离卷积)。
- Box 分支 (
- 通道数 (
c2,c3):- 这是模型轻量化的关键魔改点。默认计算方式会导致
c3很大(256)。对于扫地机(3类),建议强制改为c2=c3=64,计算量可立减 50% 以上。
- 这是模型轻量化的关键魔改点。默认计算方式会导致
- 输出维度 (
self.no):- 输出通道数 =
nc(3) +reg_max * 4(64) = 67。 - 这也是为什么你在 NPU 后处理时,拿到的数据不是直接的
x,y,w,h,而是一大坨数据的原因。
- 输出通道数 =
2. DFL 模块 (分布式焦点损失)
文件路径:ultralytics/nn/modules/block.py
这就是那个把 64 个通道变成 4 个坐标值的“数学魔法”。它的核心思想是:不直接预测距离,而是预测距离的概率分布,然后求期望(积分)。
Python
1 | class DFL(nn.Module): |
DFL 的计算过程详解:
假设我们要预测“中心点到左边的距离” (dist_left):
输入:模型输出了 16 个数值(Logits)。
Softmax:将这 16 个数值归一化为概率 P0,P1,…,P15。
积分(求期望):
$$\hat{y} = \sum_{i=0}^{15} P_i \times i$$
比如:P5=0.8,P6=0.2,其他为0。 结果:5×0.8+6×0.2=5.2。
物理意义:这比直接让网络预测 “5.2” 要稳定得多,因为网络可以表达“我不确定,大概在 5 和 6 之间”这种模糊性。