Jetson Nano边缘AI开发实战:从环境配置到YOLOv5 TensorRT部署
1. 从“B”字头说起Jetson Nano Developer Kit Package B的定位与价值如果你在2024年还在关注Jetson Nano尤其是那个带着“Package B”后缀的开发者套件那你大概率不是一时兴起的小白。这个“B”字头在NVIDIA的产品序列里往往意味着一个更成熟、更完整、也更具性价比的版本。Package B的出现通常是在初代产品Package A经过市场验证和用户反馈后进行的一次精准优化。对于Jetson Nano Developer Kit而言Package B不仅仅是多了一个电源适配器那么简单它代表着一个生态位的确立一个面向边缘AI教育、原型开发和轻量级部署的“黄金标准”平台。在Orin Nano甚至更强大的AGX Orin系列已经上市的今天Nano B套件依然热度不减核心原因在于它精准地卡在了“足够用”和“买得起”的甜蜜点上。无论是高校实验室里排成一排的教学设备还是创客工作台上闪烁的指示灯亦或是小型智能设备的前期验证平台Jetson Nano B套件以其完整的开箱即用体验和庞大的社区支持成为了无数人进入边缘AI世界的第一块敲门砖。当我们谈论在Jetson Nano上跑YOLOv5、配置YOLO11环境或者纠结于编译输出目录时本质上都是在挖掘这块小小板卡在既定功耗和算力约束下的极限性能。Package B套件提供的稳定硬件基础包括那个至关重要的5V-4A电源是这一切折腾得以顺利进行的前提。它剥离了早期用户需要自备电源、担心供电不足的烦恼让开发者能更专注于算法和软件本身。所以理解Package B就是理解一个已经解决了基础硬件兼容性问题的、纯粹的AI开发环境。接下来的所有工作无论是系统烧录、环境配置还是模型部署都是在这个坚实底座上进行的构建。对于新手它降低了入门门槛对于老手它提供了一个稳定可靠的基准测试平台。这就是为什么在Orin Nano性能更强的背景下关于Nano的搜索和讨论依然活跃——它的生态成熟度、资料丰富度和成本可控性在特定场景下具有不可替代的价值。2. 开箱与上电Package B套件详解与初始避坑指南拿到Jetson Nano Developer Kit Package B你会发现它的包装内容与早期版本或散装主板有明显区别。核心部件包括Jetson Nano模组已焊接在载板上、带有散热风扇的金属散热器、一个5V/4A的DC电源适配器、一根Micro-USB转USB-A的数据线用于恢复模式以及一本快速入门指南。这里有几个关键点需要立即明确它们直接决定了你后续开发的顺利程度。首先是供电问题这是Package B解决得最彻底的一点。板卡上有一个DC电源接口桶形接口必须使用套件自带的5V/4A适配器供电。绝对不要尝试使用Micro-USB接口进行供电尽管板上保留了这个接口但其供电能力通常5V/2A远不足以支撑Nano在高负载下稳定运行极易导致系统崩溃、SD卡损坏或无法启动。我见过太多人因为偷懒使用手机充电器供电结果在编译OpenCV或运行YOLO推理时莫名其妙死机排查半天才发现是供电不足。套件提供的4A电源是为峰值负载预留了充足余量的务必使用它。其次是启动介质。Jetson Nano没有内置eMMC存储完全依赖MicroSD卡。官方推荐使用至少16GB、UHS-1及以上速度等级的SD卡。这里有个血泪教训不要贪便宜用低速卡。AI开发中大量的数据读写和编译操作低速卡会成为巨大的瓶颈烧录系统慢系统运行卡顿安装包时等待时间成倍增加。我个人强烈建议使用A1/V30规格的UHS-I卡容量32GB或64GB为宜。更大的容量如128GB当然可以但需要确保你的SD卡读卡器和支持的烧录工具能处理。最后是外设连接。Package B的载板提供了丰富的接口4个USB 3.0 Type-A、一个千兆以太网口、一个HDMI输出、一个DisplayPort接口以及40针的GPIO扩展头。首次上电建议先连接显示器、键盘和鼠标通过HDMI接口进行可视化操作。虽然可以通过SSH进行无头模式Headless操作但对于系统初始设置和验证有个显示器会直观很多。连接好所有外设和网线后插入SD卡接通电源看到绿色指示灯亮起散热风扇开始转动你的Jetson Nano之旅就正式开始了。如果没有任何反应请立即检查供电连接和SD卡是否已正确烧录系统镜像。3. 系统镜像烧录与基础环境搭建Jetson Nano的软件起点是一个特定的Linux系统镜像。NVIDIA为其定制了基于Ubuntu 18.04的JetPack SDK。虽然Ubuntu 18.04在今天看来已经有些陈旧但这个JetPack镜像包含了所有必要的GPU驱动、CUDA、cuDNN、TensorRT等核心组件以及优化过的内核这是在其上顺利运行AI框架的前提。烧录过程本身并不复杂但细节决定成败。3.1 获取与烧录系统镜像首先前往NVIDIA官方网站的Jetson Nano开发者页面下载最新的JetPack SDK for Jetson Nano。请注意对于Jetson Nano通常对应的是JetPack 4.x版本如4.6。JetPack 5.x及以上主要支持Orin系列。下载的文件是一个.zip压缩包解压后得到.img系统镜像文件。接下来需要一款SD卡烧录工具。在Windows下Etcher或Win32 Disk Imager是常用选择在Linux或macOS下可以使用dd命令但Etcher因其图形化界面和自动验证功能更受推荐。使用Etcher的流程非常简单选择镜像文件 - 选择SD卡驱动器 - 点击“Flash”。等待十分钟左右直到验证完成。这里有一个关键操作烧录完成后Windows系统可能会提示你格式化SD卡务必选择“取消”。因为此时SD卡已被识别为多个Linux分区Windows无法正常读取格式化会摧毁所有烧录好的内容。烧录完成后将SD卡插入Jetson Nano的卡槽即可。3.2 首次启动与初始配置上电启动后系统会进行首次扩展文件系统、创建用户等操作。跟随屏幕提示设置用户名、密码、计算机名、时区等。完成后你会进入标准的Ubuntu桌面环境。第一步请立即连接网络如果之前没连然后打开终端。首先更新软件源并升级现有包这是一个好习惯sudo apt update sudo apt upgrade -y升级过程可能会比较长耐心等待。完成后建议安装一些基础开发工具方便后续操作sudo apt install -y python3-pip python3-dev python3-venv git curl wget vim由于系统预装的Python3是JetPack定制版本与CUDA环境关联紧密不建议直接使用sudo pip3安装全局Python包这可能会破坏系统Python环境。最佳实践是使用虚拟环境virtual environment。3.3 创建Python虚拟环境为你的AI项目创建一个独立的虚拟环境是避免依赖冲突的最佳方式。cd ~ python3 -m venv yolov5-env # 创建一个名为yolov5-env的虚拟环境 source yolov5-env/bin/activate # 激活虚拟环境激活后命令行提示符前会出现(yolov5-env)字样。后续所有Python包的安装都应在激活的虚拟环境中进行。你可以将激活命令添加到~/.bashrc文件中以便每次打开终端自动激活echo source ~/yolov5-env/bin/activate ~/.bashrc source ~/.bashrc至此一个干净、独立的Python工作环境就准备好了。接下来我们将在这个基础上配置复杂的AI推理环境。4. 核心软件栈剖析CUDA、cuDNN与TensorRT在Jetson Nano上运行YOLO等模型其性能加速主要依赖于NVIDIA的三大软件栈CUDA、cuDNN和TensorRT。理解它们的关系和作用对于后续的故障排查和性能调优至关重要。4.1 CUDA通用并行计算架构CUDA是NVIDIA推出的并行计算平台和编程模型。它允许开发者利用GPU的众多核心进行通用计算GPGPU。在Jetson Nano上CUDA工具包已经预装在JetPack镜像中。你可以通过以下命令查看版本nvcc --version或者cat /usr/local/cuda/version.txt对于JetPack 4.6CUDA版本通常是10.2。CUDA提供了基础的运行时库和编译器nvcc是上层加速库的基石。4.2 cuDNN深度神经网络库cuDNN是NVIDIA深度神经网络加速库。它针对深度神经网络中的标准操作如前向传播、反向传播、卷积、池化等提供了高度优化的实现。PyTorch、TensorFlow等框架在GPU上的训练和推理加速底层都调用了cuDNN。其版本与CUDA版本有严格的对应关系。在Jetson Nano上cuDNN也是预装的可以通过查找头文件或库文件来确认版本cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2在JetPack 4.6中cuDNN版本通常是8.x。4.3 TensorRT高性能推理优化器TensorRT是本章节的重点也是在Jetson这类边缘设备上部署模型的关键。它是一个用于高性能深度学习推理的SDK。它的工作流程可以概括为导入训练好的模型如ONNX格式- 进行图优化、层融合、精度校准FP16/INT8- 生成一个高度优化的运行时引擎plan文件- 执行高效推理。与直接使用PyTorch或TensorFlow的原生模型进行推理相比TensorRT能带来数倍甚至数十倍的性能提升并显著降低延迟。这是因为TensorRT进行了以下几项关键优化层融合将多个相邻的神经网络层如Conv、BN、ReLU融合为一个单一的核函数减少内存访问开销和内核启动延迟。精度校准在保证精度损失可接受的前提下将FP32模型转换为FP16甚至INT8精度大幅提升计算吞吐量和能效比。Jetson Nano的GPU支持FP16INT8则需要额外的校准过程。内核自动调优针对特定的GPU架构如Nano的Maxwell架构选择最优的内核实现。动态张量内存管理高效复用中间张量的内存减少内存分配开销。在Jetson Nano上TensorRT同样作为JetPack的一部分预装。可以通过dpkg命令查看其版本dpkg -l | grep tensorrt通常版本为7.x。这三者构成了Jetson Nano AI能力的软件铁三角预装且深度集成省去了手动安装和配置的巨大麻烦这也是使用官方JetPack镜像的核心优势。5. 实战为Jetson Nano编译安装OpenCV with CUDA尽管JetPack预装了OpenCV但预装版本通常不支持CUDA加速这对于需要做实时视频流处理的计算机视觉应用是一个性能瓶颈。为了充分发挥Jetson Nano的潜力从源码编译一个支持CUDA的OpenCV是很多开发者的必经之路。这个过程耗时较长约2-3小时且容易出错但一旦成功对后续应用性能提升显著。5.1 准备工作与依赖安装首先确保系统有足够的交换空间swap space。编译OpenCV需要大量内存Nano的4GB内存可能不够。我们可以创建一个交换文件sudo fallocate -l 4G /swapfile # 创建一个4GB的交换文件 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile为了让交换文件开机生效需要将其添加到/etc/fstab文件末尾echo /swapfile swap swap defaults 0 0 | sudo tee -a /etc/fstab接下来安装编译所需的依赖库。这是一长串命令建议分批执行sudo apt install -y build-essential cmake git unzip pkg-config sudo apt install -y libjpeg-dev libpng-dev libtiff-dev sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev sudo apt install -y libxvidcore-dev libx264-dev sudo apt install -y libgtk-3-dev sudo apt install -y libatlas-base-dev gfortran sudo apt install -y python3-dev5.2 下载源码与配置CMake我们选择较新的OpenCV 4.5.x版本并包含opencv_contrib扩展模块。cd ~ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.5.zip wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.5.zip unzip opencv.zip unzip opencv_contrib.zip mv opencv-4.5.5 opencv mv opencv_contrib-4.5.5 opencv_contrib现在进入opencv目录创建并进入build文件夹cd ~/opencv mkdir build cd build最关键的一步是CMake配置。我们需要显式开启CUDA、关闭一些我们不需要的模块如Java绑定、测试来加快编译速度。使用以下命令这是一条很长的命令确保在一行内执行cmake -D CMAKE_BUILD_TYPERELEASE \ -D CMAKE_INSTALL_PREFIX/usr/local \ -D OPENCV_EXTRA_MODULES_PATH~/opencv_contrib/modules \ -D ENABLE_NEONON \ -D ENABLE_VFPV3ON \ -D WITH_OPENMPON \ -D WITH_OPENCLOFF \ -D WITH_CUDAON \ -D WITH_CUDNNON \ -D OPENCV_DNN_CUDAON \ -D CUDA_ARCH_BIN5.3 \ -D CUDA_ARCH_PTX5.3 \ -D WITH_CUBLASON \ -D WITH_LIBV4LON \ -D WITH_GSTREAMERON \ -D WITH_GTKON \ -D BUILD_opencv_python3ON \ -D BUILD_TESTSOFF \ -D BUILD_PERF_TESTSOFF \ -D BUILD_EXAMPLESOFF \ -D BUILD_opencv_javaOFF \ -D PYTHON3_EXECUTABLE/usr/bin/python3 \ -D PYTHON3_INCLUDE_DIR/usr/include/python3.6 \ -D PYTHON3_LIBRARY/usr/lib/aarch64-linux-gnu/libpython3.6m.so \ -D PYTHON3_NUMPY_INCLUDE_DIRS/usr/lib/python3/dist-packages/numpy/core/include \ -D PYTHON3_PACKAGES_PATH/usr/lib/python3/dist-packages \ ..参数解析-D WITH_CUDAON和-D WITH_CUDNNON启用CUDA和cuDNN支持。-D OPENCV_DNN_CUDAON启用OpenCV DNN模块的CUDA后端这对于用OpenCV直接运行ONNX模型至关重要。-D CUDA_ARCH_BIN5.3指定Jetson Nano GPU的计算能力Compute Capability。Nano的Maxwell架构GPU计算能力为5.3这个参数必须正确否则CUDA代码无法编译。-D BUILD_opencv_python3ON和相关PYTHON3_*参数确保编译出Python3绑定并正确链接到系统的Python3。运行cmake命令后仔细查看输出。确保在“CUDA”部分你能看到CUDA support: YES并且CUDA arch: 5.3。同时检查Python 3部分确认解释器、库和numpy路径是否正确。5.3 编译与安装配置成功后开始编译。使用make命令并加上-j4参数以利用Nano的4个CPU核心加速编译。这个过程非常漫长。make -j4编译过程中可能会遇到内存不足的问题如果卡住或报错可以尝试不使用-j4只用make单线程编译或者进一步增加交换空间。编译成功后进行安装sudo make install sudo ldconfig安装完成后你可以在Python中验证OpenCV是否支持CUDAimport cv2 print(cv2.__version__) print(cv2.cuda.getCudaEnabledDeviceCount())如果输出版本号和大于0的设备数恭喜你一个支持CUDA加速的OpenCV已经就绪。这为后续高性能视频处理和模型推理打下了坚实基础。6. YOLOv5模型部署全流程从PyTorch到TensorRT引擎在Jetson Nano上部署YOLOv5是检验其边缘AI能力的经典场景。整个过程涉及模型导出、格式转换、引擎生成和推理执行多个环节。下面我们以YOLOv5s小型号为例详细走通这个流程。6.1 克隆YOLOv5仓库与安装依赖首先确保你在之前创建的虚拟环境中。然后克隆Ultralytics的YOLOv5仓库注意我们使用较成熟的v6.x或v7.x版本以确保与JetPack 4.6的兼容性。cd ~ git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txtrequirements.txt会安装PyTorch、TorchVision等。在Jetson Nano上不能直接使用PyPI上的PyTorch必须安装NVIDIA为Jetson预编译的版本。幸运的是YOLOv5的requirements安装过程可能会失败这正是我们需要手动安装正确版本的地方。访问NVIDIA的官方论坛或PyTorch for Jetson页面找到对应JetPack 4.6和Python 3.6的PyTorch wheel文件。例如对于JetPack 4.6 (L4T R32.7.1)命令可能如下wget https://nvidia.box.com/shared/static/.../torch-1.10.0-cp36-cp36m-linux_aarch64.whl pip install torch-1.10.0-cp36-cp36m-linux_aarch64.whl然后安装对应的torchvision。同样需要找到预编译的版本。安装完成后在Python中验证import torch print(torch.__version__) print(torch.cuda.is_available()) # 应该输出True print(torch.backends.cudnn.is_available()) # 应该输出True6.2 导出模型为ONNX格式YOLOv5仓库提供了方便的导出脚本。我们使用其预训练模型yolov5s.pt。python export.py --weights yolov5s.pt --include onnx --img 640 --batch 1 --simplify参数解析--weights: 指定预训练权重文件。--include onnx: 指定导出为ONNX格式。--img 640: 指定模型的输入图像尺寸。YOLOv5默认是640x640。--batch 1: 指定批处理大小为1。在边缘设备上通常使用批处理为1进行推理。--simplify: 对ONNX模型进行简化去除一些冗余操作有利于TensorRT解析。执行成功后会在当前目录生成yolov5s.onnx文件。你可以使用Netron等工具可视化这个模型查看其输入输出节点名称这对后续TensorRT推理很重要。6.3 使用TensorRT Python API构建引擎有了ONNX模型下一步是使用TensorRT的Python API将其转换为TensorRT引擎.plan或.engine文件。这里我们编写一个简单的转换脚本onnx_to_trt.pyimport tensorrt as trt import sys TRT_LOGGER trt.Logger(trt.Logger.WARNING) EXPLICIT_BATCH 1 (int)(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH) def build_engine(onnx_file_path, engine_file_path): with trt.Builder(TRT_LOGGER) as builder, \ builder.create_network(EXPLICIT_BATCH) as network, \ trt.OnnxParser(network, TRT_LOGGER) as parser: builder.max_batch_size 1 builder.max_workspace_size 1 30 # 1GB builder.fp16_mode True # 开启FP16模式在Nano上可提速 print(fLoading ONNX file from {onnx_file_path}...) with open(onnx_file_path, rb) as model: if not parser.parse(model.read()): print(ERROR: Failed to parse the ONNX file.) for error in range(parser.num_errors): print(parser.get_error(error)) return None print(Building TensorRT engine. This may take a while...) engine builder.build_cuda_engine(network) if engine is None: print(ERROR: Failed to build engine.) return None print(fSaving engine to {engine_file_path}) with open(engine_file_path, wb) as f: f.write(engine.serialize()) return engine if __name__ __main__: onnx_path yolov5s.onnx engine_path yolov5s_fp16.engine build_engine(onnx_path, engine_path)这个脚本做了几件事创建TensorRT记录器、构建器、网络使用ONNX解析器加载模型设置最大批处理大小和工作空间启用FP16模式以加速在Nano上效果显著最后构建并序列化引擎。运行这个脚本python onnx_to_trt.py转换过程可能需要几分钟。成功后会生成yolov5s_fp16.engine文件。这个文件是特定于当前Jetson Nano硬件和TensorRT版本的不能直接拷贝到其他不同架构的设备上使用。6.4 编写TensorRT推理脚本引擎文件是序列化后的优化模型。推理时我们需要反序列化引擎创建执行上下文并处理输入输出。以下是推理脚本trt_inference.py的核心框架import tensorrt as trt import pycuda.driver as cuda import pycuda.autoinit import numpy as np import cv2 import time class HostDeviceMem: def __init__(self, size, dtypenp.float32): self.host cuda.pagelocked_empty(size, dtype) self.device cuda.mem_alloc(self.host.nbytes) def __str__(self): return fHost:\n{self.host}\nDevice:\n{self.device} def __del__(self): self.device.free() def allocate_buffers(engine, context): inputs, outputs, bindings [], [], [] stream cuda.Stream() for binding in engine: size trt.volume(engine.get_binding_shape(binding)) * engine.max_batch_size dtype trt.nptype(engine.get_binding_dtype(binding)) # 分配主机和设备内存 mem HostDeviceMem(size, dtype) bindings.append(int(mem.device)) if engine.binding_is_input(binding): inputs.append(mem) else: outputs.append(mem) return inputs, outputs, bindings, stream def do_inference(context, bindings, inputs, outputs, stream, batch_size1): # 将输入数据从主机拷贝到设备 [cuda.memcpy_htod_async(inp.device, inp.host, stream) for inp in inputs] # 执行推理 context.execute_async_v2(bindingsbindings, stream_handlestream.handle) # 将输出数据从设备拷贝到主机 [cuda.memcpy_dtoh_async(out.host, out.device, stream) for out in outputs] # 同步流 stream.synchronize() # 返回输出数据 return [out.host for out in outputs] # 加载引擎 with open(yolov5s_fp16.engine, rb) as f: runtime trt.Runtime(trt.Logger(trt.Logger.WARNING)) engine runtime.deserialize_cuda_engine(f.read()) context engine.create_execution_context() # 分配缓冲区 inputs, outputs, bindings, stream allocate_buffers(engine, context) # 预处理图像读取、Resize到640x640、归一化、转换为CHW格式、展平 img cv2.imread(test.jpg) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_resized cv2.resize(img_rgb, (640, 640)) img_normalized img_resized.astype(np.float32) / 255.0 img_chw np.transpose(img_normalized, (2, 0, 1)) # HWC to CHW img_flatten img_chw.flatten() # 将处理后的数据拷贝到输入缓冲区 np.copyto(inputs[0].host, img_flatten.ravel()) # 执行推理 start time.time() trt_outputs do_inference(context, bindings, inputs, outputs, stream) end time.time() print(fInference time: {(end-start)*1000:.2f} ms) # 后处理trt_outputs是一个列表包含模型的所有输出。 # YOLOv5的输出维度需要根据模型结构解析通常是1x25200x85。 # 这里需要实现非极大值抑制(NMS)等后处理步骤来得到最终的检测框。 # 后处理代码较长此处省略可参考YOLOv5原项目的utils.general.py这个脚本涵盖了TensorRT推理的核心步骤加载引擎、分配CUDA内存、数据预处理、异步推理、数据后处理。你需要根据YOLOv5s的具体输出结构通常是[1, 25200, 85]其中854个坐标1个置信度80个类别分数编写后处理代码应用置信度阈值和非极大值抑制来得到最终的检测结果。将后处理结果用OpenCV画在原图上你就完成了一次完整的TensorRT推理。实测下来在Jetson Nano上使用FP16精度的TensorRT引擎运行YOLOv5s推理一张640x640的图片可以在100毫秒左右完成比纯PyTorch推理快数倍。7. 性能调优与实战问题排查成功部署只是第一步让模型在资源受限的Jetson Nano上稳定、高效地运行还需要一系列的调优和问题排查。以下是几个最常见的实战问题和优化技巧。7.1 内存与交换空间管理Jetson Nano仅有4GB共享内存CPU和GPU共用。在运行稍大的模型或处理高分辨率视频时极易出现内存不足OOM错误。除了之前提到的增加交换空间还有以下方法监控工具使用tegrastats命令实时监控内存、CPU、GPU使用情况。tegrastats是Jetson系列独有的工具每秒刷新一次信息非常全面。清理缓存在长时间运行或内存紧张时可以手动清理Linux的页面缓存sudo sh -c echo 3 /proc/sys/vm/drop_caches。模型优化考虑使用更小的模型如YOLOv5n或者将模型转换为INT8量化。INT8量化能进一步减少内存占用和提升速度但需要准备校准数据集并可能带来精度损失。7.2 电源模式与时钟频率Jetson Nano有两种电源模式5W和10W模式。默认可能是5W模式这会限制CPU和GPU的最大频率。你可以使用sudo nvpmodel -q查询当前模式使用sudo nvpmodel -m 0切换到10W模式最大性能。同时可以使用jetson_clocks脚本将CPU和GPU时钟锁定在最高频率以获得持续高性能sudo jetson_clocks需要注意的是10W模式和高频运行会产生更多热量务必确保散热风扇工作正常必要时可以考虑加装散热片或主动散热风扇。7.3 TensorRT引擎构建失败常见原因ONNX opset版本不兼容TensorRT对ONNX算子集版本有要求。如果导出ONNX时使用了太新的opset可能不被TensorRT支持。在YOLOv5的export.py中可以使用--opset 12指定一个较旧且兼容性好的版本。动态维度问题ONNX模型中包含动态维度如-1或?而TensorRT在构建时可能需要固定这些维度。在构建引擎时需要为这些动态维度指定优化配置文件Optimization Profile。对于固定批处理大小的推理在导出ONNX时使用--batch 1固定批次维度可以避免此问题。不支持的算子ONNX模型中包含了TensorRT不支持的算子。YOLOv5中常见的SiLU激活函数在较旧的TensorRT版本中可能不支持。解决方法有两种一是在导出ONNX前将模型中的SiLU替换为ReLU通过修改YOLOv5源码二是使用支持SiLU的更新版TensorRT可能需要升级JetPack。7.4 推理精度下降与FP16/INT8启用FP16后推理速度大幅提升但可能会带来微小的精度下降对于某些对精度极其敏感的应用如医疗影像需要评估。INT8量化带来的速度提升更明显但精度损失风险更大。进行INT8量化需要一个有代表性的校准数据集几百张图片即可TensorRT会在构建引擎时统计每一层激活值的分布确定缩放因子。如果校准集不能代表真实数据精度损失会很大。在Jetson Nano上INT8量化的收益相对于FP16可能没那么大且过程更复杂建议先从FP16开始。7.5 “编译核心输出目录”相关网络热词中提到的“jetson orin nano 编译核心 输出目录”问题在Jetson Nano上同样存在。这通常指的是在编译一些内核模块或驱动时输出目录-O参数设置不正确。例如在编译树莓派摄像头驱动raspberrypi-imager或某些自定义内核模块时需要指定KERNEL_SRC和KERNEL_OUT目录。对于标准的Jetson Nano L4T系统内核头文件通常在/usr/src/linux-headers-$(uname -r)目录下。编译时应确保指向正确的目录。一个常见的编译命令模板如下make -C /usr/src/linux-headers-$(uname -r) M$(pwd) modules这里的-C选项指定了内核源码目录M指定了模块源码所在当前目录。如果遇到输出目录错误请仔细检查Makefile中的路径变量并确保你拥有目标目录的写入权限。