Jetson Nano算法部署实战
硬件和环境准备
- Jetson Nano B01开发板
- CSI摄像头模块
- Wifi模块
我选择的是亚博智能的wife进阶套餐开发套件,TF卡自带镜像,自带一些所需的Package:
- deepstream-app version: 6.0.1
- DeepStream SDK: 6.0.1
- JetPack: 4.6
- Python: 3.6.9
- CUDA Driver version: 10.2
- CUDA Runtime version: 10.2
- TensorRT version: 8.2
- cuDNN version: 8.2
- ONNXRuntime-gpu: 1.6.0(自行下载)
ONNXRuntime-gpu的下载:Jetson Nano为arm64架构,ONNXRuntime-gpu不能直接通过pip下载,需要手动编译。好在官方已经帮我们完成了,需要根据Jetpack版本和Python版本进行选择! 下载地址
下载完成之后,打开Terminal,进入下载地方的地址,使用pip安装:
|  |  | 
连接工具
我们需要在Jetson Nano内部写代码,需要使用较为方便的编辑器,我这里选择的是vscode远程连接Jetson Nano。
vscode远程配置连接:
- 首先在vscode中添加扩展Remote - SSH
- 启动Jetson Nano,并连接wifi,打开Terminal输入ifconfig,将最下方的ip地址记下。
- 在PC端的Remote - SSH连接到刚刚的IP地址,并输入Jetson Nano账户和密码(亚博智能的为 账户:Jetson 密码:yahboom)需要注意的是PC和Jetson Nano必须连接到同一个wifi。
- 在vscode端为jetson nano内部配置Python扩展。
- 文件传输工具,因为我使用的是MAC端,所以我使用Transmit工具,连接方式和vscode连接是一样的。
算法准备
关于算法你需要的文件就只有一个ONNX文件,因为ONNX既包含了模型的权值参数也包含了计算图。我在这里使用的算法是我开发的脐橙缺陷检测分割算法FastSegFormer-P。
- ONNX文件导出(需要pth文件):
|  |  | 
ONNXRuntime-gpu单帧处理逻辑
视频检测最重要的就是单帧的处理逻辑,将该部分完成了,程序内核就完成。该部分主要的流程就是输入前处理->算法推理->掩码预测->图像合并->图像后处理。
单帧处理代码:
|  |  | 
TensorRT单帧处理逻辑
该部分最主要的流程为就是从ONNX文件构建engine->从engine构建context->从engine中获取size并分配buffer->单帧处理逻辑
从ONNX构建TensorRT的Engine:
|  |  | 
由于我的模型代码中存在双线性插值等操作,onnx版本算子不支持,选择不序列化engine保存,而选择在线构建引擎的方式,所以会比较耗时。(序列化后无法进行反序列化读取engine)
单帧处理代码:
|  |  | 
DeepStream视频处理框架
DeepStream是一种高性能、低延迟的边缘智能视频分析和处理平台,由NVIDIA开发。它结合了深度学习推理、多流视频分析和传统计算机视觉技术,旨在为各种实时视频分析应用提供可扩展的解决方案。主要用于智能安防监控、智能交通、零售分析和工业检测等行业。
以下是DeepStream的一些主要特点:
- 
高性能推理:DeepStream利用GPU的并行计算能力,提供高性能的深度学习推理,可以实时处理多个视频流并进行实时分析和推断。 
- 
多流处理:DeepStream支持并行处理多个视频流,可以同时处理来自多个摄像头或视频源的数据。这使得DeepStream非常适合大规模监控系统、智能交通和视频分析等应用场景。 
- 
灵活的插件架构:DeepStream采用了灵活的插件架构,可以轻松集成各种不同的算法和模型。这使得开发人员可以根据应用需求选择适合的算法,例如目标检测、跟踪、人脸识别等。 
- 
实时分析和响应:DeepStream提供实时的视频流分析和处理,能够在几乎实时的条件下检测、跟踪和分析视频中的对象。这对于需要即时响应的应用非常重要,例如安防监控和实时决策系统。 
下面是DeepStream的工作流程:
数据源接入 -> 数据解码 -> 对数据流做混合 -> 建立推理模块 -> 处理后的数据进行转换 -> 数据输出 -> 数据后处理以及在原视频上加入外来部分(分割:掩码;检测:检测框)
DeepStream使用Python接口程序的逻辑:
创建Pipeline -> 构建不同部分的处理模块 -> 将所有处理模块都加入Pipeline -> 将所有模块按照需要的顺序连接起来 -> 设置不同模块的参数以及配置模型的配置文件 -> 编写需要对画面进行处理的程序 -> 启动Pipeline进行视频处理
使用DeepStream-Python进行视频处理的示例程序(图像分割),示例程序使用的都是Caffe框架的模型: 图像分割:deepstream-segmentation 视频流实例分割:deepstream-segmask 官方模型config文件参数设置
Jetson-FastSegFormer
这是我在Jetson Nano上使用ONNXRuntime-gpu和TensorRT以及DeepStream,可以在这里访问:https://github.com/caixiongjiang/FastSegFormer-pyqt/tree/main/jetson-FastSegFormer
下面是我测试的结果:
| Jetson-FastSegFormer | |||||||
|---|---|---|---|---|---|---|---|
| Task | Video/Stream input | Inference input | Inference framework | GPU computing capability | Quantification | Video processing | Average FPS | 
| Video Detection | $512\times 512$ | $224\times 224$ | ONNXRuntime | 0.4716 TFLOPS | FP16 | Single frame | 10 | 
| TensorRT | 15 | ||||||
| ONNXRuntime | Multi-thread | ~ | |||||
| TensorRT | ~ | ||||||
| TensorRT | DeepStream | 23 | |||||
| CSI Camera Detection | $1280\times 720$ | ONNXRuntime | Single frame | 8 | |||
| TensorRT | 12 | ||||||
| ONNXRuntime | Multi-thread | ~ | |||||
| TensorRT | ~ | ||||||
| TensorRT | DeepStream | 20 | |||||
最后修改于 2023-06-02

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。