yolo11n.pt 文件结构详解

📦 文件概览

  • 文件名: yolo11n.pt
  • 文件大小: 5.35 MB (5,613,764 字节)
  • 文件类型: PyTorch checkpoint (.pt = PyTorch)
  • 用途: YOLOv11n 预训练权重文件

🏗️ 文件结构

yolo11n.pt 是一个 Python 字典 (dict),使用 PyTorch 的 torch.save() 保存。

字典键值对 (13个顶层键)

序号键名类型说明
1datestr模型创建日期: 2024-09-25T21:10:26.629566
2versionstrUltralytics版本: 8.2.100
3licensestr许可证: AGPL-3.0 License
4docsstr文档链接: https://docs.ultralytics.com
5epochint训练轮数: -1 (预训练模型)
6best_fitnessNoneType最佳适应度: None
7modelDetectionModel完整的模型对象 (核心)
8emaNoneTypeEMA模型: None
9updatesNoneType更新次数: None
10optimizerNoneType优化器状态: None
11train_argsdict训练参数 (106个键)
12train_metricsdict训练指标 (14个键)
13train_resultsdict训练结果 (14个键)

🧠 核心内容: model 键

模型基本信息

model = checkpoint['model']
# 类型: ultralytics.nn.tasks.DetectionModel

# 关键属性:
model.nc = 80                    # 类别数量 (COCO数据集)
model.names = {                  # 类别名称字典
    0: 'person',
    1: 'bicycle',
    2: 'car',
    # ... 共80个类别
    79: 'toothbrush'
}

模型参数统计

指标数值
总参数量2,624,080 个
可训练参数0 个 (预训练模型,requires_grad=False)
参数大小10.01 MB (float32)
模型层数24 层 (0-23)

完整的80个COCO类别

{
    0: 'person',        1: 'bicycle',      2: 'car',           3: 'motorcycle',
    4: 'airplane',      5: 'bus',          6: 'train',         7: 'truck',
    8: 'boat',          9: 'traffic light', 10: 'fire hydrant', 11: 'stop sign',
    12: 'parking meter', 13: 'bench',       14: 'bird',         15: 'cat',
    16: 'dog',          17: 'horse',       18: 'sheep',        19: 'cow',
    20: 'elephant',     21: 'bear',        22: 'zebra',        23: 'giraffe',
    24: 'backpack',     25: 'umbrella',    26: 'handbag',      27: 'tie',
    28: 'suitcase',     29: 'frisbee',     30: 'skis',         31: 'snowboard',
    32: 'sports ball',  33: 'kite',        34: 'baseball bat', 35: 'baseball glove',
    36: 'skateboard',   37: 'surfboard',   38: 'tennis racket', 39: 'bottle',
    40: 'wine glass',   41: 'cup',         42: 'fork',         43: 'knife',
    44: 'spoon',        45: 'bowl',        46: 'banana',       47: 'apple',
    48: 'sandwich',     49: 'orange',      50: 'broccoli',     51: 'carrot',
    52: 'hot dog',      53: 'pizza',       54: 'donut',        55: 'cake',
    56: 'chair',        57: 'couch',       58: 'potted plant', 59: 'bed',
    60: 'dining table', 61: 'toilet',      62: 'tv',           63: 'laptop',
    64: 'mouse',        65: 'remote',      66: 'keyboard',     67: 'cell phone',
    68: 'microwave',    69: 'oven',        70: 'toaster',      71: 'sink',
    72: 'refrigerator', 73: 'book',        74: 'clock',        75: 'vase',
    76: 'scissors',     77: 'teddy bear',  78: 'hair drier',   79: 'toothbrush'
}

🏛️ 模型架构 (24层)

Backbone (特征提取 - Layers 0-10)

层号模块类型输入→输出通道参数量作用
0Conv3 → 16464P1: 输入层 (RGB→特征)
1Conv16 → 324,672P2: 降采样
2C3k232 → 646,640特征提取
3Conv64 → 6436,992P3: 降采样
4C3k264 → 12826,080特征提取
5Conv128 → 128147,712P4: 降采样
6C3k2128 → 12887,040特征提取 (C3k块)
7Conv128 → 256295,424P5: 降采样
8C3k2256 → 256346,112特征提取 (C3k块)
9SPPF256 → 256164,608空间金字塔池化
10C2PSA256 → 256249,728位置自注意力

特征图尺寸变化 (假设输入 640×640):

输入: [B, 3, 640, 640]
  ↓ Layer 0-1
P2: [B, 32, 160, 160]
  ↓ Layer 2-3
