YOLO(You Only Look Once)是当前最流行的实时目标检测算法系列之一,YOLOv11作为该系列的最新演进版本,继承了YOLO家族高效、快速的特点,同时在精度和速度上有了进一步提升。本教程将详细介绍如何在Windows 11系统下使用PyTorch框架和PyCharm IDE进行YOLOv11模型的训练与部署。
目标检测作为计算机视觉的核心任务之一,在自动驾驶、安防监控、工业质检、医疗影像分析等领域有着广泛应用。YOLOv11凭借其出色的实时性能,特别适合需要快速响应的应用场景。
YOLO系列自2016年首次提出以来,经历了多个版本的迭代:
YOLOv11在前代基础上引入了多项改进:
YOLOv11适用于多种实时目标检测场景:
python --version
CUDA_PATH = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7
PATH中添加: %CUDA_PATH%\bin
在PyCharm中:
在PyCharm终端或命令行中运行:
pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
验证PyTorch GPU支持:
import torch
print(torch.cuda.is_available()) # 应输出True
pip install opencv-python matplotlib tqdm pandas seaborn
pip install pycocotools tensorboard
YOLOv11采用了一种改进的CSPDarknet骨干网络,结合PANet特征金字塔和动态头机制:
输入图像 → 数据增强 → CSPDarknet骨干 → PANet特征融合 → 动态检测头 → 输出预测
↑
GT标签 → 标签分配 → 损失计算
以COCO格式数据集为例:
dataset/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/
创建数据集配置文件data/custom.yaml
:
# 训练和验证图像路径
train: ../dataset/images/train
val: ../dataset/images/val
# 类别数
nc: 3
# 类别名称
names: ['person', 'car', 'dog']
下载YOLOv11官方代码库:
git clone https://github.com/WongKinYiu/yolov11
cd yolov11
训练脚本示例:
import torch
from models.yolo import Model
from utils.datasets import create_dataloader
from utils.general import colorstr
# 超参数配置
hyp = {
'lr0': 0.01, # 初始学习率
'momentum': 0.937, # SGD动量
'weight_decay': 0.0005, # 权重衰减
'warmup_epochs': 3.0, # 热身epochs
'box': 0.05, # box损失权重
'cls': 0.5, # cls损失权重
'obj': 1.0, # obj损失权重
}
# 数据加载
train_loader = create_dataloader('data/custom.yaml',
imgsz=640,
batch_size=16,
stride=32,
hyp=hyp,
augment=True)[0]
# 模型初始化
model = Model('models/yolov11s.yaml', ch=3, nc=3).to('cuda')
# 优化器
optimizer = torch.optim.SGD(model.parameters(),
lr=hyp['lr0'],
momentum=hyp['momentum'],
nesterov=True)
# 训练循环
for epoch in range(100):
model.train()
for i, (imgs, targets, paths, _) in enumerate(train_loader):
imgs = imgs.to('cuda').float() / 255.0
targets = targets.to('cuda')
# 前向传播
pred = model(imgs)
# 计算损失
loss, loss_items = compute_loss(pred, targets, model)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 打印训练信息
if i % 50 == 0:
print(f'Epoch: {epoch}, Batch: {i}, Loss: {loss.item()}')
from utils.metrics import ap_per_class
# 验证数据加载
val_loader = create_dataloader('data/custom.yaml',
imgsz=640,
batch_size=16,
stride=32,
hyp=hyp,
augment=False,
pad=0.5,
rect=True)[0]
# 验证模式
model.eval()
stats = []
for i, (imgs, targets, paths, shapes) in enumerate(val_loader):
imgs = imgs.to('cuda').float() / 255.0
# 非极大值抑制(NMS)参数
conf_thres = 0.001 # 置信度阈值
iou_thres = 0.6 # IoU阈值
with torch.no_grad():
# 推理
pred = model(imgs)
pred = non_max_suppression(pred, conf_thres, iou_thres)
# 处理每张图像的预测结果
for si, pred in enumerate(pred):
labels = targets[targets[:, 0] == si, 1:]
stats.append(ap_per_class(pred, labels, shapes[si][0]))
# 计算mAP
mp, mr, map50, map = [x.mean() for x in zip(*stats)]
print(f'[email protected]: {map50:.4f}, [email protected]:0.95: {map:.4f}')
导出为TorchScript格式:
model = Model('models/yolov11s.yaml', ch=3, nc=3).to('cuda')
model.load_state_dict(torch.load('yolov11s.pt')['model'])
model.eval()
# 示例输入
example = torch.rand(1, 3, 640, 640).to('cuda')
# 跟踪模型
traced_script_module = torch.jit.trace(model, example)
traced_script_module.save("yolov11s_traced.pt")
ONNX导出:
torch.onnx.export(model, # 模型
example, # 示例输入
"yolov11s.onnx", # 输出文件名
export_params=True, # 导出训练参数
opset_version=12, # ONNX版本
do_constant_folding=True, # 优化常量
input_names=['images'], # 输入名
output_names=['output'], # 输出名
dynamic_axes={'images': {0: 'batch'}, # 动态batch
'output': {0: 'batch'}})
import cv2
import torch
from models.common import DetectMultiBackend
from utils.general import non_max_suppression, scale_coords
# 加载模型
device = torch.device('cuda:0')
model = DetectMultiBackend('yolov11s.pt', device=device)
# 视频流处理
cap = cv2.VideoCapture(0) # 0表示默认摄像头
while True:
ret, frame = cap.read()
if not ret:
break
# 预处理
img = cv2.resize(frame, (640, 640))
img = img[:, :, ::-1].transpose(2, 0, 1) # BGR to RGB
img = torch.from_numpy(img).to(device).float() / 255.0
img = img.unsqueeze(0)
# 推理
pred = model(img)
# NMS
pred = non_max_suppression(pred, 0.25, 0.45)
# 处理结果
for det in pred[0]:
if len(det):
det[:, :4] = scale_coords(img.shape[2:], det[:, :4], frame.shape).round()
for *xyxy, conf, cls in reversed(det):
label = f'{model.names[int(cls)]} {conf:.2f}'
cv2.rectangle(frame, (int(xyxy[0]), int(xyxy[1])),
(int(xyxy[2]), int(xyxy[3])), (0, 255, 0), 2)
cv2.putText(frame, label, (int(xyxy[0]), int(xyxy[1])-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 显示
cv2.imshow('YOLOv11 Detection', frame)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
CUDA out of memory
torch.cuda.empty_cache()
训练损失不下降
低mAP问题
推理速度慢
model.half()
本教程详细介绍了在Windows 11系统下使用PyTorch和PyCharm进行YOLOv11模型训练的全流程,包括环境配置、算法原理、代码实现和部署应用。YOLOv11作为当前最先进的实时目标检测算法之一,在保持YOLO系列高速特性的同时,通过多项创新提升了检测精度。
通过本教程,读者可以掌握:
随着计算机视觉技术的不断发展,目标检测算法将在更多领域发挥重要作用。掌握YOLOv11等先进模型的开发部署能力,将为从事AI相关工作的开发者带来显著优势。