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 国际许可协议进行许可。