解锁高性能,YOLOv8 部署至 Jetson Orin Nano 开发板的全攻略

介绍

Jetson Orin Nano开发板介绍

Jetson Orin Nano 是 NVIDIA 推出的新一代入门级开发套件,专为边缘 AI 应用设计。相比上一代 Jetson Nano,Orin Nano 提供了高达 80 倍的性能提升。

  • 技术规格

    Jetson Orin Nano 搭载了 8GB 内存的 Orin Nano 模组,另有 4GB 版本单独出售。Orin SoC 的 CPU 基于 Cortex-A78AE 架构,具有 6 个核心,最大频率 1.5 GHz。GPU 方面为 Ampere 架构的 GA10B,搭载了 1024 个 CUDA 核心和 32 个 Tensor 核心,最大频率为 625MHz。Orin Nano 的单精度浮点性能为 1.28 TFLOPs,深度学习算力高达 20 TOPs 的 INT8 稠密算力。

  • 硬件接口

    Orin Nano 开发套件的模组和载板与前代尺寸相同,但有一些改进。新载板的摄像头接口换成了 15-pin 的连接器,Micro USB 接口换成了 Type C,显示输出取消了 HDMI,只保留 DisplayPort 1.2 接口。Orin Nano 有 7 条 PCIe Gen 3 通道,载板底部增加了一个 M.2 Key M 接口。

  • AI 性能测试

    NVIDIA 提供了一套测试工具用来比较不同 Jetson 设备上的 AI 推理性能。测试结果显示,Orin Nano 在所有模型上都比 Jetson Nano 有数十倍提升,部分模型上甚至比 Xavier NX 都有明显优势。

Yolo V8介绍

YOLO V8介绍 YOLOv8 于2023年1月10日由Ultralytics发布,在准确性和速度方面实现了顶尖性能。基于之前的YOLO版本,YOLOv8带来了新功能和优化,成为各类任务的理想选择。相关代码仓库和文档网站如下:

YOLOv8的主要特点

  • 先进的主干与颈部架构: YOLOv8采用了最新设计的主干与颈部架构,提升了特征提取能力及目标检测效果。
  • 无锚点分割头: YOLOv8使用了独特的无锚点分割头设计,相比传统的基于锚点的方法,能够提供更高的检测精度和效率。
  • 优化的精度与速度平衡: YOLOv8专注于在保持高精度的同时实现快速检测,适用于需要实时处理的各种应用场景。
  • 多种预训练模型: 提供一系列预训练模型,以适应不同的任务需求和性能指标,方便用户根据具体应用选择最合适的模型。

支持的任务和模式 YOLOv8系列为计算机视觉中的不同任务提供了多样化的模型支持,包括但不限于物体检测、实例分割、姿态/关键点检测、定向物体检测以及分类等复杂任务。 每个YOLOv8变体都针对其特定任务进行了优化,确保高性能和高准确性。此外,这些模型还支持多种操作模式,如推理、验证、训练和输出,便于在项目开发的不同阶段灵活运用。

环境安装

由于这块开发板目前仅供个人使用,因此不打算安装Conda或Mini Conda等Python环境管理工具。当然,如果有需要的话,大家可以根据自己的情况选择安装。😎

根据作者在开源仓库中提供的软件库版本要求,我们只需运行pip install -r requirements.txt命令即可完成环境的配置。

此外,官方仓库也提供了如何安装YOLO的指南。不过,小编想对对源码进行一些修改,所以这部分内容对于环境安装来说并不是必须的。

Jetson orin nano开发板启动界面

测试

图像测试

图像测试目的是检测yolo环境安装是否成功。在此我们选择训练好的yolov8n模型,任务选择检测任务。

python 复制代码
from ultralytics import YOLO
yolo = YOLO("./yolov8n.pt", task="detect")
result = yolo(source="./ultralytics/assets/bus.jpg", save=True)

语句result = yolo(source="./ultralytics/assets/bus.jpg", save=True)将得到检测结果,其中将会包含:检测到的每个目标的边界框、类别标签和置信度。

结果图片如下:

实时视频测试

在实时视频测试中,我们将会使用一个摄像头实时捕获当前环境的物体并将其输入到yolo中作检测处理。