P3: [B, 64, 80, 80]   ← 保存用于FPN
  ↓ Layer 4-5
P4: [B, 128, 40, 40]  ← 保存用于FPN
  ↓ Layer 6-10
P5: [B, 256, 20, 20]  ← 保存用于FPN

Neck (特征融合 - Layers 11-22)

FPN (Feature Pyramid Network - 自顶向下)
层号模块类型操作说明
11Upsample上采样×2P5 → P4 上采样
12Concat拼接P5↑ + P4 → [B, 384, 40, 40]
13C3k2特征融合384 → 128
14Upsample上采样×2P4融合 → P3 上采样
15Concat拼接P4↑ + P3 → [B, 256, 80, 80]
16C3k2特征融合256 → 64
PAN (Path Aggregation Network - 自底向上)
层号模块类型操作说明
17Conv下采样P3融合 → 降采样
18Concat拼接P3↓ + P4融合 → [B, 192, 40, 40]
19C3k2特征融合192 → 128
20Conv下采样P4最终 → 降采样
21Concat拼接P4↓ + P5融合 → [B, 384, 20, 20]
22C3k2特征融合384 → 256

融合后的多尺度特征:

P3_out: [B, 64, 80, 80]    ← 小目标检测
P4_out: [B, 128, 40, 40]   ← 中目标检测
P5_out: [B, 256, 20, 20]   ← 大目标检测

Head (检测头 - Layer 23)

Layer 23: Detect

结构:

Detect(
    cv2: ModuleList,  # 边界框回归分支
    cv3: ModuleList,  # 分类分支
    dfl: DFL         # Distribution Focal Loss
)

三个检测尺度的输出:

尺度输入特征输出形状感受野适用目标
P3[B, 64, 80, 80][B, 144, 80, 80]小小目标 (如人脸、手机)
P4[B, 128, 40, 40][B, 144, 40, 40]中中目标 (如人、车)
P5[B, 256, 20, 20][B, 144, 20, 20]大大目标 (如卡车、建筑)

输出通道说明 (144 = 80类 + 64框):

每个预测:
  - 80 个类别概率 (nc=80)
  - 64 个边界框参数 (4坐标 × 16分布)

总计: 80 + 64 = 144 通道

🔢 权重张量统计

总体统计

  • 总张量数量: 499 个
  • 总参数量: 2,624,080 个
  • 总内存占用: 10.01 MB (float32)

前20个最大的权重张量

序号张量名称形状参数量大小(MB)说明
1model.7.conv.weight[256, 128, 3, 3]294,9121.13P5降采样卷积
2model.8.m.0.m.0.cv2.conv.weight[64, 64, 3, 3]36,8640.14C3k块卷积
3model.8.m.0.m.1.cv1.conv.weight[64, 64, 3, 3]36,8640.14C3k块卷积
4model.8.m.0.m.1.cv2.conv.weight[64, 64, 3, 3]36,8640.14C3k块卷积
5model.8.m.0.m.0.cv1.conv.weight[64, 64, 3, 3]36,8640.14C3k块卷积
………………

张量分布特点:

  • 最大的权重集中在 backbone 深层 (Layer 7-8)
  • 卷积核 占据主要参数量
  • BatchNorm 参数相对较少
  • 检测头 参数分散在多个小张量中

📊 训练参数 (train_args)

关键训练配置 (部分)

train_args = {
    'task': 'detect',                     # 任务类型
    'mode': 'train',                      # 模式
    'model': 'yolo11n.yaml',             # 模型配置
    'data': '.../coco.yaml',             # 数据集 (COCO)
    'epochs': 600,                        # 训练轮数
    'batch': 128,                         # 批次大小
    'imgsz': 640,                         # 图像大小
    'patience': 100,                      # 早停耐心值

    # 优化器
    'optimizer': 'auto',                  # 自动选择
    'lr0': 0.01,                         # 初始学习率
    'lrf': 0.01,                         # 最终学习率比例
    'momentum': 0.937,                    # 动量
    'weight_decay': 0.0005,              # 权重衰减

    # 数据增强
    'hsv_h': 0.015,                      # HSV色调
    'hsv_s': 0.7,                        # HSV饱和度
    'hsv_v': 0.4,                        # HSV明度
    'degrees': 0.0,                      # 旋转角度
    'translate': 0.1,                    # 平移
    'scale': 0.5,                        # 缩放
    'fliplr': 0.5,                       # 左右翻转
    'mosaic': 1.0,                       # Mosaic增强
    'mixup': 0.0,                        # Mixup增强

    # 其他
    'device': '',                        # 设备 (自动)
    'workers': 8,                        # 数据加载线程
    'project': 'runs/detect',            # 项目路径
    'name': 'train',                     # 实验名称
    'save': True,                        # 保存模型
    'save_period': -1,                   # 保存频率
    'cache': False,                      # 缓存图像
    'amp': True,                         # 混合精度
}

