NVIDIA 的 DeepStream 是目前业界最好开发而且功能强大的 AI 视频分析工具,在 NGC 上 https://catalog.ngc.nvidia.com/orgs/nvidia/containers/deepstream-l4t 为 Jetson 提供 4 个可使用的版本,分别如下:
Base 版(deepstream-l4t:6.1-base):作为 DeepStream SDK 一部分的插件、库以及依赖项,如 CUDA、TensorRT、GStreamer 等,希望为自己创建 Docker 版的 DeepStream 应用程序用户,建议使用此映像。请注意,这个镜像不包含示例内容。
Samples 版(deepstream-l4t:6.1-samples):在 Base 版的基础上添加范例的内容,包括 C/C++ 开源代码、deepstream-app 范例配置文件、模型文件与测试视频等,适合体验与学习用途的初学者使用。
IoT 版(deepstream-l4t:6.1-iot):在 Base 版上扩充 IoT 应用所需的环境,包括 Kafka、Azure IoT、REDIS 和 MQTT 等协议、DeepStream test5 应用程序以及相关配置和模型,可启用多视频流应用程序,并将各种消息传递到服务器端进行统计分析。
Triton 部署版(deepstream-l4t:6.1-triton):这是配合 Triton 推理服务器使用的环境,开发者可以直接使用 TensorFlow、TensorFlow-TensorRT 与 ONNX-RT 等方式进行推理计算。
从上面的描述中可以看出 Samples 版本镜像适合绝大部分初学者的使用,现在就以这个镜像来做说明。
1、下载镜像:
这里使用 JetPack 5.0 版的 Jetson Orin 开发套件,可以使用 DeepStream-6.1 版的容器,可以从 https://catalog.ngc.nvidia.com/orgs/nvidia/containers/deepstream-l4t 网页右上角 “Pull Tag” 按钮中,选择 “6.1-samples” 选项,这时就已经将执行指令复制到缓冲区,然后粘贴在 Jetson 上的命令终端,指令内容如下:
docker pull nvcr.io/nvidia/deepstream-l4t:6.1-samples
这样就能从 NGC 服务器将 deepstream-l4t:6.1-samples 镜像文件下载到 Jetson 设备上。下载完毕之后,执行以下指令看看结果:
docker images
如下图 TAG 栏中显示 “6.1-samples” 就表示镜像文件下载成功。
到此只是将镜像文件下载到本地,但还不是可执行的容器状态,接着就要使用 Docker 指令来创建工作容器。
如果是使用 JetPack 4.6.x 版的其他 Jetson 设备时,目前只能使用 DeepStream-6.0.1 版本,请使用以下指令下载镜像文件到 Jetson 设备上:
docker pull nvcr.io/nvidia/deepstream-l4t:6.0.1-samples
2、创建临时容器的指令:
以下是 NVIDIA 官方所提供的创建容器指令,由于指令内容较长,建议写入 .sh 脚本中会比较方便执行:
# 允许外部应用程序连接到主机的X显示器:
xhost +
# 允许外部应用程序连接到主机的X显示器:
docker run -it --rm --net=host --runtime nvidia -e DISPLAY=$DISPLAY -w /opt/nvidia/deepstream/deepstream-6.1 -v /tmp/.X11-unix/:/tmp/.X11-unix nvcr.io/nvidia/deepstream-l4t:6.1-samples
以下对这段指令进行基本说明:
使用 “docker run” 组合指令来创建容器;
中间的参数可以用 “docker run --help” 查看,这里使用以下几个参数:
-it:启动互动式(-i)的终端(-t);
--rm:退出容器之后自动移除;
--net:让容器内网络使用指定网络,这里指定 “host” 表示共用 Jetson 设备网络;
--runtime:指定执行时的方式,这里指定为 “nvidia” 其实可以省略;
-e:配置环境变量,这里指定容器内 DISPLAY 变量为设备的 $DISPLAY 变量内容;
-w:指定容器内的工作目录,进入容器就会直接进入到这个工作目录下;
-v:将容器内的目录与容器外的目录形成映射;
镜像的完整路径(nvcr.io/nvidia/deepstream-l4t:6.1-samples),放在最后面。
这样的指令有个最大的缺点,就是每次启动都只能是个临时用途的容器,一旦退出之后就会删除工作容器,表示过程中所有执行修改与步骤都将付之一炬,因此这样指令适合做简单的测试用途,但并不适合作为开发阶段的使用,必须做些调整。
3、将源代码与范例复制到容器外:
在容器中的 DeepStream 源代码有两个部分:
Sources:在容器内 /opt/nvidia/deepstream/deepstream/sources 下
Samples:在容器内 /opt/nvidia/deepstream/deepstream/samples 下
我们先将这两个部分的内容复制到容器外,然后启动容器的时候再用 “-v” 进行路径映射,这样过程中修改的内容就会保存在容器外,即便退出后销毁容器也没关系。不过这个复制的过程必须在 “容器启动” 的状态下执行,可以先执行下面最简单的容器启动指令:
# 在第一个命令终端
docker run -it --rm nvcr.io/nvidia/deepstream-l4t:6.1-samples
现在进入容器之内,可能看到以下的显示信息:
root@1c03f4d7628a:/opt/nvidia/deepstream/deepstream-6.1#
“1c03f4d7628a” 是这个容器目前的编号,现在需要开启一个指令终端进行操作,这个过程是在容器外进行处理,请执行以下指令列出执行中的容器编号与状态:
# 在第二个命令终端
docker ps
下图显示目前有个正在执行的容器,其编号(CONTAINER ID)为 1c03f4d7628a,正好是上面看到容器内所显示的编号。
现在执行以下指令,将容器内的 sources 与 samples 目录内容,复制到容器外的指定路径之下,例如 ~/deepstream/sources 与 ~/deepstream/samples:
# 在第二个命令终端
mkdir -p ~/deepstream
export CONTAINER_ID=’根据实际编号’
docker cp $CONTAINER_ID:/opt/nvidia/deepstream/deepstream/sources ~/deepstream/sources
docker cp $CONTAINER_ID:/opt/nvidia/deepstream/deepstream/samples ~/deepstream/samples
现在看看在 Jetson 设备上 ~/deepstream 目录下是否多了 sources 与 samples 两个目录?比对一下里面的内容是否与容器内的一致。
接下来就可以调整一下执行的指令,让所有的代码与配置文件的修改部分,保留在容器外面,这样过程中的修改就不会白白浪费。请执行以下指令创建另一容器:
# 在第二个命令终端
sudo xhost +
docker run -it --rm --net=host --runtime nvidia -e DISPLAY=$DISPLAY
-w /opt/nvidia/deepstream/deepstream -v /tmp/.X11-unix/:/tmp/.X11-unix
-v ~/deepstream/sources:/opt/nvidia/deepstream/deepstream/sources
-v ~/deepstream/samples:/opt/nvidia/deepstream/deepstream/samples
nvcr.io/nvidia/deepstream-l4t:6.1-samples
现在再开启一个指令窗口,执行以下指令检查以下容器的状态:
# 在第三个命令终端
docker ps
应该会看到类似下面截屏中的两个 “执行中容器” 的信息:
在容器外试着在 ~/deepstream/sources 目录下添加个子目录:
# 在第三个命令终端
mkdir -p ~/deepstream/sources/outsideContainer
然后到第二个终端里执行以下指令,看看是否也多了 “outsideContainer” 目录?
# 在第二个命令终端
ls /opt/nvidia/deepstream/deepstream/sources
如果能对应的上,就表示后面在容器内修改的代码文件,都存放在容器外面的指定路径下,这样就不用担心每次退出容器之后的问题。
4、在容器内执行范例:
现在就在第二个终端里执行 DeepStream 的标准范例,请执行以下指令:
# 在第二个命令终端
cd /samples/configs/deepstream-app
deepstream-app -c source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt
就能看到下面这个大家相当熟悉的执行结果。
以上就完成 DeepStream Samples 版的操作环境调试过程,开发人员可以在容器外用编辑器去修改配置文件或 C/C++ 源代码,然后在容器内执行编译或操作,这样就会非常方便。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !