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

news2025/6/8 6:21:56

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 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 可视化效果

请添加图片描述

🧠 为什么需要可视化?

  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       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特有)

八、训练优化技巧

  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.coloradmin.cn/o/2403812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国标GB28181设备管理软件EasyGBS远程视频监控方案助力高效安全运营

一、方案背景​ 在商业快速扩张的背景下&#xff0c;连锁店门店数量激增&#xff0c;分布范围广。但传统人工巡检、电话汇报等管理方式效率低下&#xff0c;存在信息滞后、管理盲区&#xff0c;难以掌握店铺运营情况&#xff0c;影响企业效率与安全。网络远程视频监控系统可有…

网络寻路--图论

所以我们固定题中M条边&#xff08;因为这M条一定联通&#xff09; P8605 [蓝桥杯 2013 国 AC] 网络寻路 - 洛谷 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typedef pair<int,int> pii; int n,m; int d[N],u[N],v[N]…

LangChain4j 学习教程项目

LangChain4j 学习教程 项目地址项目简介主要功能使用的技术和库项目环境配置环境要求 依赖版本每天学习内容和目标Day 01Day 02Day 03Day 04Day 05Day 06Day 07Day 08Day 09Day 10Day 11Day 12重点学习内容 RAG 经过为期12天&#xff08;日均1小时&#xff09;的LangChain4j源码…

【读论文】U-Net: Convolutional Networks for Biomedical Image Segmentation 卷积神经网络

摘要1 Introduction2 Network Architecture3 Training3.1 Data Augmentation 4 Experiments5 Conclusion背景知识卷积激活函数池化上采样、上池化、反卷积softmax 归一化函数交叉熵损失 Olaf Ronneberger, Philipp Fischer, Thomas Brox Paper&#xff1a;https://arxiv.org/ab…

Linux 文件系统与 I/O 编程核心原理及实践笔记

文章目录 一、理解文件1.1 狭义理解1.2 广义理解1.3 文件操作的归类认识1.4 系统角度&#xff1a;进程与文件的交互1.5 实践示例 二、回顾 C 文件接口2.1 hello.c 打开文件2.2 hello.c 写文件2.3 hello.c 读文件2.4 输出信息到显示器的几种方法2.5 stdin & stdout & st…

vite+tailwind封装组件库

前言 演示视频 https://www.bilibili.com/video/BV1EST3zPEyP/?spm_id_from333.1387.homepage.video_card.click 参考 https://juejin.cn/post/7112295067682865166 https://juejin.cn/post/7046187185615142949 代码仓库 https://gitee.com/malguy/vite-components-li…

【Java学习笔记】包装类

包装类&#xff08;Wrapper&#xff09; 1. 介绍 &#xff08;1&#xff09;针对八种基本数据类型相应的引用类型 --> 包装类 &#xff08;2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法 2. 分类和继承关系 基本数据类型包装类父类booleanBooleanObjectc…

【高效开发工具系列】Blackmagic Disk Speed Test for Mac:专业硬盘测速工具

博客目录 一、Blackmagic Disk Speed Test 概述二、软件核心功能解析三、v3.3 版本的新特性与改进四、实际应用场景分析五、使用技巧与最佳实践六、与其他工具的比较及优势 一、Blackmagic Disk Speed Test 概述 Blackmagic Disk Speed Test 是 Mac 平台上广受专业人士青睐的一…

UniRig:如何在矩池云一站式解决 3D 模型绑定难题

在 3D 动画制作中&#xff0c;绑定&#xff08;Rigging&#xff09;是一个至关重要但复杂耗时的步骤。它包括为 3D 模型创建骨架并分配蒙皮权重&#xff0c;以实现流畅的动画效果。由清华大学与 Tripo 联合开发的 UniRig 框架&#xff0c;为这一难题提供了全新的解决方案。 什…

字符串字典序最大后缀问题详解

