# Ultralytics 🚀 AGPL-3.0 License - https://ultral...

Erstellt am: 7. Juli 2026

Beantwortet mit GPT-5.5 Thinking von Chat01

Frage

Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license

Ultralytics YOLO26 object detection model with P2/4 - P5/32 outputs

Model docs: https://docs.ultralytics.com/models/yolo26

Task docs: https://docs.ultralytics.com/tasks/detect

Parameters

nc: 80 # number of classes
scale: s # use YOLO26s scale
end2end: True # whether to use end-to-end mode
reg_max: 1 # DFL bins
scales: # model compound scaling constants, i.e. 'model=yolo26n-p2.yaml' will call yolo26-p2.yaml with scale 'n'

[depth, width, max_channels]

n: [0.50, 0.25, 1024] # summary: 329 layers, 2,662,400 parameters, 2,662,400 gradients, 9.5 GFLOPs
s: [0.50, 0.50, 1024] # summary: 329 layers, 9,765,856 parameters, 9,765,856 gradients, 27.8 GFLOPs
m: [0.50, 1.00, 512] # summary: 349 layers, 21,144,288 parameters, 21,144,288 gradients, 91.4 GFLOPs
l: [1.00, 1.00, 512] # summary: 489 layers, 25,815,520 parameters, 25,815,520 gradients, 115.3 GFLOPs
x: [1.00, 1.50, 512] # summary: 489 layers, 57,935,232 parameters, 57,935,232 gradients, 256.9 GFLOPs

YOLO26n backbone

backbone:

[from, repeats, module, args]

  • [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  • [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  • [-1, 2, C3k2, [256, False, 0.25]]
  • [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  • [-1, 2, C3k2, [512, False, 0.25]]
  • [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  • [-1, 2, C3k2, [512, True]]
  • [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  • [-1, 2, C3k2, [1024, True]]
  • [-1, 1, SPPF, [1024, 5, 3, True]] # 9
  • [-1, 2, C2PSA, [1024]] # 10

YOLO26n head

head:

  • [-1, 1, nn.Upsample, [None, 2, "nearest"]]

  • [[-1, 6], 1, Concat, [1]] # cat backbone P4

  • [-1, 2, C3k2, [512, True]] # 13

  • [-1, 1, nn.Upsample, [None, 2, "nearest"]]

  • [[-1, 4], 1, Concat, [1]] # cat backbone P3

  • [-1, 2, C3k2, [256, True]] # 16 (P3/8-small)

  • [-1, 1, nn.Upsample, [None, 2, "nearest"]]

  • [[-1, 2], 1, Concat, [1]] # cat backbone P2

  • [-1, 2, C3k2, [128, True]] # 19 (P2/4-xsmall)

  • [-1, 1, Conv, [128, 3, 2]]

  • [[-1, 16], 1, Concat, [1]] # cat head P3

  • [-1, 2, C3k2, [256, True]] # 22 (P3/8-small)

  • [-1, 1, Conv, [256, 3, 2]]

  • [[-1, 13], 1, Concat, [1]] # cat head P4

  • [-1, 2, C3k2, [512, True]] # 25 (P4/16-medium)

  • [-1, 1, Conv, [512, 3, 2]]

  • [[-1, 10], 1, Concat, [1]] # cat head P5

  • [-1, 1, C3k2, [1024, True, 0.5, True]] # 28 (P5/32-large)

  • [[19, 22, 25, 28], 1, Detect, [nc]] # Detect(P2, P3, P4, P5)

这个是不是yolo26原生提供的 P2架构

Gedanke

undefined

Gedanke

Thought for 13s

Antwort

是的,你贴的这个就是 Ultralytics 官方原生提供的 YOLO26 P2 架构配置,对应官方仓库里的:

ultralytics/cfg/models/26/yolo26-p2.yaml

官方 GitHub 中这个文件的说明就是 “YOLO26 object detection model with P2/4 - P5/32 outputs”,并且最后检测头是:

yaml
[[19, 22, 25, 28], 1, Detect, [nc]] # Detect(P2, P3, P4, P5)

这与你贴出的结构一致。(GitHub)

但要注意一点:它是 YOLO26 的官方 P2 变体,不是默认标准版 YOLO26。默认 yolo26.yaml 只输出 P3/8、P4/16、P5/32 三个检测尺度:

yaml
[[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)

而你这个 yolo26-p2.yaml 额外加入了 P2/4 小目标检测层,因此检测头变成 P2、P3、P4、P5 四尺度输出。(GitHub)

你的这份 YAML 里关键的 P2 结构是:

yaml
- [[-1, 2], 1, Concat, [1]] # cat backbone P2 - [-1, 2, C3k2, [128, True]] # 19 (P2/4-xsmall) ... - [[19, 22, 25, 28], 1, Detect, [nc]]

也就是说,网络先从高层特征逐级上采样到 P3,再继续上采样并融合 backbone 的第 2 层特征,形成 P2/4 特征图,用于更小目标检测。

另外,你这里:

yaml
scale: s

所以它实际是 YOLO26s-P2 规模,不是 YOLO26n-P2。注释里的 “YOLO26n backbone/head” 是模板注释,真正控制模型宽度、深度的是 scale: sscales 表。官方配置也说明 model=yolo26n-p2.yaml 会调用 yolo26-p2.yaml 并使用对应 scale。(GitHub)

结论:是原生官方 P2 架构;准确说是 Ultralytics YOLO26 官方提供的 P2 扩展版,不是默认标准三尺度 YOLO26。

Frage

使用标准的P2架构,使用yolo26s,进行小目标检测,最好的是使用什么优化器和学习率

Gedanke

undefined

Gedanke

Thought for 18s

Antwort

建议你首选 MuSGD / optimizer=auto,不要优先用 AdamW 手动乱调。对于 YOLO26s-P2 小目标检测,我的推荐是:

bash
yolo detect train \ model=yolo26s-p2.yaml \ data=your_data.yaml \ imgsz=960 \ epochs=150 \ batch=32 \ optimizer=auto \ lr0=0.00038 \ lrf=0.882 \ momentum=0.948 \ weight_decay=0.00027 \ cos_lr=True \ close_mosaic=10

最推荐配置

场景优化器初始学习率 lr0建议
正常训练 YOLO26s-P2,小目标检测autoMuSGD0.00038首选
数据量较小,训练轮数短autoAdamW0.0005–0.001更稳,但可能最终精度略低
从头训练,不加载预训练权重MuSGD / SGD0.001–0.003 先试不建议直接太大
迁移学习,数据集较小AdamW0.0005防止震荡
mAP 上不去但 loss 正常下降MuSGD0.000380.0005延长 epoch,而不是盲目加 lr

Ultralytics 官方 YOLO26 训练配方里,YOLO26s 的官方 COCO 训练使用的是 MuSGD,lr0=0.00038lrf=0.882momentum=0.948weight_decay=0.00027;官方也说明 optimizer=auto 在长训练中会自动选择 MuSGD,短训练中可能选择 AdamW。(Ultralytics Docs)

所以对于你这个 YOLO26s + P2 小目标检测,我不建议一上来用传统 YOLO 的:

bash
lr0=0.01 optimizer=SGD

因为 YOLO26 的官方训练策略已经不是传统 YOLOv5/v8 那套默认逻辑了。虽然 Ultralytics 通用配置文档里仍提到 SGD 可从 0.01 起步、Adam 可从 0.001 起步,但 YOLO26 的专门训练配方明确给出了 S 模型更低的 MuSGD 学习率。(Ultralytics Docs)

我给你的最终建议

对于小目标检测,优先这样跑第一版:

bash
yolo detect train \ model=yolo26s-p2.yaml \ data=your_data.yaml \ imgsz=960 \ epochs=150 \ batch=32 \ optimizer=MuSGD \ lr0=0.00038 \ lrf=0.882 \ momentum=0.948 \ weight_decay=0.00027 \ cos_lr=True \ warmup_epochs=1.0 \ close_mosaic=10

如果显存允许,imgsz 比学习率更关键。小目标检测中,P2 检测头解决的是浅层高分辨率特征输出问题,而 imgsz=960/1024/1280 解决的是目标在输入图中像素过小的问题。所以比起把 lr0 调来调去,更建议先保证输入分辨率足够。

简单判断怎么调

如果训练前 20 个 epoch:

  • box_loss/cls_loss 下降很慢:把 lr00.00038 提到 0.0005
  • loss 抖动大、mAP 忽高忽低:把 lr0 降到 0.0002–0.0003
  • 训练集 mAP 高,验证集 mAP 低:不要加 lr,减小增强或加大 weight_decay
  • 小目标漏检多:优先提高 imgsz、检查标注质量、调低推理 conf,而不是先改优化器

一句话结论:YOLO26s-P2 小目标检测,首选 optimizer=MuSGDauto,学习率优先用官方 S 模型配方 lr0=0.00038;如果数据集小或训练很短,再考虑 AdamW + lr0=0.0005–0.001

Frage

pretrained=/home/dlut/yolo26/yolo_workspace/dataset_part2_easy_640_clean_balanced/yolo26s.pt
设置了这个参数,我也下载了yolo26s.pt 是不是加载了预训练权重

Gedanke

undefined

Gedanke

undefined

Gedanke

Thought for 15s

Antwort

是的,只要你的训练命令里同时是这种形式

bash
model=yolo26s-p2.yaml \ pretrained=/home/dlut/yolo26/yolo_workspace/dataset_part2_easy_640_clean_balanced/yolo26s.pt

那就表示:yolo26s-p2.yaml 构建 P2 网络结构,然后尝试从 yolo26s.pt 加载预训练权重。Ultralytics 的 pretrained 参数可以是 True/False,也可以是一个 .pt 权重路径;官方配置说明里明确写了这一点。(Ultralytics Docs)

但这里要注意一个关键点:

yolo26s.pt 是普通 YOLO26s,通常是 P3/P4/P5 三尺度检测头;你现在训练的是 YOLO26s-P2,是 P2/P3/P4/P5 四尺度检测头。

所以它大概率不是“100% 全部加载”,而是:

text
backbone 和部分 neck/head 层加载成功 新增的 P2 检测分支、部分检测头参数随机初始化

这是正常的,不是错误。

你可以看训练开始时终端日志,通常会有类似:

text
Transferred xxx/yyy items from pretrained weights

如果看到这行,就说明预训练权重确实加载了。
如果 xxx 很大但小于 yyy,说明是部分加载成功,这正符合普通 yolo26s.pt 迁移到 yolo26s-p2.yaml 的情况。

更稳妥的判断方式:

bash
grep -i "Transferred" runs/detect/你的实验名*/args.yaml -r

或者直接翻训练日志,看有没有:

text
Transferred ...

如果你命令写成下面这样:

bash
model=yolo26s.pt

那就不是 P2 架构了,而是直接加载普通 YOLO26s 模型结构。Ultralytics 官方说明中,model 可以接 .pt.yaml.pt 主要定义/加载已有模型,.yaml 用于定义结构。(Ultralytics Docs)

所以你现在正确的 P2 迁移学习写法应该是

bash
yolo detect train \ model=yolo26s-p2.yaml \ data=your_data.yaml \ pretrained=/home/dlut/yolo26/yolo_workspace/dataset_part2_easy_640_clean_balanced/yolo26s.pt \ imgsz=960 \ epochs=150 \ optimizer=MuSGD \ lr0=0.00038

一句话结论:是加载了预训练权重,但由于 yolo26s.pt 不是 P2 结构,所以通常是部分权重加载;这是正常且推荐的迁移方式。

Diesen Q&A teilen