yolo11n.pt文件结构详解
·
yolo11n.pt 文件结构详解
📦 文件概览
- 文件名:
yolo11n.pt - 文件大小: 5.35 MB (5,613,764 字节)
- 文件类型: PyTorch checkpoint (
.pt= PyTorch) - 用途: YOLOv11n 预训练权重文件
🏗️ 文件结构
yolo11n.pt 是一个 Python 字典 (dict),使用 PyTorch 的 torch.save() 保存。
字典键值对 (13个顶层键)
| 序号 | 键名 | 类型 | 说明 |
|---|---|---|---|
| 1 | date | str | 模型创建日期: 2024-09-25T21:10:26.629566 |
| 2 | version | str | Ultralytics版本: 8.2.100 |
| 3 | license | str | 许可证: AGPL-3.0 License |
| 4 | docs | str | 文档链接: https://docs.ultralytics.com |
| 5 | epoch | int | 训练轮数: -1 (预训练模型) |
| 6 | best_fitness | NoneType | 最佳适应度: None |
| 7 | model | DetectionModel | 完整的模型对象 (核心) |
| 8 | ema | NoneType | EMA模型: None |
| 9 | updates | NoneType | 更新次数: None |
| 10 | optimizer | NoneType | 优化器状态: None |
| 11 | train_args | dict | 训练参数 (106个键) |
| 12 | train_metrics | dict | 训练指标 (14个键) |
| 13 | train_results | dict | 训练结果 (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)
| 层号 | 模块类型 | 输入→输出通道 | 参数量 | 作用 |
|---|---|---|---|---|
| 0 | Conv | 3 → 16 | 464 | P1: 输入层 (RGB→特征) |
| 1 | Conv | 16 → 32 | 4,672 | P2: 降采样 |
| 2 | C3k2 | 32 → 64 | 6,640 | 特征提取 |
| 3 | Conv | 64 → 64 | 36,992 | P3: 降采样 |
| 4 | C3k2 | 64 → 128 | 26,080 | 特征提取 |
| 5 | Conv | 128 → 128 | 147,712 | P4: 降采样 |
| 6 | C3k2 | 128 → 128 | 87,040 | 特征提取 (C3k块) |
| 7 | Conv | 128 → 256 | 295,424 | P5: 降采样 |
| 8 | C3k2 | 256 → 256 | 346,112 | 特征提取 (C3k块) |
| 9 | SPPF | 256 → 256 | 164,608 | 空间金字塔池化 |
| 10 | C2PSA | 256 → 256 | 249,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 - 自顶向下)
| 层号 | 模块类型 | 操作 | 说明 |
|---|---|---|---|
| 11 | Upsample | 上采样×2 | P5 → P4 上采样 |
| 12 | Concat | 拼接 | P5↑ + P4 → [B, 384, 40, 40] |
| 13 | C3k2 | 特征融合 | 384 → 128 |
| 14 | Upsample | 上采样×2 | P4融合 → P3 上采样 |
| 15 | Concat | 拼接 | P4↑ + P3 → [B, 256, 80, 80] |
| 16 | C3k2 | 特征融合 | 256 → 64 |
PAN (Path Aggregation Network - 自底向上)
| 层号 | 模块类型 | 操作 | 说明 |
|---|---|---|---|
| 17 | Conv | 下采样 | P3融合 → 降采样 |
| 18 | Concat | 拼接 | P3↓ + P4融合 → [B, 192, 40, 40] |
| 19 | C3k2 | 特征融合 | 192 → 128 |
| 20 | Conv | 下采样 | P4最终 → 降采样 |
| 21 | Concat | 拼接 | P4↓ + P5融合 → [B, 384, 20, 20] |
| 22 | C3k2 | 特征融合 | 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) | 说明 |
|---|---|---|---|---|---|
| 1 | model.7.conv.weight | [256, 128, 3, 3] | 294,912 | 1.13 | P5降采样卷积 |
| 2 | model.8.m.0.m.0.cv2.conv.weight | [64, 64, 3, 3] | 36,864 | 0.14 | C3k块卷积 |
| 3 | model.8.m.0.m.1.cv1.conv.weight | [64, 64, 3, 3] | 36,864 | 0.14 | C3k块卷积 |
| 4 | model.8.m.0.m.1.cv2.conv.weight | [64, 64, 3, 3] | 36,864 | 0.14 | C3k块卷积 |
| 5 | model.8.m.0.m.0.cv1.conv.weight | [64, 64, 3, 3] | 36,864 | 0.14 | C3k块卷积 |
| … | … | … | … | … | … |
张量分布特点:
- 最大的权重集中在 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]
变化的部分:
- ✅ Backbone: 权重完全复用 (特征提取不变)
- ✅ Neck: 权重完全复用 (特征融合不变)
- ⚠️ Head: 分类部分重新初始化 (80类 → 1类)
🆚 yolo11n.pt vs 自定义模型
| 项目 | yolo11n.pt | best.pt (训练后) |
|---|---|---|
| 类别数 | 80 (COCO) | 1 (ridderzuring) |
| 模型结构 | 标准YOLOv11n | 标准或改进 (带RFAConv) |
| 权重来源 | COCO预训练 | 在预训练基础上微调 |
| epoch | -1 (预训练) | 实际训练轮数 (如100) |
| best_fitness | None | 最高mAP值 |
| optimizer | None | 优化器状态 |
| ema | None | EMA模型 |
| 训练数据 | 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
原因:
- 预训练模型不需要优化器状态
- 不同任务会使用不同的优化器配置
- 减小文件大小 (优化器状态可能很大)
恢复训练时:
# 需要完整的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 (预训练模型不保存),
}
使用场景
- 直接推理: 检测COCO 80类物体
- 迁移学习: 作为自定义检测任务的起点
- 模型分析: 研究YOLOv11架构
- 权重初始化: 提取backbone/neck权重
关键优势
- ✅ 即用型: 无需训练即可检测80类物体
- ✅ 轻量级: 仅5.35 MB,适合边缘设备
- ✅ 通用性: COCO预训练,泛化能力强
- ✅ 可扩展: 易于微调到自定义任务
创建时间: 2024-11-17
YOLOv11 版本: 8.2.100
适用于: Ultralytics YOLOv11
更多推荐


所有评论(0)