YOLOv8n行人检测实战:从数据集准备到模型训练
行人检测是计算机视觉领域的核心任务之一,在自动驾驶、安防监控、智慧城市等领域有广泛应用。本文将带你手把手实现YOLOv8n行人检测模型的完整训练流程。
一、为什么选择YOLOv8?
YOLO(You Only Look Once)是当前最先进的实时目标检测算法之一。最新版本YOLOv8在精度和速度上都实现了突破:
- 🚀 极速推理:640x640分辨率下可达300+FPS
- 🎯 更高精度:mAP指标较前代提升10-15%
- 🔧 易用性:简洁的API和丰富的预训练模型
- 📦 轻量化:YOLOv8n仅6MB大小,适合边缘设备部署
二、环境准备
mkdir PedestrianDet
cd PedestrianDet
docker run --gpus all --shm-size=32g -it \
-e NVIDIA_VISIBLE_DEVICES=all --privileged --net=host \
-v $PWD:/home -w /home --name PedestrianDet nvcr.io/nvidia/pytorch:24.03-py3 /bin/bash
2.1 环境配置解析
- GPU支持:
--gpus all
确保容器可以访问主机所有GPU - 共享内存:
--shm-size=32g
解决PyTorch多进程数据加载问题 - 目录映射:
-v $PWD:/home
将当前目录映射到容器内 - 基础镜像:使用NVIDIA官方PyTorch镜像确保CUDA环境兼容性
💡 为什么需要大共享内存?
PyTorch的DataLoader使用共享内存加速数据加载,行人检测数据集通常较大,32GB设置可避免BrokenPipeError
错误。
三、安装Ultralytics框架
git clone https://github.com/mikel-brostrom/ultralytics.git
cd ultralytics
git checkout 8e17ff56a9db8933a1962b88e05547dd2cce9c48
pip3.10 install .
pip3 install opencv-python==4.7.0.72 -i https://mirrors.aliyun.com/pypi/simple/
pip3 install opencv-contrib-python==4.7.0.72 -i https://mirrors.aliyun.com/pypi/simple/
pip3 install opencv-python-headless==4.7.0.72 -i https://mirrors.aliyun.com/pypi/simple/
⚠️ 为什么需要三个OpenCV包?
opencv-python
:主包包含基础功能opencv-contrib-python
:提供额外模块(如SIFT特征)opencv-python-headless
:无GUI支持,避免Docker环境下的显示问题
四、数据集准备与理解
4.1 数据集下载
mkdir -p /home/datasets/coco2017/
# 从这个链接下载labels1.zip和images.zip到/home/datasets/coco2017/并解压
https://aistudio.baidu.com/datasetdetail/136065
4.2 数据集结构
/home/datasets
└── coco2017
├── images
│ └── 000000581899.jpg
└── labels
└── 000000581899.txt
4.3 YOLO标签格式解析
每个.txt
文件对应一张图像,格式为:
<class_id> <x_center> <y_center> <width> <height>
- 归一化坐标:所有值在0-1之间,相对于图像宽高
- 一个目标一行:允许多个检测目标
五、数据集可视化:理解标注数据
cd /home/
cat> vis.py <<-'EOF'
import sys
import cv2
import os
import numpy as np
def visualize_yolo_dataset(image_path):
# 生成标签文件路径 (将/images/替换为/labels/,扩展名改为.txt)
label_path = image_path.replace('images', 'labels').replace('.jpg', '.txt')
if not os.path.exists(label_path):
print(f"Error: Label file not found at {label_path}")
return False
# 读取图像
image = cv2.imread(image_path)
if image is None:
print(f"Error: Failed to load image at {image_path}")
return False
img_height, img_width = image.shape[:2]
# 定义类别颜色映射 (可根据需要扩展)
class_colors = {
0: (0, 255, 0), # 行人 - 绿色
1: (0, 0, 255), # 汽车 - 红色
2: (255, 0, 0), # 自行车 - 蓝色
# 添加更多类别...
}
# 读取并处理标签文件
with open(label_path, 'r') as f:
lines = f.readlines()
for line in lines:
data = line.strip().split()
if len(data) < 5:
continue
class_id = int(data[0])
# 转换YOLO格式坐标 (归一化) 为像素坐标
x_center = float(data[1]) * img_width
y_center = float(data[2]) * img_height
width = float(data[3]) * img_width
height = float(data[4]) * img_height
# 计算矩形框坐标
x_min = int(x_center - width/2)
y_min = int(y_center - height/2)
x_max = int(x_center + width/2)
y_max = int(y_center + height/2)
# 确保坐标在图像范围内
x_min = max(0, x_min)
y_min = max(0, y_min)
x_max = min(img_width - 1, x_max)
y_max = min(img_height - 1, y_max)
# 获取类别颜色 (默认为白色)
color = class_colors.get(class_id, (255, 255, 255))
# 绘制边界框
cv2.rectangle(image, (x_min, y_min), (x_max, y_max), color, 2)
# 绘制类别标签
label = f"Class {class_id}"
cv2.putText(image, label, (x_min, y_min - 5),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1)
# 保存结果
cv2.imwrite('out.jpg', image)
print("Visualization saved to out.jpg")
return True
if __name__ == "__main__":
# 示例使用
image_path = sys.argv[1]
visualize_yolo_dataset(image_path)
EOF
python3.10 vis.py /home/datasets/coco2017/images/000000581899.jpg
5.1 可视化效果
🧠 为什么需要可视化?
- 验证标签文件是否正确
- 检查边界框是否准确标注行人
- 确认图像与标签的对应关系
- 发现数据集潜在问题(如漏标、错标)
六、多数据集融合训练
cd /home/
cat> persion.yaml <<-'EOF'
path: /home/datasets/
train:
- Caltech/images
- crowdhuman/train/
- WiderPerson/images
- VOC/images/train2007
- VOC/images/val2007
- VOC/images/val2012
- VOC/images/train2012
- coco2017/images
val:
- crowdhuman/val/images
names:
0: person
EOF
6.1 多数据集融合的优势
- 场景多样性:不同数据集覆盖不同场景(街道、人群、室内等)
- 光照变化:适应各种光照条件
- 尺度变化:包含远/近不同距离的行人
- 遮挡处理:提高对部分遮挡行人的识别能力
七、模型训练与参数解析
cd /home/
cat> train.py <<-'EOF'
from ultralytics import YOLO
# 初始化模型(使用YOLOv8n架构)
model = YOLO('yolov8n.yaml')
# 开始训练
results = model.train(
data="persion.yaml", # 配置文件路径
epochs=100, # 训练轮数
imgsz=640, # 输入图像尺寸
device="cuda", # 使用GPU加速
pretrained=False # 从零开始训练
)
EOF
python3.10 train.py
7.1 关键参数解析
-
epochs=100:
行人检测需要充分学习,100轮可平衡训练时间和精度 -
imgsz=640:
- 原始YOLOv8设计尺寸
- 兼顾精度和速度的最佳平衡点
- 高分辨率提升小目标检测能力
-
pretrained=False:
从零训练避免预训练模型的类别偏差
7.2 训练过程监控
训练启动后,终端将显示实时指标:
Epoch gpu_mem box_loss cls_loss dfl_loss Instances Size
0/99 7.58G 0.12345 0.05678 0.08901 32 640:
1/99 7.60G 0.09876 0.04321 0.07654 29 640:
...
- box_loss:边界框回归损失(越小越好)
- cls_loss:分类损失(越小越好)
- dfl_loss:分布焦点损失(YOLOv8特有)
八、训练优化技巧
-
学习率调整:
model.train(..., lr0=0.01, lrf=0.01)
- 初始学习率(lr0)设为0.01
- 最终学习率(lrf)为初始的1%
-
早停机制:
model.train(..., patience=10)
连续10轮验证集精度无提升时自动停止
-
数据增强:
model.train(..., hsv_h=0.015, hsv_s=0.7, hsv_v=0.4)
启用HSV色彩空间增强,提升光照鲁棒性
九、模型部署实战
训练好的模型可部署到多种平台:
# 导出ONNX格式
model.export(format='onnx')
# 使用OpenVINO优化
model.export(format='openvino')
9.1 RK3588边缘设备部署
- 模型量化(FP16/INT8)
- NPU硬件加速
- 后处理优化
十、总结与扩展
通过本教程,你已完成:
- Docker环境配置 ✅
- YOLOv8框架安装 ✅
- 多源行人数据集准备 ✅
- YOLOv8n模型训练 ✅