deepstream是nvidia专为处理多个串流影像,并进行智能辨识而整合出的强大工具。开发语言除了原先的c++,从deepstream sdk 5.1也支持基于原先安装,再挂上python套件的方式,让较熟悉python程序语言的使用者也能使用deepstream。
本文主要将其应用在jetson nano上,并于deepstream导入自己的模型执行辨识。
在jetson nano上面安装deepstream
笔者使用的硬件为jetson nano 2gb/4gb,参照官方提供的步骤与对应的版本,几乎可以说是无痛安装。对比同样采用干净映像档,使用源码或是docker安装的jetbot与jetson inference要快上许多。
执行官方范例
deepstream有提供不少范例,不论是从csi或usb接口的摄影机取得画面,或是多影像辨识结果显示,都能经由查看这些范例,学习如何设定。
透过下列指令执行一个配置文件,查看deepstream是否安装成功,这个配置文件会开启一部mp4影片,并模拟产生8个输入来源,经模型推论处理过后于同一个画面显示,点击单一个区块可以显示该来源的详细信息。实际应用上可以将各部摄影机的画面同时输出并进行处理。
deepstream-app -c source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt
使用自己的模型
如果您与笔者一样是nvidia官方课程小粉丝,从拥有jetson nano开始,就按部就班的跟着课程学习,那您一定看过下列三种不同主题的课程。
从入门的section 1开始,到执行section 2的jetbot自驾车项目,最后section 3 hello ai world。经过三个section,您应该稍微熟悉pytorch,并且也训练了不少自己的模型,特别是在hello ai world有训练了object detection模型。既然都有自己的模型,何不放到deepstream上面制作专属的串流辨识项目,针对想要辨识的项目导入适合的模型。
在hello ai world项目训练object detection模型的时候,我们使用的是ssd-mobilenet,在deepstream的对象辨识范例中有提供使用自己的ssd模型方法,可在下列路径找到参考文件,文件中使用的例子是使用coco数据集预训练的ssd-inception。
/opt/nvidia/deepstream/deepstream-5.1/sources/objectdetector_ssd
可惜的是文件中使用的是从tensorflow训练的模型,经由转换.uff再喂给deepstream,与官方课程使用的pytorch是不同路线。笔者在网上寻找解决方法,看是否有deepstream使用pytorch模型的方案,也于nvidia开发者论坛找到几个同样的提问,但最终都是导到上述提到的参考文件。
从hello ai world训练的object detection模型,经过执行推论的步骤,您应该会有三个与模型有关的档案,分别是用pytorch训练好的.pth,以及为了使用tensorrt加速而将.pth转换的.onnx,最后是执行过程中产生的.engine。既然pytorch模型找不到解决方案,那就从onnx模型下手吧,所幸经过一番折腾,终于让笔者找到方法。
https://github.com/neilyoung/nvdsinfer_custom_impl_onnx
neilyoung提供的方法主要是能产生动态函式库,以便我们能在deepstream使用onnx模型,除了准备好自己训练的onnx模型档案与labels档案,只要再新增设定模型路径与类型的config档案,与deepstream配置文件就能实现使用自己的模型进行推论啰!
step 1:
首先于以下路径底下新增执行onnx项目的文件夹,笔者命名为objectdetector_onnx。
/opt/nvidia/deepstream/deepstream-5.1/sources
step 2:
新增专案文件夹后,请clone方才的nvdsinfer_custom_impl_onnx专案到文件夹内。
step 3:
打开terminal进到nvdsinfer_custom_impl_onnx项目里面,透过sudo make指令产生动态函式库。
step 4:
接着将自己从hello ai world项目训练的object detection模型与卷标复制到objectdetector_onnx项目文件夹。
step 5:
从别的项目文件夹复制config档案与deepstream配置文件到我们的文件夹内,这边复制objectdetector_ssd,因为模型类型相近,只要稍微修改即可。
step 6:
首先修改config档案,如下图所示,将模型路径与卷标路径,修正为自己的模型与卷标名称,engine档案的部份与hello ai world项目一样,在执行onnx档案进行tensorrt加速时会自动产生,只需给路径与名称即可。对于classes的部份,切记在hello ai world项目训练的模型会加上background这一个类别,所以若是您辨识的对象有三种,就得在classes这边填上3+1。
下方三项的设定则依照nvdsinfer_custom_impl_onnx项目github上的说明,记得动态函式库的路径请改成自己的路径。
output-blob-names=boxes;scores
parse-bbox-func-name=nvdsinferparsecustomonnx
custom-lib-path=/path/to/lib/libnvdsinfer_custom_impl_onnx.so
接着依照个人需求设定辨识的参数,例如希望信心指数达多少%才认定对象类别,可以修改threshold。
step 7:
接着修改deepstream配置文件,笔者在这边设定为usb webcam输入,并输出单一窗口显示,除了正常调整输入与输出之外,请将config档案与labels档案导引至自己的路径,engine的部份与config设定相同即可,如下图所示。
完成上述7步骤后,就能执行配置文件查看是否有正确执行我们的onnx模型,第一次执行会较久,过程会产生engine档案,一旦有了engine档,之后执行就不会再重复产生。
成功执行自定义模型的结果。
结论
原官方范例大多执行车流检测,若是想执行别的应用就得自己研究。本篇透过将自己训练好的pytorch模型转换为onnx,经7步骤后让deepstream可以使用我们自己的模型进行辨识,使其能应用在交通以外的场景,例如室内监控、多机台管控…等。
利用DC-DC开关电容稳压器提升便携设备电源效率
新一代RedCap高精度定位定位芯片的优势,引领5G定位创新
DNA也可以用来构建柔性材料?
贸泽电子新品推荐:2020年1月率先引入新品的全球分销商
合肥市副市长赵明考察调研市大数据公司和本源量子
在DeepStream上使用自己的Pytorch模型
苹果发布最新可穿戴设备Apple Watch Series 4系列,或将支持eSIM卡
双战告捷,芯驰科技荣获两项行业大奖
无创脑电图(EEG)传感器能更好地测量大脑对环境的反应
中芯国际最大股东是谁_中芯国际十大股东排名
新型EMI滤波器结构的设计和研究分析
盘点2011手机市场十大事件
USB-C兼容iPhone希望破灭?
物联网模组厂商爱联科技终止上市!拟募资4.41亿扩建及研发WiFi6等模组
多用欧姆表的原理和使用
安防摄像机软硬件阵营对比,都具有哪些优劣势
以人为本 智慧城市建设要关注实际
无线耳机什么牌子好,xisem西圣凭什么荣登性价比之王的宝座
大屏幕拼接显示墙选购指南
综合布线产品选型