Jetson Orin NANO官网资料网址: https://www.yahboom.com/study/Jetson-Orin-Nano 密码:lguu
主机初始账号:jetson
初始密码:yahboom
一. 硬件
购买Jetson Orin Nano 8g版本,组装亚克力外壳(已完成),组装视频:
https://www.yahboom.com/study_module/NX-shell
1.1 固态256g
出厂镜像要压缩烧录导致固态硬盘没有显示实际的256g,需要安装后扩容。
扩充固态硬盘使用gparted软件,resize设置(已完成)。
1.2 摄像头
摄像头分三种,板载摄像头、usb摄像头、安防摄像头(网线连接),均连接成功且通过Deepstream测试。其中安防摄像头直连失败,可通过内网交换机连接。
赠送板载摄像头,通过引脚安装比较麻烦,请勿拆卸。
1 2 3 4 5 |
板载摄像头测试命令 nvgstcapture-1.0 usb摄像头测试命令 cheese |
1.3 远程连接
远程桌面通过nomachine或vnc连接(需要dp接口接入显示器才可使用),但是北京内网网速慢导致分辨率、稳定性效果不好,建议显示器直连。
1 2 3 |
# vnc启动,亚博提供了vnc教程 /usr/lib/vino/vino-server |
另外,可通过ssh连接,ifconfig查看内网ip后,使用账号密码登录,端口号默认22。
二. 软件
主板为亚博Sub版,出厂已安装相关深度学习框架,包括opencv、deepstream、pytorch、TensorRT、cuda、cudnn、jupyter lab等,文章开头的网址提供了很多应用示例,可直接运行。
请勿修改本机环境,因为后续需要购买多台部署,每台都修改环境会比较麻烦,尽量在现有环境下部署。
常用命令
1 2 3 4 5 |
# 查看deepstream cuda cudnn等版本 deepstream-app --version-all # 查看硬件资源占用,jetson自带命令,jtson中cpu与gpu共用内存 jtop |
2.1 Deepstream
Deepstream是一个基于 GStreamer 的完整流分析工具包,支持完整的视频流编解码、分析、推理流程,只需要通过配置文件配置或者python\c++的api配置。
开发文档找到6.2版本https://docs.nvidia.com/metropolis/index.html
https://docs.nvidia.com/metropolis/deepstream/6.2/dev-guide/index.html
C++ api(6.2版本)
https://docs.nvidia.com/metropolis/deepstream-nvaie31/sdk-api/index.html
Python api(6.2版本)
https://docs.nvidia.com/metropolis/deepstream-nvaie31/python-api/index.html
可以通过英伟达在线研讨会了解下deepstream:
https://www.nvidia.cn/webinars/sessions/?session_id=220715-24020-3
bilibili介绍视频:
https://www.bilibili.com/video/BV1p5411J7f2/?spm_id_from=333.337.search-card.all.click&vd_source=a4b42da3a54c7fbb87c2f9755d8c63ea
youtube优化方法:
https://www.youtube.com/watch?v=Or8vfydL69s
官方文档https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_Quickstart.html
作为初学者,建议先学习配置文件设置,然后通过配置文件,直接运行deepstream。
1 2 |
deepstream-app -c config.txt |
2.2 deepstream-yolo
网上有各种现成的配置文件示例,deepstream源码中也有一些。因为我们用来部署yolo模型,可以直接使用deepstream-yolo这个代码库中的配置文件。单路测试识别框上显示标签,多路测试不显示,可能需要修改源码。
https://github.com/marcoslucianops/DeepStream-Yolo
通过亚博给出的教程23可以直接跑通,可以先熟悉一下。但是jetson自带的deepstream-yolo(cd ~/DeepStream-Yolo目录)比较老,可以下载最新的库(cd ~/inspur/helmet/DeepStream-Yolo)。下面为一些示例,建议测试前先把两个目录下的文件备份至本地。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# ~/DeepStream-Yolo/ # 板载摄像头,yolov5,前端展示 deepstream-app -c deepstream_app_config.txt # usb摄像头,yolov5,前端展示 deepstream-app -c deepstream_app_config_usb_copy.txt # rtsp视频流解码安防摄像头,yolov5,前端展示 deepstream-app -c deepstream_app_config_rtsp.txt # rtsp视频流解码安防摄像头,yolov5,fp16,编码rtsp视频流,4路,rtsp://192.168.1.89:8555/ds-test deepstream-app -c deepstream_app_config_rtsp_to_rtsp4.txt # 本地文件,yolov5,fp16,编码rtsp视频流,4路,rtsp://192.168.1.89:8555/ds-test deepstream-app -c deepstream_app_config_mp4_to_rtsp4.txt # (test5需配置kafka)rtsp视频流解码安防摄像头,yolov5,fp16,编码rtsp视频流,4路,rtsp://192.168.1.89:8554/ds-test,kafka deepstream-test5-app -c deepstream_app_config_rtsp_to_rtsp4_kafka.txt # 能跑通但是接收不到消息 # rtsp安防摄像头加板载摄像头输入,多次启动板载摄像头可能会出现读取错误,需要重启机器 deepstream-app -c deepstream_app_config_rtsp_usb_to_rtsp4_sink4.txt # 多个sink输出可以跑通,而且每一路都显示标签了,需要关闭[tiled-display] # https://forums.developer.nvidia.com/t/pipeline-to-send-multiple-sources-to-multiple-sinks/83537 deepstream-app -c deepstream_app_config_rtsp_to_rtsp4_sink4.txt # ~/inspur/helmet/DeepStream-Yolo # rtsp视频流解码安防摄像头,yolov8,fp16,编码rtsp视频流,4路,rtsp://192.168.1.89:9554/ds-test deepstream-app -c deepstream_app_config_rtsp_to_rtsp4.txt # yolov8 fp16 平均每秒23帧左右 |
yolov8参考教程:https://github.com/marcoslucianops/DeepStream-Yolo/blob/master/docs/YOLOv8.md
整个模型搭建部署流程为:
- 标注
- 训练
- pt转onnx
pt转onnx需要安装以下几个包,但是jetson安装onnxsim失败,所以这一步建议在自己电脑上操作。
1 2 |
pip install ultralytics onnx onnxsim onnxruntime |
环境安装完成后,将DeepStream-Yolo/utils
里的export_yoloV8.py
拷贝到 ultralytics
目录下。(yolov5同理,export_yoloV5.py
拷贝到yolov5目录下)
1 2 3 |
# ultralytics目录下,转onnx python export_yoloV8.py -w yolov8s.pt --dynamic |
- 通过sftp传输将onnx拷贝至jetson上deepstream-yolo目录下
- 修改deepstream配置文件
- 运行deepstream
- vlc测试视频流
1-4步在自己主机上操作,5-6步在jetson操作。
其中,第5步展开说,deepstream配置文件有三个,主配置文件deepstream_app_config.txt,配置deepstream整个处理流程,模型配置文件config_infer_primary_yoloV8.txt,配置模型;标签配置文件labels.txt。
主配置文件deepstream_app_config.txt,参考链接
https://blog.csdn.net/u013963960/article/details/129032242
https://blog.csdn.net/Yan_uuu/article/details/127389866
https://blog.csdn.net/weixin_38369492/article/details/104859567
模型配置文件config_infer_primary_yoloV8.txt,主要修改以下几行,重新生成TensorRT可以先删除engine,初次启动生成时间大概十分钟。
暂时无法在飞书文档外展示此内容
1 2 3 4 5 |
onnx-file=best.onnx model-engine-file=model_b1_gpu0_fp32.engine # 对应network-mode修改文件名,否则每次启动都生成engine浪费时间 labelfile-path=labels.txt network-mode=0 # 0对应fp32 1对应int8 2对应fp16 |
暂时无法在飞书文档外展示此内容
标签配置文件labels.txt按训练标签配置即可。
暂时无法在飞书文档外展示此内容
2.3 deepstream发送rtsp视频流
根据deepstream流程,sink组件支持多种输出,包括保存文件,前端展示,rtsp输出,消息队列,这里讲rtsp,设置type=4,其中enc-type是编码形式,该主机不支持硬件编码,所以设置为1。多个输出,可以配置多个sink,设置不同端口。Bitrate是编码比特率,设置跟输入相近。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
[sink0] enable=1 #Type - 1=FakeSink 2=EglSink 3=File 4=UDPSink 5=nvoverlaysink 6=MsgConvBroker type=4 codec=1 #encoder type 0=Hardware 1=Software enc-type=1 sync=0 bitrate=2000000 profile=0 rtsp-port=8554 udp-port=5400 [sink1] enable=1 #Type - 1=FakeSink 2=EglSink 3=File 4=UDPSink 5=nvoverlaysink 6=MsgConvBroker type=4 codec=1 #encoder type 0=Hardware 1=Software enc-type=1 sync=0 bitrate=2000000 profile=0 rtsp-port=8555 udp-port=5401 |
注意,Jetson Orin Nano不支持硬件编码https://forums.developer.nvidia.com/t/gstreamer-h-264-rtsp/273652
接收端通过vlc或者代码接收,地址为rtsp://192.168.1.89:8554/ds-test
2.4 deepstream-test5-app
sink组件中的type=6是服务器收发消息组件,仅在deepstream-test5 app中支持:
https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_ref_app_test5.html
deepstream安装目录有test5的示例:/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test5/configs
但是通过deepstream-test5-app直接启动app,kafka未接收到消息,看来还需要通过python或c++定制api,见2.5-2.7
官方文档
https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_ref_app_test5.html
通过编译deepstream-test5,可以成功发送消息
2.5 kafka
deepstream-test5将消息发送至kafka
https://blog.csdn.net/y393016244/article/details/126405864
https://kafka.apache.org/quickstart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# 创建一个网络 docker network create app-tier --driver bridge # 安装启动zookeeper docker run -d --name zookeeper-server \ --network app-tier \ -e ALLOW_ANONYMOUS_LOGIN=yes \ bitnami/zookeeper:latest # 安装启动kafka docker run -d --name kafka-server \ --network app-tier \ -p 9092:9092 \ -e ALLOW_PLAINTEXT_LISTENER=yes \ -e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-server:2181 \ -e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.89:9092 \ bitnami/kafka:latest # kafka-manager(不好用) #docker run --name kafka-manager -d \ # --network app-tier \ # -p 9000:9000 \ # -e ZK_HOSTS="zookeeper-server:2181" \ # sheepkiller/kafka-manager # 网页端(网页端可以查看)192.168.1.89:9001 docker run -d --name kafka-map \ --network app-tier \ -p 9001:8080 \ -v /opt/kafka-map/data:/usr/local/kafka-map/data \ -e DEFAULT_USERNAME=admin \ -e DEFAULT_PASSWORD=admin \ --restart always dushixiang/kafka-map:latest # 查看三个容器是否启动 docker ps # 查看日志 docker logs -f kafka-server # 进入容器 docker exec -it kafka-server /bin/bash cd /opt/bitnami/kafka # 创建topic bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092 # 查看 bin/kafka-topics.sh --describe --topic quickstart-events --bootstrap-server localhost:9092 # 生产 bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server localhost:9092 # 消费 bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server localhost:9092 |
2.6 deepstream-occupancy-analytics
官方给出的示例,写到了kafka,可以借鉴kafka的用法和电子围栏的用法:
https://github.com/NVIDIA-AI-IOT/deepstream-occupancy-analytics
将 repo 克隆到 $DS_SDK_ROOT/sources/apps/sample_apps/ (已完成,deepstream根目录需要sudo权限,先拷贝到其他目录后sudo cp至deepstream根目录)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# deepstream根目录必须root用户 sudo -s export CUDA_VER=11.4 cd deepstream-occupancy-analytics make # 目录/opt/nvidia/deepstream/deepstream-6.2/sources/apps/sample_apps/deepstream-occupancy-analytics cd /opt/nvidia/deepstream/deepstream-6.2/sources/apps/sample_apps/deepstream-occupancy-analytics # 配置文件中改行注释放开 msg-conv-msg2p-lib=/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-occupancy-analytics/bin/jetson/libnvds_msgconv.so # 启动app 桌面端终端窗口启动成功,ssh连接启动失败 sudo ./deepstream-test5-analytics -c config/dstest_occupancy_analytics.txt # 或者使用推流的配置 sudo ./deepstream-test5-analytics -c config/dstest_occupancy_analytics_rtsp_to_rtsp.txt # 消费kafka信息 任意内网电脑,使用python脚本消费 from kafka import KafkaConsumer from json import loads import uuid consumer = KafkaConsumer( 'quickstart-events', bootstrap_servers='192.168.1.89:9092', auto_offset_reset='latest', #from latest enable_auto_commit=True, group_id=str(uuid.uuid1()), value_deserializer=lambda x: loads(x.decode('utf-8')) ) # do a dummy poll to retrieve some message consumer.poll() # go to end of the stream consumer.seek_to_end() for event in consumer: event_data = event.value print(event_data) |
可以对比官方给出的示例进行修改:
/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test5
https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_C_Sample_Apps.html
另外python版本可以参考
https://github.com/bug-developer021/deepstream_python_nvdsanalytics_to_kafka
2.7 deepstream-python
https://github.com/NVIDIA-AI-IOT/deepstream_python_apps
https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_Python_Sample_Apps.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# 源码拷贝至deepsteam根目录 sudo -s cd /opt/nvidia/deepstream/deepstream/sources/ git clone https://github.com/NVIDIA-AI-IOT/deepstream_python_apps.git # 切换到deepstream6.2版本 git tags git checkout v1.1.6 # 配置pybind11,参考https://github.com/NVIDIA-AI-IOT/deepstream_python_apps/tree/v1.1.6/bindings # 基本依赖 apt install python3-gi python3-dev python3-gst-1.0 python-gi-dev git python-dev \ python3 python3-pip python3.8-dev cmake g++ build-essential libglib2.0-dev \ libglib2.0-dev-bin libgstreamer1.0-dev libtool m4 autoconf automake libgirepository1.0-dev libcairo2-dev # 该存储库使用 gst-python 和 pybind11 子模块。要初始化它们,请运行以下命令 cd /opt/nvidia/deepstream/deepstream/sources/deepstream_python_apps/ git submodule update --init # 安装Gst-python # 更新证书 apt-get install -y apt-transport-https ca-certificates -y update-ca-certificates # 构建并安装 gst-python: cd 3rdparty/gst-python/ ./autogen.sh make sudo make install # 编译绑定 cd deepstream_python_apps/bindings mkdir build cd build cmake .. -DPYTHON_MAJOR_VERSION=3 -DPYTHON_MINOR_VERSION=8 \ -DPIP_PLATFORM=linux_aarch64 -DDS_PATH=/opt/nvidia/deepstream/deepstream/ make # 安装绑定 pip install ./pyds-1.1.6-py3-none*.whl |
仍然通过官方给出的app进行测试(ssh连接不行,需要桌面终端操作):
1 2 3 4 |
# https://github.com/NVIDIA-AI-IOT/deepstream_python_apps/tree/v1.1.6/apps/deepstream-nvdsanalytics cd /opt/nvidia/deepstream/deepstream/sources/deepstream_python_apps/apps/deepstream-nvdsanalytics python deepstream_nvdsanalytics.py file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4 |
下面这个示例提到了Jetson Orin Nano,可以用这个示例测试编码功能,但是由于Jetson Orin Nano不支持硬件编码,直接运行会报错,需要修改python文件
https://github.com/NVIDIA-AI-IOT/deepstream_python_apps/tree/v1.1.6/apps/deepstream-test1-rtsp-out
通过文档
https://github.com/NVIDIA-AI-IOT/deepstream_python_apps/tree/v1.1.6/apps/deepstream-preprocess-test
安装了下面两个包,但仍然不支持硬件编码
sudo apt-get install libgstrtspserver-1.0-0 gstreamer1.0-rtsp
2.8 window配置kafka
安装java环境,下载x64 Installer(exe版本)直接安装
https://www.oracle.com/java/technologies/downloads/#jdk22-windows
下载kafka压缩包(跟linux一样,版本 kafka_2.12-3.7.0.tgz)https://kafka.apache.org/downloads
kafka解压缩在D盘,不能放在太深的目录,否则会报错(https://blog.csdn.net/caoxuecheng001/article/details/102948941)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 修改config目录下配置文件(https://www.cnblogs.com/asd14828/p/13529487.html) # 修改server.properties,ip需要配置,否则deepstream连接不上 listeners = PLAINTEXT://192.168.0.101:9092 advertised.listeners=PLAINTEXT://192.168.0.101:9092 log.dirs=D:/kafka_2.12-3.7.0/kafka-logs # 修改zookeeper.properties dataDir=D:/kafka_2.12-3.7.0/zookeeper # 进入命令目录 cd kafka_2.12-3.7.0\bin\windows # bin/windows目录下打开cmd,启动zoopkeeper,使用cmd启动,powershell不行 zookeeper-server-start.bat ..\..\config\zookeeper.properties # 再打开一个cmd,启动kafka kafka-server-start.bat ..\..\config\server.properties |