jetson nano 查看opencv版本_用Jetson玩转TensorRT与ROS

49684318d65e81b3a3d6e1f3cc9d4ae7.png

之前两篇关于Jetson Nano的文章中,还有一个重要特色没有展示,即深度学习推理。尽管我还有TX1和TX2可用,这次依旧用Nano来演示。毕竟 @NVIDIA英伟达 给我这块Nano来评测,这篇文章仍算是评测的一部分。当然,下面的内容也适用于TX1、TX2乃至Xavier。这次将展示如何在ROS中使用TensorRT来做实时目标检测与多目标追踪,以及可以在Nano上实时运行的人体姿态估计。

众所周知,深度学习训练和推理所需的资源是完全不一样的。如今大多数的AI芯片都是专为推理而设计。而Jetson系列虽然是ARM架构,配的却是和x86一样的Nvidia GPU。也就是说,我们可以在上面装TensorFlow,PyTorch这些框架,原则上训练和推理都可以。只不过和x86平台相比,这些GPU都挺弱。比如TX1有256个CUDA核心,也就是移动版入门GPU MX110的性能。而Nano就更可怜了,只剩128个CUDA核心,算半精度浮点性能才能达到472GFlops。所以做训练的话,恐怕只能跑跑MINST,或者搞搞强化学习这种不靠数据集的。而对于推理,这点算力还是可以做很多有意思的东西。作为参考Intel的第一代Movidius计算棒也只有100多GFlops。

作为使用Nvidia GPU的设备,Jetson的优势在于有TensorRT加成。TensorRT可以将网络推理性能提高数倍。比如原本用TensorFlow在Titan X上才能运行的目标检测,我们后来在TX2上就能实时运行。正因为各家厂商在出AI芯片时也会配上各自的优化工具,我们很难仅靠纸面算力来评价一块芯片的性能。使用神经网络进行推理时,不再需要进行反向传播,这里就减少了大量临时存储的使用。推理框架也会将部分层进行融合,提高IO性能。另外网络输入大小一般也已经固定,网络会被冻结并可以更合理地分配显存。除了层融合,TensorRT还会进行张量融合,内核自动调整等方法自动优化,并可以在Jetson平台上混合使用FP32和FP16。

无论以何种方式使用TensorRT,一般都分为两步:生成优化引擎和运行优化引擎。我们的网络一般在TensorFlow、PyTorch、Caffe、MXNet、Darknet等框架下训练。我们需要将不同框架下训练好的网络结构和权重导入TensorRT并进行优化,再使用优化引擎进行推理。各种框架和模型有不同的导入方式,可以参考TensorRT文档中的示例。由于深度学习领域发展较快,转换时容易遇到的问题是模型中一些层并没有被TensorRT所支持,需要自行以Plugin的方式来实现。

因此可以考虑一下建议:

  1. 在使用TensorRT时应尽量考虑使用最新版本,新版往往包含更多网络层的实现。支持情况可以在文档中找到。
  2. 某些框架已经集成TensorRT。比如可以在TensorFlow中使用TF-TRT,将自动把网络可优化的部分使用TensorRT推理。这种方式往往不如直接使用API优化的彻底,但易于使用,也能获得不错的加速效果。
  3. 尝试ONNX交换格式,可以在不同框架之间转换模型,也可以被TensorRT解析。可以先使用Netron可视化网络并对照文档检查各层是否受支持。

模型被TensorRT正确解析后就可以开始优化。优化是自动完成的,但一般需要较长时间,因为TensorRT在进行内核自动调整时需要尝试不同的融合方式与并行方式,优化执行时间。如果我们每次都解析模型再优化,则使用TensorRT推理时需要很长的启动时间。好在生成的优化引擎是可以序列并保存为Plan文件,以后使用时直接加载。TensorRT的Plan文件可以理解为优化引擎的内存页面,里面包含了模型结构、权重、执行步骤。不同平台的流处理器数量不同,最终得到的时间最优的并行化方式也不相同。因此不应将Plan文件跨平台使用。运行引擎相对较为简单,和其它CUDA程序一样,先将数据从Host拷贝到Device,推理完成后从Device拷贝到Host。而在Jetson平台上,因为内存和显存是共享的,我们可以使用Unified Memory来实现零拷贝,详见下面的论坛话题。

