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

部署前环境准备
首先需要完成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