共 106 个参数,涵盖训练的所有方面。


🎓 使用方法

1. 加载预训练模型

import torch
from ultralytics import YOLO

# 方法1: 使用 Ultralytics API
model = YOLO('yolo11n.pt')

# 方法2: 直接加载 checkpoint
checkpoint = torch.load('yolo11n.pt', map_location='cpu')
model = checkpoint['model']

2. 查看模型信息

# 查看类别
print(model.names)
# {0: 'person', 1: 'bicycle', ..., 79: 'toothbrush'}

# 查看类别数
print(model.nc)
# 80

# 查看参数量
total_params = sum(p.numel() for p in model.parameters())
print(f"Total parameters: {total_params:,}")
# Total parameters: 2,624,080

3. 迁移学习 (微调到自定义数据集)

from ultralytics import YOLO

# 加载预训练模型
model = YOLO('yolo11n.pt')

# 在自定义数据集上训练
results = model.train(
    data='custom_data.yaml',  # 自定义数据集
    epochs=100,
    imgsz=640,
    batch=16
)

# 预训练权重的作用:
# 1. Backbone权重保留 (特征提取能力)
# 2. Neck权重保留 (特征融合能力)
# 3. Head权重部分保留 (根据类别数调整)

4. 推理

model = YOLO('yolo11n.pt')

# 单张图像
results = model('image.jpg')

# 批量图像
results = model(['img1.jpg', 'img2.jpg', 'img3.jpg'])

# 视频
results = model('video.mp4')

# 摄像头
results = model(0)  # 0 = 默认摄像头

🔄 为什么需要修改?

训练自定义数据集时的变化

原始 yolo11n.pt (COCO预训练):
checkpoint['model'].nc = 80
checkpoint['model'].names = {0: 'person', ..., 79: 'toothbrush'}

# 检测头输出:
# P3: [B, 144, 80, 80]  # 144 = 80类 + 64框
# P4: [B, 144, 40, 40]
# P5: [B, 144, 20, 20]
训练后的 best.pt (自定义1类):
checkpoint['model'].nc = 1
checkpoint['model'].names = {0: 'ridderzuring'}

# 检测头输出:
# P3: [B, 65, 80, 80]  # 65 = 1类 + 64框
# P4: [B, 65, 40, 40]
# P5: [B, 65, 20, 20]

变化的部分:

  1. ✅ Backbone: 权重完全复用 (特征提取不变)
  2. ✅ Neck: 权重完全复用 (特征融合不变)
  3. ⚠️ Head: 分类部分重新初始化 (80类 → 1类)

🆚 yolo11n.pt vs 自定义模型

项目yolo11n.ptbest.pt (训练后)
类别数80 (COCO)1 (ridderzuring)
模型结构标准YOLOv11n标准或改进 (带RFAConv)
权重来源COCO预训练在预训练基础上微调
epoch-1 (预训练)实际训练轮数 (如100)
best_fitnessNone最高mAP值
optimizerNone优化器状态
emaNoneEMA模型
训练数据COCO数据集自定义数据集
用途通用物体检测特定任务 (杂草检测)

🔑 关键技术点

1. 模型序列化格式

checkpoint = {
    'model': DetectionModel(...),     # 完整模型对象
    'date': '2024-09-25...',          # 元数据
    'version': '8.2.100',
    'train_args': {...},              # 训练配置
    # ...
}

# 保存
torch.save(checkpoint, 'yolo11n.pt')

# 加载
checkpoint = torch.load('yolo11n.pt', map_location='cpu')

2. 权重初始化策略

预训练模型 (yolo11n.pt):

  • Backbone: Xavier/Kaiming 初始化 → COCO训练
  • Neck: Xavier/Kaiming 初始化 → COCO训练
  • Head: Xavier/Kaiming 初始化 → COCO训练

迁移学习 (加载预训练权重):

  • Backbone: 使用预训练权重 ✅
  • Neck: 使用预训练权重 ✅
  • Head:
    • 如果类别数相同: 使用预训练权重 ✅
    • 如果类别数不同: 重新初始化 ⚠️

3. 模型状态管理

# 训练时的完整checkpoint
checkpoint = {
    'model': model.state_dict(),          # 模型权重
    'optimizer': optimizer.state_dict(),  # 优化器状态
    'epoch': epoch,                       # 当前轮数
    'best_fitness': best_map,             # 最佳mAP
    'ema': ema.state_dict(),             # EMA模型
    'updates': global_step,               # 全局步数
}