https://devtalk.nvidia.com/default/topic/1038545​devtalk.nvidia.com

如今卷积神经网络在图像领域取得了不错的效果,很多人开始在机器人应用中使用深度学习来处理相机数据。上一篇文章中介绍了使用脚本快速安装ROS。现在已有使用深度学习框架的ROS包如tensorflow_ros_cpp和darknet_ros。但TensorFlow和Darknet都并没有针对网络推理进行深度优化,难以获得我们想要的实时性。因为对机器人应用来说,能实时处理传感器数据意味着其可以作为一套高级感知系统,持续运行,否则只能作为服务被调用。为了展示如何在ROS中使用TensorRT C++ API,我开源了一个SSD Demo。

borongyuan/ssd_ros​github.com
c369296b8dca9e8ad7f181ea43f9b2e3.png

这个Demo其实是将TensorRT Samples中的sampleUffSSD改写成一个ROS包。当部署在COCO数据集上训练的SSD_Mobilenet_V1时,可以在Jetson Nano上达到16FPS。README中已经提供了操作步骤,下面再对部分步骤进行解释。

首先,我们需要对sample中的代码进行一些修改,以便运行sample时可以保存优化引擎。将

trtModelStream = engine->serialize();

修改为

ofstream planFile;
planFile.open("sample_ssd.plan");
trtModelStream = engine->serialize();
planFile.write((char *)trtModelStream->data(), trtModelStream->size());
planFile.close();

这步即是用ofstream将引擎写入Plan文件。将

builder->setHalf2Mode(false);

修改为

builder->setFp16Mode(true);

便允许模型优化时使用半精度来计算。但该选项并不保证所有操作一定使用半精度。因为TensorRT在搜索优化参数时会尝试单精度和半精度,找到性能最好的,有时单精度可能还比半精度快。

其它修改可以用文件比较工具查看。重新编译运行即可获得plan文件,之后复制到ROS包的data目录下使用。预训练模型从TensorFlow Object Detection API下载,建议参照exporting_models.md用1.8版来导出冻结模型,以配合提供的config.py使用。示例之所以用Mobilenet V1而不是V2是因为两者精度相近,而V1在GPU上更快一些。我现在使用的是TensorRT 5.0,在5.1中对深度可分卷积有更好的优化,可能跑V2也会更快一些。

将sampleUffSSD移植到ROS需要使用C++&CUDA混编。ssd_node.cpp是ROS节点,ssd_nodelet.cpp又将其封装为nodelet,核心部分主要在trt_infer.cu中。我们还需要common.h这个samples使用的头文件。而utils.h头文件则包含了输入图像的预处理。

在CMakeLists.txt中,我们需要使用

cuda_add_library

cuda_add_executable

以说明需要使用nvcc编译。下面是模型的运行效果。

508b89b99ab86eebafb636c4b9c482aa.png
Jetson Nano TensorRT SSD Detechttps://www.zhihu.com/video/1161792227436646400

将相机输入锁定为15FPS后,我们便能保证对每帧图像进行检测。因此可以使用Tracking by Detection的方法加入多目标追踪。

59babddfa93c1434dcea39e95ad96991.png
Jetson Nano TensorRT SSD Trackhttps://www.zhihu.com/video/1161792936450240512

因为追踪时对Bounding Box使用了卡尔曼滤波,可以看到Bounding Box抖动更小。不稳定的识别会被过滤,被追踪的目标会保持临时的ID号。但没有进行重识别,重新进入画面后ID可能会变化。

SSD的TensorRT实现较为复杂一些,因为NMS等网络后部处理靠Plugin实现。但如果模型的所有操作都被TensorRT直接支持,转换可能就很容易。比如Intel OpenVINO中的轻量级人体姿态检测lightweight-human-pose-estimation.pytorch。模型导出为ONNX后可直接被TensorRT解析,只需使用下面的Python脚本进行转换。

import 

该网络AP~43%,且经过TensorRT加速,在Nano上就能达到16FPS。

ea2cea6488223a2a33dfe08e027fefc1.png
Jetson Nano Human Posehttps://www.zhihu.com/video/1227360307079151616

作为不到千元的硬件,Jetson Nano这样的推理性能是非常不错的。之后的文章将较晚更新,将在开发完成后放出。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值