将YOLO目标检测代码移植到Jetson Nano或树莓派上,主要分为以下几个步骤:

  1. 硬件与软件准备:确保你有合适的硬件设备(如Jetson Nano或树莓派),并安装相应的操作系统(如JetPack for Jetson Nano或Raspberry Pi OS for 树莓派)。
  2. 环境搭建:在设备上安装Python、pip等基础工具,创建虚拟环境(可选),并安装YOLO所需的依赖库,如OpenCV、NumPy、PyTorch或TensorFlow。
  3. 下载YOLO模型和权重:从YOLO的官方GitHub仓库克隆代码,并下载预训练的权重文件。
  4. 运行检测脚本:使用YOLO提供的检测脚本,指定权重文件、图像尺寸、置信度阈值和数据源(如摄像头或图像文件),运行目标检测。
  5. 优化性能:根据设备类型,启用GPU加速(如Jetson Nano的CUDA或树莓派的OpenCV GPU加速),并选择合适的轻量级YOLO模型以提高性能。

通过这些步骤,你可以在Jetson Nano或树莓派上成功部署YOLO目标检测系统,实现实时的目标识别和分析。

  边缘计算可以让这些小型、低功耗的设备具备强大的目标检测能力,适用于各种边缘计算场景。以下是一个详细的步骤指南,帮助你完成移植过程。

一、准备工作

软件代码准备 首先以行人监测为例子说明

为了实现实时获取视频流并使用 YOLO 目标检测算法监测行人,我们可以使用 Python 和 OpenCV 库。以下是一个完整的示例代码,展示了如何从摄像头获取实时视频流,并使用 YOLOv5 模型检测行人。

环境准备

  1. 安装依赖库

     

    bash

    pip install opencv-python numpy torch torchvision
  2. 克隆 YOLOv5 仓库并安装依赖

     

    bash

    git clone https://github.com/ultralytics/yolov5.git
    cd yolov5
    pip install -r requirements.txt
  3. 下载预训练权重

     

    bash

    wget https://github.com/ultralytics/yolov5/releases/download/v1.0/yolov5s.pt

代码实现

 

python

import cv2
import torch
from yolov5.models.experimental import attempt_load
from yolov5.utils.datasets import letterbox
from yolov5.utils.general import non_max_suppression, scale_coords
from yolov5.utils.torch_utils import select_device

# 加载 YOLOv5 模型
weights = 'yolov5s.pt'  # 模型权重文件
device = select_device('')  # 选择设备,'' 表示自动选择
model = attempt_load(weights, map_location=device)  # 加载模型
stride = int(model.stride.max())  # 模型的步长

# 设置摄像头
cap = cv2.VideoCapture(0)  # 0 表示默认摄像头

# 循环读取视频帧
while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 图像预处理
    img = letterbox(frame, new_shape=640, stride=stride)[0]
    img = img.transpose((2, 0, 1))[::-1]  # HWC to CHW, BGR to RGB
    img = np.ascontiguousarray(img)
    img = torch.from_numpy(img).to(device)
    img = img.float()  # uint8 to fp16/32
    img /= 255.0  # 图像归一化
    if img.ndimension() == 3:
        img = img.unsqueeze(0)

    # 模型推理
    pred = model(img, augment=False, visualize=False)[0]

    # 应用 NMS
    pred = non_max_suppression(pred, 0.25, 0.45, classes=None, agnostic=False)

    # 处理检测结果
    for i, det in enumerate(pred):  # 遍历每个检测结果
        s = ''
        s += '%gx%g ' % img.shape[2:]  # 打印图像尺寸
        gn = torch.tensor(frame.shape)[[1, 0, 1, 0]]  # 归一化增益

        if len(det):
            # 将坐标从 [0, 1] 转换为像素坐标
            det[:, :4] = scale_coords(img.shape[2:], det[:, :4], frame.shape).round()

            # 遍历每个检测到的目标
            for *xyxy, conf, cls in reversed(det):
                if int(cls) == 0:  # 0 表示行人
                    x1, y1, x2, y2 = map(int, xyxy)  # 坐标转换为整数
                    label = f'Pedestrian {conf:.2f}'
                    cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
                    cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

    # 显示结果
    cv2.imshow('Pedestrian Detection', frame)

    # 按 'q' 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头资源
cap.release()
cv2.destroyAllWindows()

代码说明

  1. 加载模型:使用 attempt_load 函数加载预训练的 YOLOv5 模型。
  2. 设置摄像头:使用 cv2.VideoCapture(0) 获取默认摄像头的视频流。
  3. 图像预处理:使用 letterbox 函数将图像调整为模型输入的尺寸,并进行归一化处理。
  4. 模型推理:将预处理后的图像输入模型进行推理,获取检测结果。
  5. NMS 处理:使用 non_max_suppression 函数进行非极大值抑制,去除重叠的检测框。
  6. 处理检测结果:遍历检测结果,筛选出类别为行人的检测框,并在图像上绘制矩形框和标签。
  7. 显示结果:使用 cv2.imshow 显示处理后的图像。
  8. 退出条件:按 'q' 键退出循环,释放摄像头资源并关闭窗口

(一)硬件准备

  1. Jetson Nano:
    • NVIDIA Jetson Nano 开发者套件
    • 电源适配器
    • 微型 HDMI 到 HDMI 转换器(如果需要连接显示器)
    • 键盘和鼠标(如果需要连接显示器)
    • 网络连接(有线或无线)
  2. 树莓派:
    • 树莓派 4B(推荐)
    • 电源适配器
    • 微型 HDMI 到 HDMI 转换器(如果需要连接显示器)
    • 键盘和鼠标(如果需要连接显示器)
    • 网络连接(有线或无线)

(二)软件准备

  1. 操作系统:
    • Jetson Nano:推荐使用 JetPack 安装的 Ubuntu 18.04 或 20.04
    • 树莓派:推荐使用 Raspberry Pi OS(基于 Debian 的操作系统)
  2. 开发工具:
    • Python 3
    • pip(Python 包管理器)
    • Git(版本控制工具)
  3. 依赖库:
    • OpenCV
    • NumPy
    • PyTorch 或 TensorFlow(根据 YOLO 版本选择)
    • CUDA(Jetson Nano 需要)

二、环境搭建

(一)Jetson Nano

  1. 安装 JetPack

    • 下载并安装 JetPack:NVIDIA JetPack
    • 通过 JetPack 安装 Ubuntu 18.04 或 20.04 操作系统
    • 安装 CUDA 和 cuDNN
  2. 安装 Python 和依赖库

     

    bash

    sudo apt update
    sudo apt install python3 python3-pip python3-virtualenv
  3. 创建虚拟环境(可选)

     

    bash

    python3 -m virtualenv venv
    source venv/bin/activate
  4. 安装 OpenCV 和 NumPy

     

    bash

    pip install opencv-python numpy
  5. 安装 PyTorch(如果使用 PyTorch 版本的 YOLO)

     

    bash

    pip install torch torchvision

(二)树莓派

  1. 安装 Raspberry Pi OS

    • 下载并安装 Raspberry Pi OS:Raspberry Pi OS
    • 通过 Raspberry Pi Imager 工具将 OS 写入 SD 卡
  2. 安装 Python 和依赖库

     

    bash

    sudo apt update
    sudo apt install python3 python3-pip python3-virtualenv
  3. 创建虚拟环境(可选)

     

    bash

    python3 -m virtualenv venv
    source venv/bin/activate
  4. 安装 OpenCV 和 NumPy

     

    bash

    pip install opencv-python numpy
  5. 安装 TensorFlow(如果使用 TensorFlow 版本的 YOLO)

     

    bash

    pip install tensorflow

三、移植 YOLO 目标检测代码

(一)下载 YOLO 模型和权重

  1. 下载 YOLO 模型文件

  2. 克隆仓库

     

    bash

    git clone https://github.com/ultralytics/yolov5.git
    cd yolov5
  3. 下载预训练权重

     

    bash

    wget https://github.com/ultralytics/yolov5/releases/download/v1.0/yolov5s.pt

(二)运行 YOLO 目标检测

  1. 安装 YOLO 依赖库

     

    bash

    pip install -r requirements.txt
  2. 运行检测脚本

    • 使用摄像头进行实时检测:
       

      bash

      python detect.py --weights yolov5s.pt --img 640 --conf 0.25 --source 0
    • 使用图像文件进行检测:
       

      bash

      python detect.py --weights yolov5s.pt --img 640 --conf 0.25 --source path/to/image.jpg

(三)优化性能

  1. 使用 Jetson Nano 的 CUDA 加速

    • 确保 CUDA 环境配置正确,运行以下命令检查 CUDA 版本:
       

      bash

      nvcc --version
    • 在运行检测脚本时,确保使用 CUDA 加速:
       

      bash

      python detect.py --weights yolov5s.pt --img 640 --conf 0.25 --source 0 --device 0
  2. 使用树莓派的 GPU 加速

    • 安装 OpenCV 的 GPU 加速版本:
       

      bash

      pip install opencv-python-headless
    • 在运行检测脚本时,确保使用 GPU 加速:
       

      bash

      python detect.py --weights yolov5s.pt --img 640 --conf 0.25 --source 0 --device 0

四、代码示例

(一)Jetson Nano 上的 YOLOv5 检测

  1. 安装依赖库

     

    bash

    sudo apt update
    sudo apt install python3 python3-pip python3-virtualenv
    python3 -m virtualenv venv
    source venv/bin/activate
    pip install opencv-python numpy torch torchvision
  2. 克隆 YOLOv5 仓库

     

    bash

    git clone https://github.com/ultralytics/yolov5.git
    cd yolov5
    pip install -r requirements.txt
  3. 下载预训练权重

     

    bash

    wget https://github.com/ultralytics/yolov5/releases/download/v1.0/yolov5s.pt
  4. 运行检测脚本

     

    bash

    python detect.py --weights yolov5s.pt --img 640 --conf 0.25 --source 0 --device 0

(二)树莓派上的 YOLOv5 检测

  1. 安装依赖库

     

    bash

    sudo apt update
    sudo apt install python3 python3-pip python3-virtualenv
    python3 -m virtualenv venv
    source venv/bin/activate
    pip install opencv-python numpy tensorflow
  2. 克隆 YOLOv5 仓库

     

    bash

    git clone https://github.com/ultralytics/yolov5.git
    cd yolov5
    pip install -r requirements.txt
  3. 下载预训练权重

     

    bash

    wget https://github.com/ultralytics/yolov5/releases/download/v1.0/yolov5s.pt
  4. 运行检测脚本

     

    bash

    python detect.py --weights yolov5s.pt --img 640 --conf 0.25 --source 0 --device 0

五、常见问题及解决方案

(一)性能问题

  • Jetson Nano:确保 CUDA 环境配置正确,使用 --device 0 参数启用 GPU 加速。
  • 树莓派:安装 OpenCV 的 GPU 加速版本,使用 --device 0 参数启用 GPU 加速。

(二)内存不足问题

  • Jetson Nano:减少模型大小,使用轻量级模型(如 YOLOv5s 或 YOLOv8n)。
  • 树莓派:减少模型大小,使用轻量级模型(如 YOLOv5s 或 YOLOv8n),并确保系统有足够的内存。

(三)兼容性问题

  • Jetson Nano:确保所有依赖库与 CUDA 版本兼容。
  • 树莓派:确保所有依赖库与 Raspberry Pi OS 兼容。

将 YOLO 目标检测代码移植到服务器和边缘计算终端上

将 YOLO 目标检测代码移植到服务器和边缘计算终端上,可以分为以下几个主要步骤:

一、环境搭建
  1. 服务器环境搭建

    • 选择服务器:根据需求选择合适的云服务器或物理服务器。例如,可以使用 AutoDL 服务器。
    • 连接服务器:使用 SSH 连接服务器,推荐使用 PyCharm 专业版进行连接。
    • 安装依赖库:在服务器上安装 Python、pip 和其他必要的依赖库。可以使用以下命令:
       

      bash

      sudo apt update
      sudo apt install python3 python3-pip
      pip install -r requirements.txt
  2. 边缘计算终端环境搭建

    • 选择边缘计算终端:例如,使用 Jetson Nano 或树莓派。
    • 安装操作系统:为 Jetson Nano 安装 JetPack,为树莓派安装 Raspberry Pi OS。
    • 安装依赖库:安装 Python、pip 和其他必要的依赖库。可以使用以下命令:
       

      bash

      sudo apt update
      sudo apt install python3 python3-pip
      pip install opencv-python numpy torch torchvision
二、模型转换
  1. 将 YOLO 模型转换为 ONNX 格式

    • 下载 YOLO 模型:从官方 GitHub 仓库下载 YOLO 模型和权重文件。
    • 转换模型:使用 YOLO 提供的 export.py 脚本将模型转换为 ONNX 格式。例如,对于 YOLOv5:
       

      bash

      python export.py --weights yolov5s.pt --include onnx
  2. 将 ONNX 模型转换为边缘计算终端支持的格式

    • 使用 RKNN-Toolkit2:将 ONNX 模型转换为 RKNN 格式,适用于 RK3588 边缘盒子。
       

      bash

      ONNX_MODEL = 'yolov5s_relu.onnx'
      RKNN_MODEL = 'yolov5s_relu.rknn'
      IMG_PATH = './bus.jpg'
      DATASET = './dataset.txt'
      QUANTIZE_ON = True
      
      rknn = RKNN(verbose=True)
      print('--> Config model')
      rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform='rk3588')
      print('done')
      print('--> Loading model')
      ret = rknn.load_onnx(model=ONNX_MODEL)
      if ret != 0:
          print('Load model failed!')
          exit(ret)
      print('done')
      print('--> Building model')
      ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET)
      if ret != 0:
          print('Build model failed!')
          exit(ret)
      print('done')
      print('--> Export rknn model')
      ret = rknn.export_rknn(RKNN_MODEL)
      if ret != 0:
          print('Export rknn model failed!')
          exit(ret)
      print('done')
      rknn.release()
三、模型优化
  1. 模型量化:根据需要进行模型量化,以提高推理速度和减少模型大小。

     

    bash

    rknn = RKNN()
    if not os.path.exists(ONNX_MODEL):
        print('model not exist')
        exit(-1)
    print('--> Config model')
    rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], optimization_level=2, quantized_algorithm='mmse', target_platform='rk3588',)
    print('done')
    print('--> Loading model')
    ret = rknn.load_onnx(model=ONNX_MODEL)
    if ret != 0:
        print('Load model failed!')
        exit(ret)
    print('done')
    ret = rknn.hybrid_quantization_step1(dataset=DATASET)
    rknn.release()
  2. 精度分析:使用 accuracy_analysis 方法分析量化后的模型精度。

     

    bash

    print('--> Accuracy analysis')
    ret = rknn.accuracy_analysis(inputs=['./dog_bike_car_300x300.jpg'], output_dir=None)
    if ret != 0:
        print('Accuracy analysis failed!')
        exit(ret)
    print('done')
四、模型部署
  1. 服务器部署

    • 训练模型:在服务器上使用 YOLO 提供的 train.py 脚本进行模型训练。
       

      bash

      from ultralytics import YOLO
      import warnings
      warnings.filterwarnings("ignore")
      # 训练模型
      model = YOLO("yolov5s.pt")  # 模型文件
      model.train(data="data.yaml", epochs=200, batch=64, device=0)
    • 模型预测:使用训练好的模型进行预测。
       

      bash

      from ultralytics import YOLO
      import warnings
      warnings.filterwarnings("ignore")
      # 预测
      model = YOLO("runs/detect/train/weights/best.pt")  # 训练好的模型
      image_path = r'/path/to/image.jpg'
      model.predict(image_path, device=0, save=True)
  2. 边缘计算终端部署

    • 加载 RKNN 模型:在边缘计算终端上加载转换后的 RKNN 模型。
       

      bash

      from rknnlite.api import RKNNLite
      
      rknn_lite = RKNNLite()
      ret = rknn_lite.load_rknn('yolov5s_relu.rknn')
      if ret != 0:
          print('Load RKNN model failed')
          exit(ret)
    • 实时推理:使用摄像头获取实时视频流,并进行目标检测。
       

      python

      import cv2
      import numpy as np
      
      cap = cv2.VideoCapture(0)
      while True:
          ret, frame = cap.read()
          if not ret:
              break
      
          # 图像预处理
          img = cv2.resize(frame, (640, 640))
          img = img.astype(np.float32)
          img /= 255.0
          img = img.transpose((2, 0, 1))
          img = np.expand_dims(img, axis=0)
      
          # 模型推理
          outputs = rknn_lite.inference(inputs=[img])
      
          # 处理检测结果
          # ... (处理检测结果的代码)
      
          # 显示结果
          cv2.imshow('Pedestrian Detection', frame)
          if cv2.waitKey(1) & 0xFF == ord('q'):
              break
      
      cap.release()
      cv2.destroyAllWindows()

六、结语

通过以上步骤,你可以将 YOLO 目标检测代码成功移植到 Jetson Nano 或树莓派上,实现边缘计算中的实时目标检测。这些小型设备在资源受限的情况下,依然能够提供强大的

YOLO模型在边缘计算终端上的推理速度优化

在边缘计算终端上部署YOLO模型时,优化推理速度是关键。以下是一些有效的优化方法:

1. 模型量化

模型量化是将模型的权重和激活从浮点数转换为低精度格式(如INT8或FP16),以减少模型大小并提高推理速度。具体步骤如下:

  1. 正常训练模型:首先在不考虑量化的情况下训练YOLO模型。
  2. 应用训练后量化(PTQ):训练完成后,使用PyTorch的torch.quantization模块将模型转换为量化版本。
  3. 评估量化后的模型:评估量化后的模型性能,测量模型体积和推理时间的减少。

例如,使用PyTorch进行模型量化:

 

python

import torch
import torch.quantization

# 假设模型名称为model,准备进行量化
model.qconfig = torch.quantization.QConfig(
    activation=torch.quantization.default_activation_qconfig,
    weight=torch.quantization.default_weight_qconfig
)
torch.quantization.prepare(model, inplace=True)
torch.quantization.convert(model, inplace=True)

2. 使用高效的推理引擎

使用高效的推理引擎如TensorRT可以显著提高推理速度。TensorRT通过优化模型结构和使用GPU加速来提高性能。具体步骤如下:

  1. 将模型转换为ONNX格式:
     

    python

    import torch
    import torchvision.transforms as transforms
    
    # 假设模型名为yolov8_model,已经完成了训练
    model = yolov8_model.eval()
    dummy_input = torch.randn(1, 3, 640, 640)  # 使用一个典型的输入尺寸进行追踪
    torch.onnx.export(model, dummy_input, "yolov8.onnx", opset_version=11)
  2. 将ONNX模型转换为TensorRT引擎:
     

    python

    import tensorrt as trt
    
    TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
    trt_runtime = trt.Runtime(TRT_LOGGER)
    
    # 加载ONNX模型
    with open("yolov8.onnx", "rb") as model:
        onnx_data = model.read()
    
    # 创建TensorRT引擎
    engine = trt_runtime.deserialize_cuda_engine(onnx_data)

3. 选择合适的模型架构

选择轻量级的模型架构可以显著减少计算量和模型大小。例如,YOLOv5s和YOLOv8n等轻量级模型在边缘设备上表现出色。这些模型在保持较高精度的同时,显著减少了参数数量和计算复杂度。

4. 使用数据增强和损失函数优化

数据增强和损失函数的优化可以提高模型的泛化能力和检测精度,同时减少推理时间。例如,EdgeYOLO提出了一种增强的数据增强方法和混合随机损失函数,显著提高了小目标的检测精度。

5. 剪枝和知识蒸馏

剪枝技术可以通过去除模型中不必要的参数来减少模型的存储和计算复杂度。知识蒸馏则通过训练一个较小的模型来模仿较大模型的行为,进一步提高模型的效率。

6. 优化内存使用

优化内存使用可以减少数据传输开销,提高推理速度。例如,通过优化缓存中参数的空间和时间局部性,可以减少内存访问次数,进一步改善性能。

7. 使用混合精度训练

混合精度训练结合了FP32和FP16的精度,可以在保持精度的同时显著提高训练和推理速度。使用PyTorch的torch.cuda.amp模块可以轻松实现混合精度训练。

总结

通过模型量化、使用高效的推理引擎、选择合适的模型架构、数据增强和损失函数优化、剪枝和知识蒸馏、优化内存使用以及混合精度训练等方法,可以显著提高YOLO模型在边缘计算终端上的推理速度。这些优化方法不仅提高了模型的运行效率,还保持了较高的检测精度,适用于各种实时应用。

更多推荐