接下来我们将实现实时视频测试目标,下述是我们撰写代码的主要逻辑与步骤:

  1. 日志设置:函数一开始创建了一个日志记录器logger,设置了两个处理器,一个是控制台输出(INFO级别),另一个是文件记录(DEBUG级别)。格式上,控制台输出不包括时间,而文件日志包含详细的时间戳。这有助于调试时查看更详细的信息。

  2. 摄像头初始化:使用cv2.VideoCapture(0)打开默认的USB摄像头。如果摄像头无法打开,记录错误信息并返回。成功的话,会记录摄像头的信息,包括分辨率,这里通过cap.get获取了宽度和高度。

  3. 加载YOLO模型:用YOLO类加载预训练的yolov8n.pt模型,任务设为检测。这可能是一个YOLOv8的nano版本模型,用于目标检测。

  4. 帧率计算准备:初始化了fps_start_time和fps_counter,用来计算每秒处理的帧数。

  5. 主循环:进入一个无限循环,不断读取摄像头帧。如果读取失败,记录错误并退出循环。然后,使用YOLO模型对当前帧进行检测,结果存储在results中。这里取results[0]可能是因为每帧只处理一个结果。

  6. 处理检测结果:从结果中提取boxes、confidences和classes。然后筛选出置信度大于0.8的检测框,并获取对应的类别和置信度。如果有符合条件的检测结果,记录到日志中,包括类别名称、数量和置信度。

  7. 帧率计算:每隔一秒计算当前帧率,并记录到日志里。这里通过计算时间差和帧数来得出FPS。

  8. 退出条件:如果用户按下'q'键,退出循环,释放摄像头资源,并关闭所有窗口。

python 复制代码
from ultralytics import YOLO
import cv2
import time
import logging
from logging.handlers import RotatingFileHandler

def test_usb_camera():
    # 创建日志记录器
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    # 创建控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)
    console_formatter = logging.Formatter("%(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
    console_handler.setFormatter(console_formatter)
    logger.addHandler(console_handler)

    # 创建文件处理器
    file_handler = logging.FileHandler("logs/yolo.log")
    file_handler.setLevel(logging.DEBUG)
    file_formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
    file_handler.setFormatter(file_formatter)
    logger.addHandler(file_handler)
    
    
    # 初始化摄像头,0 表示默认的摄像头(通常是第一个 USB 摄像头)
    cap = cv2.VideoCapture(0)

    # 检查摄像头是否成功打开
    if not cap.isOpened():
        logger.info("无法打开摄像头,请检查摄像头是否连接正确或是否有权限访问。")
        return
    logger.info("摄像头已成功打开!按 'q' 键退出。")

    # 获取摄像头的宽度和高度
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    logger.info(f"摄像头分辨率: {width}x{height}")
    
    yolo_model = YOLO("save_model/yolov8n.pt", task="detect")

    # 计算帧率
    fps_start_time = time.time()
    fps_counter = 0

    while True:
        # 读取一帧图像
        ret, frame = cap.read()

        if not ret:
            logger.info("无法读取摄像头帧。")
            break

        results = yolo_model(frame, verbose=False)
        result = results[0]
        boxes = result.boxes.to(yolo_model.device)  # 将结果移动到同一设备
        confidences = boxes.conf.cpu().numpy()
        classes = boxes.cls.cpu().numpy().astype(int)
        
        # 筛选
        high_conf_indices = confidences > 0.8
        filtered_boxes = boxes.xyxy[high_conf_indices].cpu().numpy()
        filtered_classes = classes[high_conf_indices]
        filtered_confidences = confidences[high_conf_indices]
        if len(filtered_boxes) > 0:
            class_names = [yolo_model.names[int(cls)] for cls in filtered_classes]  # 类名列表
            alarm_data = {
                        "labels": class_names,
                        "counts": len(filtered_boxes),
                        "confidences": [round(float(x), 2) for x in filtered_confidences.tolist()],
            }       
            logger.info(f'{alarm_data}')
        
        
        # 计算帧率
        fps_counter += 1
        if time.time() - fps_start_time >= 1:
            fps = fps_counter / (time.time() - fps_start_time)
            logger.info(f"当前帧率: {fps:.2f} FPS")
            fps_counter = 0
            fps_start_time = time.time()

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

    # 释放资源并关闭窗口
    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    test_usb_camera()

检测的结果日志如下:

相关推荐
黑心萝卜三条杠几秒前
【CVPR2025】自适应特征知识蒸馏助力实时无人机跟踪,鲁棒性显著提升
人工智能
Java中文社群2 分钟前
被LangChain4j坑惨了!
java·人工智能·后端
学算法的程霖1 小时前
机器学习核心算法全解析:从基础到进阶的 18 大算法模型
人工智能·python·深度学习·算法·目标检测·机器学习·计算机视觉
网安加社区1 小时前
网安加·百家讲坛 | 刘志诚:AI安全风险与未来展望
人工智能·安全
我感觉。1 小时前
【深度学习—李宏毅教程笔记】各式各样的 Attention
人工智能·深度学习·attention·self-attention
骑着小黑马1 小时前
前端程序员自己的知识库,使用NodeJS+LLM搭建一个属于自己的知识库
前端·人工智能
TMT星球1 小时前
快手本地生活2024年GMV同增200%,“新线城市+AI”将成增长引擎
大数据·人工智能·生活
CV-杨帆1 小时前
论文阅读:2023 arxiv A Survey of Reinforcement Learning from Human Feedback
论文阅读·人工智能
CH3_CH2_CHO1 小时前
DAY08:【pytorch】模型容器
人工智能·pytorch·python
Tiger Z1 小时前
R 语言科研绘图 --- 饼状图-汇总
开发语言·人工智能·程序人生·r语言·贴图