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 环境配置解析

  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高效推理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hi20240217

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值