如何在Jetson Nano上部署和运行YOLOv8模型

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

Jetson Nano是英伟达推出的面向边缘计算的嵌入式开发板,具备不错的算力表现,适合部署轻量级深度学习模型。YOLOv8作为当前主流的目标检测模型,在精度和速度上都有较好的平衡,将其部署到Jetson Nano上可以实现本地化的实时目标检测任务。

如何在Jetson Nano上部署和运行YOLOv8模型

部署前环境准备

首先需要完成Jetson Nano的基础系统配置,推荐使用官方提供的JetPack 4.6及以上版本系统,该系统已经预装了CUDA、cuDNN等基础依赖。之后需要安装Python3.8及以上版本,以及对应的pip包管理工具。

接下来安装YOLOv8运行所需的依赖库,执行以下命令:

# 安装ultralytics库,这是YOLOv8的官方依赖库
pip install ultralytics
# 安装OpenCV用于图像读取和显示
pip install opencv-python-headless

需要注意Jetson Nano的内存较小,安装依赖时建议关闭其他不必要的进程,避免内存不足导致安装失败。

YOLOv8模型导出

如果已经有训练好的YOLOv8模型文件(后缀为.pt),需要将其导出为适合Jetson Nano运行的格式,推荐使用ONNX格式,该格式在边缘设备上兼容性更好,推理速度也更有保障。

导出模型的代码如下:

from ultralytics import YOLO

# 加载训练好的YOLOv8模型
model = YOLO("yolov8n.pt")  # 这里替换为你的模型文件路径
# 导出为ONNX格式,设置输入尺寸为640*640,适配Jetson Nano算力
model.export(format="onnx", imgsz=640)

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

编写推理运行代码

完成模型导出后,就可以编写推理代码实现目标检测功能,以下是基于OpenCV和ONNX Runtime的推理示例:

import cv2
import numpy as np
import onnxruntime

# 加载ONNX模型,使用CUDA推理加速
ort_session = onnxruntime.InferenceSession(
    "yolov8n.onnx",  # 替换为你的ONNX模型路径
    providers=["CUDAExecutionProvider", "CPUExecutionProvider"]
)

# 定义类别名称,这里以COCO数据集的80类为例
CLASSES = [
    "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat",
    "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat",
    "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack",
    "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball",
    "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket",
    "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple",
    "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair",
    "couch", "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote",
    "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator", "book",
    "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush"
]

def preprocess(image):
    # 图像预处理:缩放、归一化、维度转换
    img = cv2.resize(image, (640, 640))
    img = img.transpose(2, 0, 1)  # HWC转CHW
    img = np.expand_dims(img, axis=0).astype(np.float32) / 255.0  # 归一化
    return img

def postprocess(output, image_shape, conf_thres=0.25, iou_thres=0.45):
    # 后处理:解析输出、过滤低置信度框、非极大值抑制
    predictions = output[0]
    boxes = []
    scores = []
    class_ids = []
    img_h, img_w = image_shape
    # 遍历所有预测结果
    for pred in predictions:
        conf = pred[4]
        if conf < conf_thres:
            continue
        class_score = pred[5:]
        class_id = np.argmax(class_score)
        score = class_score[class_id] * conf
        if score < conf_thres:
            continue
        # 转换边界框坐标到原图尺寸
        x1 = (pred[0] - pred[2] / 2) * img_w / 640
        y1 = (pred[1] - pred[3] / 2) * img_h / 640
        x2 = (pred[0] + pred[2] / 2) * img_w / 640
        y2 = (pred[1] + pred[3] / 2) * img_h / 640
        boxes.append([x1, y1, x2, y2])
        scores.append(score)
        class_ids.append(class_id)
    # 非极大值抑制
    indices = cv2.dnn.NMSBoxes(boxes, scores, conf_thres, iou_thres)
    result = []
    for i in indices:
        result.append({
            "box": boxes[i],
            "score": scores[i],
            "class_id": class_ids[i],
            "class_name": CLASSES[class_ids[i]]
        })
    return result

# 读取测试图像
image = cv2.imread("test.jpg")  # 替换为你的测试图像路径
input_tensor = preprocess(image)
# 模型推理
input_name = ort_session.get_inputs()[0].name
output_name = ort_session.get_outputs()[0].name
output = ort_session.run([output_name], {input_name: input_tensor})
# 后处理得到检测结果
detections = postprocess(output, image.shape[:2])
# 绘制检测结果
for det in detections:
    box = det["box"]
    cv2.rectangle(image, (int(box[0]), int(box[1])), (int(box[2]), int(box[3])), (0, 255, 0), 2)
    label = f"{det['class_name']} {det['score']:.2f}"
    cv2.putText(image, label, (int(box[0]), int(box[1]) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 保存结果图像
cv2.imwrite("result.jpg", image)
print("推理完成,结果已保存为result.jpg")

运行优化建议

Jetson Nano的算力有限,为了获得更好的运行速度,可以参考以下优化建议:

  • 优先选择YOLOv8的nano版本(yolov8n)或者更轻量的自定义模型,减少计算量
  • 推理时可以适当降低输入图像的尺寸,比如设置为416*416,牺牲少量精度换取速度提升
  • 关闭Jetson Nano上不必要的后台服务,释放内存和CPU资源
  • 如果不需要实时显示检测结果,可以去掉OpenCV的窗口显示逻辑,减少资源占用

常见问题排查

部署过程中可能会遇到一些问题,以下是常见问题的解决方法:

问题现象可能原因解决方法
模型加载失败ONNX版本不兼容或者模型文件损坏重新导出ONNX模型,确保导出过程没有报错
推理速度过慢没有使用CUDA加速或者模型过大检查ONNX Runtime是否启用了CUDAExecutionProvider,更换更轻量的模型
内存溢出同时运行的进程过多或者输入尺寸过大关闭其他进程,降低模型输入尺寸

YOLOv8Jetson_Nano模型部署目标检测边缘计算修改时间:2026-07-07 22:03:35

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