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

环境准备
首先需要在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