字符串字典序最大后缀问题详解 一、问题定义与背景1.1 问题描述1.2 实际应用场景 二、暴力解法及其局限性2.1 暴力解法思路2.2 代码示例2.3 局限性分析 三、双指针算法&#xff1a;高效解决方案3.1 算法核心思想3.2 算法步骤3.3 代码实现3.4 与暴力解法对比 四、复杂度分析4.1 …

VScode打开后一直显示正在重新激活终端 问题的解决方法

一、问题 本人打开“.py”文件后&#xff0c;同时会出现以下两个问题。 1、VScode一直循环在”正在重新激活终端“ 2、日志显示intellicode报错&#xff1a; Sorry, something went wrong activating IntelliCode support for Python. Please check the “Python” and “VS I…

pe文件结构(TLS)

TLS 什么是TLS? TLS是 Thread Local Storage 的缩写&#xff0c;线程局部存储。主要是为了解决多线程中变量同步的问题 如果需要要一个线程内部的各个函数调用都能访问&#xff0c;但其它线程不能访问的变量&#xff08;被称为static memory local to a thread 线程局部静态变…

中型零售业数据库抉择:MySQL省成本,SQL SERVER?

针对中型零售企业&#xff08;20台固定POS数十台移动POS&#xff0c;含库存管理与结算业务&#xff09;的操作系统与数据库选型&#xff0c;需平衡性能、成本、扩展性及运维效率。结合行业实践与系统需求&#xff0c;建议如下&#xff1a; &#x1f5a5;️ ​​一、操作系统选型…

IDEA中的debug使用技巧

详细教学视频见b站链接&#xff1a;IDEA的debug调试 CSDN详细博客文章链接&#xff1a;debug文章学习 以下为个人学习记录总结&#xff1a; idea中的debug模式界面如下&#xff1a; 现在详细介绍图标作用&#xff1a; 图标一&#xff08;Show Execution Point&#xff09;&…

RockyLinux9.6搭建k8s集群

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

AI IDE 正式上线!通义灵码开箱即用

近期&#xff0c;通义灵码AI IDE正式上线&#xff0c;即日起用户可在通义灵码官网免费下载开箱即用。 作为AI原生的开发环境工具&#xff0c;通义灵码AI IDE深度适配了最新的千问3大模型&#xff0c;并全面集成通义灵码插件能力&#xff0c;具备编程智能体、行间建议预测、行间…

Ubuntu20.04基础配置安装——系统安装(一)

引言&#xff1a; 工作需要&#xff0c;Ubuntu的各类环境配置&#xff0c;从23年开始使用Ubuntu20.04之后&#xff0c;尽管能力在不断提升&#xff0c;但是依旧会遇到Ubuntu系统崩掉的情况&#xff0c;为了方便后续系统出现问题及时替换&#xff0c;减少从网上搜索资源进行基础…

Kafka入门-消费者

消费者 Kafka消费方式&#xff1a;采用pull&#xff08;拉&#xff09;的方式&#xff0c;消费者从broker中主动拉去数据。使用pull的好处就是消费者可以根据自身需求&#xff0c;进行拉取数据&#xff0c;但是坏处就是如果Kafka没有数据&#xff0c;那么消费者可能会陷入循环…

中电金信:从智能应用到全栈AI,大模型如何重构金融业务价值链?

导语 当前&#xff0c;AI大模型技术正加速重构金融行业的智能化图景。为助力金融机构精准把握这一变革机遇&#xff0c;中电金信与IDC联合发布《中国金融大模型发展白皮书》。《白皮书》在梳理了AI大模型整体发展现状的基础上&#xff0c;结合金融行业用户的需求调研深入分析了…

巴西医疗巨头尤迈Kafka数据泄露事件的全过程分析与AI安防策略分析

一、事件背景与主体信息 涉事主体:Unimed,全球最大医疗合作社,巴西医疗行业龙头企业,拥有约1500万客户。技术背景:泄露源于其未保护的Kafka实例(开源实时数据传输平台),用于客户与聊天机器人“Sara”及医生的实时通信。二、时间线梳理 时间节点关键事件描述2025年3月24…