# 预训练模型 (yolo11n.pt)
checkpoint = {
    'model': model,                       # 完整模型对象
    'optimizer': None,                    # 不保存
    'epoch': -1,                          # 标记为预训练
    'best_fitness': None,
    'ema': None,
    'updates': None,
}

📚 深入理解

为什么 epoch = -1?

checkpoint['epoch'] = -1

含义:

  • -1 表示这是一个 预训练模型
  • 不是某次训练的中间checkpoint
  • 可以作为新训练的起点

对比:

# 预训练模型
epoch = -1  # 起始点

# 训练checkpoint
epoch = 50  # 第50轮的状态

# 最终模型
epoch = 100  # 训练完成

为什么 optimizer = None?

checkpoint['optimizer'] = None

原因:

  1. 预训练模型不需要优化器状态
  2. 不同任务会使用不同的优化器配置
  3. 减小文件大小 (优化器状态可能很大)

恢复训练时:

# 需要完整的checkpoint
checkpoint = {
    'model': ...,
    'optimizer': optimizer.state_dict(),  # 必需!
    'epoch': 50,
    # ...
}

# 恢复
model.load_state_dict(checkpoint['model'])
optimizer.load_state_dict(checkpoint['optimizer'])
start_epoch = checkpoint['epoch'] + 1

权重张量的命名规则

# 张量名称格式:
'model.{layer_idx}.{module_name}.{sub_module}.{param_type}'

# 示例:
'model.7.conv.weight'           # Layer 7的卷积核权重
'model.7.bn.weight'             # Layer 7的BN层权重
'model.7.bn.bias'               # Layer 7的BN层偏置
'model.8.m.0.cv1.conv.weight'   # Layer 8的子模块卷积核

# 解析:
# model           - 模型对象
# 7               - 第7层
# conv            - Conv模块
# weight          - 权重参数

🎯 实用技巧

1. 检查模型是否已训练

checkpoint = torch.load('model.pt')

if checkpoint['epoch'] == -1:
    print("这是预训练模型")
elif checkpoint['optimizer'] is not None:
    print("这是训练checkpoint,可以恢复训练")
else:
    print("这是最终模型")

2. 提取特定层的权重

checkpoint = torch.load('yolo11n.pt')
model = checkpoint['model']

# 提取backbone (Layer 0-10)
backbone_state = {}
for name, param in model.state_dict().items():
    if name.startswith('model.') and int(name.split('.')[1]) <= 10:
        backbone_state[name] = param

# 保存backbone
torch.save(backbone_state, 'yolo11n_backbone.pt')

3. 修改类别数

checkpoint = torch.load('yolo11n.pt')

# 修改类别数
checkpoint['model'].nc = 1
checkpoint['model'].names = {0: 'custom_object'}

# 重新初始化检测头
# (Ultralytics会自动处理)

torch.save(checkpoint, 'yolo11n_custom.pt')

📖 参考资料

相关文件

  • yolo11n.yaml - 模型架构配置
  • coco.yaml - COCO数据集配置
  • train.py - 训练脚本
  • predict.py - 推理脚本

文档链接


总结

yolo11n.pt 的本质

yolo11n.pt = {
    '元数据': {
        'date': 创建时间,
        'version': Ultralytics版本,
        'license': 许可证,
    },
    '模型': {
        'model': 完整的DetectionModel对象,
        '  ├─ Backbone': 特征提取层 (Layer 0-10),
        '  ├─ Neck': 特征融合层 (Layer 11-22),
        '  └─ Head': 检测头 (Layer 23),
    },
    '训练信息': {
        'epoch': -1 (预训练),
        'train_args': 106个训练参数,
        'train_metrics': 训练指标,
        'train_results': 训练结果,
    },
    '优化器状态': None (预训练模型不保存),
}

使用场景

  1. 直接推理: 检测COCO 80类物体
  2. 迁移学习: 作为自定义检测任务的起点
  3. 模型分析: 研究YOLOv11架构
  4. 权重初始化: 提取backbone/neck权重

关键优势

  • ✅ 即用型: 无需训练即可检测80类物体
  • ✅ 轻量级: 仅5.35 MB,适合边缘设备
  • ✅ 通用性: COCO预训练,泛化能力强
  • ✅ 可扩展: 易于微调到自定义任务

创建时间: 2024-11-17
YOLOv11 版本: 8.2.100
适用于: Ultralytics YOLOv11

更多推荐