当前位置: 首页 > article >正文

YOLOv8n行人检测实战:从数据集准备到模型训练

YOLOv8n行人检测实战:从数据集准备到模型训练

    • 一、为什么选择YOLOv8?
    • 二、环境准备
      • 2.1 环境配置解析
    • 三、安装Ultralytics框架
    • 四、数据集准备与理解
      • 4.1 数据集下载
      • 4.2 数据集结构
      • 4.3 YOLO标签格式解析
    • 五、数据集可视化:理解标注数据
      • 5.1 可视化效果
    • 六、多数据集融合训练
      • 6.1 多数据集融合的优势
    • 七、模型训练与参数解析
      • 7.1 关键参数解析
      • 7.2 训练过程监控
    • 八、训练优化技巧
    • 九、模型部署实战
      • 9.1 RK3588边缘设备部署
    • 十、总结与扩展
    • 十一、参考链接

行人检测是计算机视觉领域的核心任务之一,在自动驾驶、安防监控、智慧城市等领域有广泛应用。本文将带你手把手实现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 环境配置解析

  1. GPU支持--gpus all确保容器可以访问主机所有GPU
  2. 共享内存--shm-size=32g解决PyTorch多进程数据加载问题
  3. 目录映射-v $PWD:/home将当前目录映射到容器内
  4. 基础镜像:使用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 npdef 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 Falseimg_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:continueclass_id = int(data[0])# 转换YOLO格式坐标 (归一化) 为像素坐标x_center = float(data[1]) * img_widthy_center = float(data[2]) * img_heightwidth = float(data[3]) * img_widthheight = 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 Trueif __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 可视化效果

请添加图片描述

🧠 为什么需要可视化?

  1. 验证标签文件是否正确
  2. 检查边界框是否准确标注行人
  3. 确认图像与标签的对应关系
  4. 发现数据集潜在问题(如漏标、错标)

六、多数据集融合训练

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 多数据集融合的优势

  1. 场景多样性:不同数据集覆盖不同场景(街道、人群、室内等)
  2. 光照变化:适应各种光照条件
  3. 尺度变化:包含远/近不同距离的行人
  4. 遮挡处理:提高对部分遮挡行人的识别能力

七、模型训练与参数解析

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 关键参数解析

  1. epochs=100
    行人检测需要充分学习,100轮可平衡训练时间和精度

  2. imgsz=640

    • 原始YOLOv8设计尺寸
    • 兼顾精度和速度的最佳平衡点
    • 高分辨率提升小目标检测能力
  3. pretrained=False
    从零训练避免预训练模型的类别偏差

7.2 训练过程监控

训练启动后,终端将显示实时指标:

Epoch   gpu_mem       box_loss   cls_loss   dfl_loss  Instances       Size0/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特有)

八、训练优化技巧

  1. 学习率调整

    model.train(..., lr0=0.01, lrf=0.01)
    
    • 初始学习率(lr0)设为0.01
    • 最终学习率(lrf)为初始的1%
  2. 早停机制

    model.train(..., patience=10)
    

    连续10轮验证集精度无提升时自动停止

  3. 数据增强

    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边缘设备部署

在RK3588上实现YOLOv8n高效推理包含:

  1. 模型量化(FP16/INT8)
  2. NPU硬件加速
  3. 后处理优化

十、总结与扩展

通过本教程,你已完成:

  1. Docker环境配置 ✅
  2. YOLOv8框架安装 ✅
  3. 多源行人数据集准备 ✅
  4. YOLOv8n模型训练 ✅

十一、参考链接

  1. 行人检测-Caltech Pedestrian Dataset 数据集下载及格式转换
  2. Caltech_Pedestrain_Detection_Benchmark数据集获取并转换
  3. 使用yolov8训练Caltech Pedestrain行人数据集详细步骤
  4. 在RK3588上实现YOLOv8n高效推理
http://www.lryc.cn/news/2403812.html

相关文章:

  • 国标GB28181设备管理软件EasyGBS远程视频监控方案助力高效安全运营
  • 网络寻路--图论
  • LangChain4j 学习教程项目
  • 【Go语言基础【15】】数组:固定长度的连续存储结构
  • 【读论文】U-Net: Convolutional Networks for Biomedical Image Segmentation 卷积神经网络
  • Komiko 视频到视频功能炸裂上线!
  • Linux 文件系统与 I/O 编程核心原理及实践笔记
  • vite+tailwind封装组件库
  • Gin框架实战指南:从入门到进阶
  • 【Java学习笔记】包装类
  • 【高效开发工具系列】Blackmagic Disk Speed Test for Mac:专业硬盘测速工具
  • QtDBus模块功能及架构解析
  • 光学字符识别(OCR)理论概述与实践教程
  • 关键字--sizeof
  • Ubuntu20.04启动python的虚拟环境
  • 网页在线客服系统自动欢迎语实现方案(PHP+MySQL)
  • UniRig:如何在矩池云一站式解决 3D 模型绑定难题
  • 用函数实现模块化程序设计(适合考研、专升本)
  • 玩转抖音矩阵:核心玩法与高效运营规则
  • spring:继承接口FactoryBean获取bean实例
  • 字符串字典序最大后缀问题详解
  • VScode打开后一直显示正在重新激活终端 问题的解决方法
  • pe文件结构(TLS)
  • 二进制安全-OpenWrt-uBus
  • 分页查询的实现
  • 中型零售业数据库抉择:MySQL省成本,SQL SERVER?
  • 使用 Windows 完成 iOS 应用上架:Appuploader对比其他证书与上传方案
  • IDEA中的debug使用技巧
  • RockyLinux9.6搭建k8s集群
  • MS358A 低功耗运算放大器 车规