# Ultralytics 🚀 AGPL-3.0 License - https://ultral...
Tạo vào: 7 tháng 7, 2026
Trả lời bằng GPT-5.5 Thinking bởi Chat01
Tạo vào: 7 tháng 7, 2026
Trả lời bằng GPT-5.5 Thinking bởi Chat01
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'
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
backbone:
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架构
是的,你贴的这个就是 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 特征图,用于更小目标检测。
另外,你这里:
yamlscale: s
所以它实际是 YOLO26s-P2 规模,不是 YOLO26n-P2。注释里的 “YOLO26n backbone/head” 是模板注释,真正控制模型宽度、深度的是 scale: s 和 scales 表。官方配置也说明 model=yolo26n-p2.yaml 会调用 yolo26-p2.yaml 并使用对应 scale。(GitHub)
结论:是原生官方 P2 架构;准确说是 Ultralytics YOLO26 官方提供的 P2 扩展版,不是默认标准三尺度 YOLO26。
使用标准的P2架构,使用yolo26s,进行小目标检测,最好的是使用什么优化器和学习率
建议你首选 MuSGD / optimizer=auto,不要优先用 AdamW 手动乱调。对于 YOLO26s-P2 小目标检测,我的推荐是:
bashyolo 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,小目标检测 | auto 或 MuSGD | 0.00038 | 首选 |
| 数据量较小,训练轮数短 | auto 或 AdamW | 0.0005–0.001 | 更稳,但可能最终精度略低 |
| 从头训练,不加载预训练权重 | MuSGD / SGD | 0.001–0.003 先试 | 不建议直接太大 |
| 迁移学习,数据集较小 | AdamW | 0.0005 | 防止震荡 |
| mAP 上不去但 loss 正常下降 | MuSGD | 0.00038 或 0.0005 | 延长 epoch,而不是盲目加 lr |
Ultralytics 官方 YOLO26 训练配方里,YOLO26s 的官方 COCO 训练使用的是 MuSGD,lr0=0.00038,lrf=0.882,momentum=0.948,weight_decay=0.00027;官方也说明 optimizer=auto 在长训练中会自动选择 MuSGD,短训练中可能选择 AdamW。(Ultralytics Docs)
所以对于你这个 YOLO26s + P2 小目标检测,我不建议一上来用传统 YOLO 的:
bashlr0=0.01 optimizer=SGD
因为 YOLO26 的官方训练策略已经不是传统 YOLOv5/v8 那套默认逻辑了。虽然 Ultralytics 通用配置文档里仍提到 SGD 可从 0.01 起步、Adam 可从 0.001 起步,但 YOLO26 的专门训练配方明确给出了 S 模型更低的 MuSGD 学习率。(Ultralytics Docs)
对于小目标检测,优先这样跑第一版:
bashyolo 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 下降很慢:把 lr0 从 0.00038 提到 0.0005lr0 降到 0.0002–0.0003weight_decayimgsz、检查标注质量、调低推理 conf,而不是先改优化器一句话结论:YOLO26s-P2 小目标检测,首选 optimizer=MuSGD 或 auto,学习率优先用官方 S 模型配方 lr0=0.00038;如果数据集小或训练很短,再考虑 AdamW + lr0=0.0005–0.001。
pretrained=/home/dlut/yolo26/yolo_workspace/dataset_part2_easy_640_clean_balanced/yolo26s.pt
设置了这个参数,我也下载了yolo26s.pt 是不是加载了预训练权重
是的,只要你的训练命令里同时是这种形式:
bashmodel=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% 全部加载”,而是:
textbackbone 和部分 neck/head 层加载成功 新增的 P2 检测分支、部分检测头参数随机初始化
这是正常的,不是错误。
你可以看训练开始时终端日志,通常会有类似:
textTransferred xxx/yyy items from pretrained weights
如果看到这行,就说明预训练权重确实加载了。
如果 xxx 很大但小于 yyy,说明是部分加载成功,这正符合普通 yolo26s.pt 迁移到 yolo26s-p2.yaml 的情况。
更稳妥的判断方式:
bashgrep -i "Transferred" runs/detect/你的实验名*/args.yaml -r
或者直接翻训练日志,看有没有:
textTransferred ...
如果你命令写成下面这样:
bashmodel=yolo26s.pt
那就不是 P2 架构了,而是直接加载普通 YOLO26s 模型结构。Ultralytics 官方说明中,model 可以接 .pt 或 .yaml;.pt 主要定义/加载已有模型,.yaml 用于定义结构。(Ultralytics Docs)
所以你现在正确的 P2 迁移学习写法应该是:
bashyolo 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 结构,所以通常是部分权重加载;这是正常且推荐的迁移方式。