1. 项目概述:Windows平台下的YOLOv8行人检测训练方案
在安防监控、智慧交通、无人零售等领域,行人检测作为计算机视觉的基础任务,对实时性和准确度有着双重需求。YOLOv8作为Ultralytics公司2023年推出的新一代目标检测框架,其无锚点设计和优化的网络结构,使得在消费级GPU上实现实时高精度检测成为可能。本文将详细演示如何在Windows 10/11系统下,从零搭建YOLOv8训练环境,完成行人数据集的标注、训练及模型评估全流程。
实测环境:RTX 3060显卡 + i7-11800H处理器 + 32GB内存的Windows 11笔记本,训练yolov8s模型约需4小时(COCO格式的2万张行人图片)
2. 环境配置与工具选型
2.1 硬件需求分析
- 显卡:NVIDIA GTX 1660及以上(需支持CUDA 11.7+)
- 内存:建议16GB以上(处理大尺寸图片时占用显著)
- 存储:SSD硬盘加速数据读取,数据集空间预留50GB+
2.2 软件依赖安装
bash复制# 创建Python 3.8虚拟环境(避免版本冲突)
conda create -n yolov8 python=3.8
conda activate yolov8
# 安装PyTorch with CUDA 11.7
pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 --extra-index-url https://download.pytorch.org/whl/cu117
# 安装Ultralytics官方包
pip install ultralytics
2.3 关键组件验证
python复制import torch
print(torch.cuda.is_available()) # 应返回True
print(torch.version.cuda) # 应显示11.7
3. 数据集准备与增强策略
3.1 数据源选择建议
- 公开数据集:
- CrowdHuman (24万行人标注)
- WiderPerson (12万密集场景样本)
- COCO-person (仅提取person类别)
- 自建数据集:
- 使用LabelImg或CVAT标注工具
- 建议至少收集2000张场景多样的图片
3.2 数据格式转换示例
COCO格式转YOLOv8格式的转换脚本:
python复制import json
from pathlib import Path
def coco2yolo(coco_json, output_dir):
with open(coco_json) as f:
data = json.load(f)
for img in data['images']:
img_id = img['id']
anns = [a for a in data['annotations'] if a['image_id'] == img_id]
txt_path = Path(output_dir)/f"{Path(img['file_name']).stem}.txt"
with open(txt_path, 'w') as f:
for a in anns:
# 转换bbox格式: [x,y,w,h] -> [cx,cy,w,h] (归一化)
x, y, w, h = a['bbox']
cx = (x + w/2) / img['width']
cy = (y + h/2) / img['height']
nw = w / img['width']
nh = h / img['height']
f.write(f"0 {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}\n")
3.3 数据增强配置
修改data.yaml文件中的增强参数:
yaml复制train: ../train/images
val: ../val/images
nc: 1 # 行人单类别
names: ['person']
# 增强参数
augmentation:
hsv_h: 0.015 # 色相抖动
hsv_s: 0.7 # 饱和度增强
hsv_v: 0.4 # 明度变化
degrees: 10.0 # 旋转角度
translate: 0.1 # 平移比例
scale: 0.5 # 缩放幅度
shear: 0.0 # 剪切变换
perspective: 0.0001 # 透视变换
flipud: 0.0 # 上下翻转概率
fliplr: 0.5 # 左右翻转概率
4. 模型训练与调优实战
4.1 启动训练命令
bash复制yolo task=detect mode=train model=yolov8s.pt data=data.yaml epochs=100 imgsz=640 batch=16 optimizer=Adam
4.2 关键参数解析
| 参数名 | 推荐值 | 作用说明 |
|---|---|---|
| patience | 50 | 早停机制等待轮次 |
| cos_lr | True | 余弦退火学习率调度 |
| dropout | 0.2 | 防止过拟合 |
| weight_decay | 0.0005 | L2正则化系数 |
4.3 训练过程监控
使用TensorBoard查看指标:
bash复制tensorboard --logdir runs/detect
重点关注:
- metrics/precision(B): 行人类别的精确率
- metrics/recall(B): 行人类别的召回率
- val/box_loss: 验证集边界框损失
5. 模型评估与部署
5.1 性能验证脚本
python复制from ultralytics import YOLO
model = YOLO('runs/detect/train/weights/best.pt')
metrics = model.val(data='data.yaml', split='val')
print(f"mAP50-95: {metrics.box.map:.3f}")
5.2 导出为ONNX格式
bash复制yolo export model=best.pt format=onnx opset=12 simplify=True
5.3 Windows平台推理示例
python复制import cv2
from ultralytics import YOLO
model = YOLO('best.onnx')
cap = cv2.VideoCapture(0) # 摄像头输入
while True:
ret, frame = cap.read()
results = model(frame, conf=0.5)
annotated = results[0].plot()
cv2.imshow('YOLOv8 Detection', annotated)
if cv2.waitKey(1) == ord('q'):
break
6. 常见问题排查手册
6.1 CUDA内存不足错误
markdown复制# 解决方案:
1. 减小batch size(建议从16开始尝试)
2. 降低图片分辨率(imgsz从640调整为416)
3. 添加--device 0参数强制使用GPU
6.2 标注文件加载失败
markdown复制# 检查清单:
- 确认txt文件与图片同名且同目录
- 验证标注坐标是否归一化(0-1之间)
- 检查文件编码为UTF-8无BOM头
6.3 训练指标波动大
markdown复制# 调优建议:
- 增大warmup_epochs(默认3,可调至10)
- 使用--adam优化器替代SGD
- 检查数据集中是否存在错误标注
7. 进阶优化技巧
7.1 模型轻量化方案
- 知识蒸馏:用yolov8x指导yolov8n训练
- 剪枝:使用TorchPruner移除冗余通道
- 量化:导出INT8格式的TensorRT引擎
7.2 多尺度训练配置
修改训练命令:
bash复制yolo train ... scale=0.5,1.0,1.5 # 随机选择缩放比例
7.3 自定义损失函数
继承YOLOv8的Loss类:
python复制from ultralytics.yolo.utils.loss import DetectionLoss
class CustomLoss(DetectionLoss):
def __call__(self, preds, batch):
# 修改分类损失权重
self.lambda_class = 0.8
return super().__call__(preds, batch)
在实际部署中发现,对于遮挡严重的行人场景,将conf_thres从默认0.25降至0.1,配合iou_thres=0.6能显著提升召回率,虽然会引入部分误检,但可通过后处理过滤。另外建议对视频流采用时间一致性校验,利用跟踪算法平滑检测结果。
