如何在Jetson Nano上部署并运行自定义训练的YOLOv8模型

来源:3D模型作者:灯下变量头衔:程序员
导读:本期聚焦于小伙伴创作的《如何在Jetson Nano上部署并运行自定义训练的YOLOv8模型》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在Jetson Nano上部署并运行自定义训练的YOLOv8模型》有用,将其分享出去将是对创作者最好的鼓励。

在Jetson Nano上部署自定义训练的YOLOv8模型,需要完成环境配置、模型转换、推理代码编写三个核心步骤,整个过程适配Jetson Nano的ARM架构和CUDA环境,确保模型能够高效运行。

如何在Jetson Nano上部署并运行自定义训练的YOLOv8模型

环境准备

首先需要在Jetson Nano上安装适配的系统和依赖,Jetson Nano官方推荐使用JetPack系统,该系统已经预装了CUDA、cuDNN等深度学习依赖,能够减少环境配置的工作量。

系统要求

建议使用JetPack 4.6及以上版本,该系统自带CUDA 10.2、cuDNN 8.2,能够满足YOLOv8的运行需求。如果还没有安装系统,可以通过官方提供的镜像烧录工具将系统写入SD卡,插入Jetson Nano后启动即可。

安装Python依赖

Jetson Nano默认自带Python 3.6或更高版本,需要安装YOLOv8运行所需的依赖包,执行以下命令:

# 更新软件源
sudo apt update
sudo apt upgrade -y
# 安装pip
sudo apt install python3-pip -y
# 安装ultralytics库,包含YOLOv8的所有功能
pip3 install ultralytics
# 安装opencv依赖,用于图像处理和结果显示
sudo apt install libopencv-dev python3-opencv -y

模型转换

自定义训练的YOLOv8模型默认是PyTorch格式的.pt文件,需要转换为适合Jetson Nano运行的格式,推荐使用ONNX格式,该格式兼容性好,推理速度较快。

导出ONNX模型

在训练模型的设备上执行以下代码,将.pt模型转换为ONNX格式:

from ultralytics import YOLO

# 加载自定义训练的YOLOv8模型,替换为你的模型路径
model = YOLO("yolov8n_custom.pt")
# 导出为ONNX格式,设置输入尺寸为640x640,适配Jetson Nano性能
model.export(format="onnx", imgsz=640)

导出完成后会生成yolov8n_custom.onnx文件,将该文件传输到Jetson Nano的指定目录下即可。

编写推理代码

在Jetson Nano上编写推理代码,加载ONNX模型对输入图像或视频进行目标检测,以下是完整的推理示例代码:

import cv2
import numpy as np
import onnxruntime

# 加载ONNX模型,使用CUDA推理加速
onnx_model_path = "yolov8n_custom.onnx"
session = onnxruntime.InferenceSession(
    onnx_model_path,
    providers=["CUDAExecutionProvider", "CPUExecutionProvider"]
)

# 获取模型输入信息
input_name = session.get_inputs()[0].name
input_shape = session.get_inputs()[0].shape
input_height, input_width = input_shape[2], input_shape[3]

def preprocess_image(image_path):
    # 读取图像并调整尺寸
    img = cv2.imread(image_path)
    original_img = img.copy()
    img = cv2.resize(img, (input_width, input_height))
    # 转换颜色空间,BGR转RGB
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    # 归一化并调整维度
    img = img.astype(np.float32) / 255.0
    img = np.transpose(img, (2, 0, 1))
    img = np.expand_dims(img, axis=0)
    return img, original_img

def postprocess_results(outputs, original_img, conf_threshold=0.25):
    # 处理模型输出,提取检测框和类别
    outputs = outputs[0]
    original_height, original_width = original_img.shape[:2]
    results = []
    for det in outputs:
        conf = det[4]
        if conf < conf_threshold:
            continue
        # 提取检测框坐标,转换到原始图像尺寸
        x1 = int(det[0] * original_width / input_width)
        y1 = int(det[1] * original_height / input_height)
        x2 = int(det[2] * original_width / input_width)
        y2 = int(det[3] * original_height / input_height)
        class_id = int(det[5])
        results.append((x1, y1, x2, y2, class_id, conf))
    return results

def draw_results(original_img, results, class_names):
    # 在图像上绘制检测框和类别信息
    for x1, y1, x2, y2, class_id, conf in results:
        cv2.rectangle(original_img, (x1, y1), (x2, y2), (0, 255, 0), 2)
        label = f"{class_names[class_id]}: {conf:.2f}"
        cv2.putText(original_img, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
    return original_img

# 自定义训练的类别名称,替换为你的类别列表
class_names = ["cat", "dog"]
# 输入图像路径,替换为你的测试图像路径
image_path = "test_image.jpg"
# 预处理图像
input_tensor, original_img = preprocess_image(image_path)
# 模型推理
outputs = session.run(None, {input_name: input_tensor})
# 后处理输出
results = postprocess_results(outputs, original_img)
# 绘制结果
result_img = draw_results(original_img, results, class_names)
# 保存结果图像
cv2.imwrite("result_image.jpg", result_img)
print("推理完成,结果已保存到result_image.jpg")

运行与优化

将推理代码保存为infer.py,在Jetson Nano终端执行以下命令运行:

python3 infer.py

如果需要进一步提升推理速度,可以调整输入尺寸,比如将输入尺寸从640x640调整为416x416,或者选择更轻量的YOLOv8n模型进行训练。如果推理时出现CUDA相关错误,可以检查JetPack的CUDA版本是否正确,或者将推理provider改为CPUExecutionProvider先验证代码逻辑。

常见问题解决

  • 模型加载失败:检查ONNX模型路径是否正确,文件是否完整,ONNX版本是否适配onnxruntime。
  • 推理速度慢:确认是否启用了CUDA加速,检查Jetson Nano的功耗模式是否设置为最大性能模式,可通过sudo nvpmodel -m 0命令开启。
  • 检测结果不准确:检查模型训练时的类别顺序是否和推理代码中的class_names一致,输入预处理步骤是否和训练时保持一致。

Jetson_NanoYOLOv8模型部署目标检测修改时间:2026-07-17 11:03:33

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。