將 YOLOv11 的 .pt 模型轉換為 YOLOv8 格式需要特定的處理流程。以下是完整的轉換指南:
轉換原理
YOLOv11 和 YOLOv8 的核心差異在于:
- 模型結構:v11 使用 RepVGG 或 Swin Transformer 等新型骨干網絡
- 輸出頭:v11 可能使用解耦頭或 Anchor-Free 設計
- 后處理:v8 使用 Task-Aligned Assigner 而非 v11 的 SimOTA
轉換步驟
方法一:使用 Ultralytics 官方轉換(推薦)
from ultralytics import YOLO
加載 YOLOv11 模型
model = YOLO(‘yolov11.pt’)
轉換為 YOLOv8 格式
model.export(format=‘onnx’) # 先轉 ONNX
v8_model = YOLO(‘yolov11.onnx’) # 加載為 v8 模型
v8_model.save(‘yolov8.pt’) # 保存為 v8 格式
方法二:手動權重映射(高級)
import torch
加載 v11 權重
v11_weights = torch.load(‘yolov11.pt’)[‘model’].state_dict()
創建 v8 模型
from ultralytics.nn.tasks import DetectionModel
v8_model = DetectionModel(cfg=‘yolov8.yaml’)
關鍵層映射
mapping = {
‘backbone.conv1.weight’: ‘model.0.conv.weight’,
‘neck.fpn.0.conv.weight’: ‘model.15.cv1.conv.weight’,
# 根據實際結構添加更多映射…
}
權重轉移
for v11_name, v8_name in mapping.items():
v8_model.state_dict()[v8_name].copy_(v11_weights[v11_name])
保存轉換后模型
torch.save(v8_model.state_dict(), ‘yolov8_converted.pt’)
轉換工具推薦
-
官方轉換器:
yolo export model=yolov11.pt format=onnx
yolo train model=yolov11.onnx data=coco.yaml epochs=0 -
MMYOLO 轉換器:
pip install mmyolo
mim run mmyolo convert yolov11.pt yolov8.pt
轉換后驗證
from ultralytics import YOLO
加載轉換后模型
model = YOLO(‘yolov8.pt’)
驗證性能
results = model.val(data=‘coco.yaml’)
print(f"mAP50-95: {results.box.map}") # 應與原始模型接近
測試推理
model.predict(‘bus.jpg’, save=True)
常見問題解決方案
問題1:輸出維度不匹配
在轉換腳本中添加維度適配
import torch.nn as nn
class OutputAdapter(nn.Module):
def init(self, in_channels, out_channels):
super().init()
self.adapter = nn.Conv2d(in_channels, out_channels, 1)
def forward(self, x):return self.adapter(x)
在 v8 模型中添加適配層
v8_model.model[-1] = OutputAdapter(v11_output_dim, v8_output_dim)
問題2:后處理不兼容
使用 v8 的后處理替換
from ultralytics.utils.loss import v8DetectionLoss
v8_model.loss = v8DetectionLoss(v8_model)
問題3:Anchor 不匹配
更新 Anchor 設置
v8_model.model[-1].anchors = torch.tensor([
[10,13, 16,30, 33,23], # P3/8
[30,61, 62,45, 59,119], # P4/16
[116,90, 156,198, 373,326] # P5/32
])
最佳實踐建議
-
優先使用 ONNX 中轉:ONNX 作為中間格式兼容性最好
-
微調轉換后模型:
yolo train model=yolov8.pt data=yourdata.yaml epochs=50 -
使用轉換驗證腳本:
from ultralytics.utils.benchmarks import benchmark
benchmark(model=‘yolov8.pt’, imgsz=640)
重要提示:YOLOv11 非 Ultralytics 官方版本,轉換效果取決于具體實現。建議優先使用官方 YOLOv8 模型訓練,如需轉換,請確保原始模型符合 Apache 2.0 許可。