NVIDIA的DeepStream是目前业界最好开发而且功能强大的AI视频分析工具,在NGC上(https://catalog.ngc.nvidia.com/orgs/nvidia/containers/deepstream-l4t)为Jetson提供4个可使用的版本,分别如下:
从上面的描述中可以看出Samples版本镜像适合绝大部分初学者的使用,现在就以这个镜像来做说明。
这里使用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 |
以下是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 |
以下对这段指令进行基本说明:
-it:启动互动式(-i)的终端(-t);
--rm:退出容器之后自动移除;
--net:让容器内网络使用指定网络,这里指定“host”表示共用Jetson设备网络;
--runtime:指定执行时的方式,这里指定为“nvidia”其实可以省略;
-e:配置环境变量,这里指定容器内DISPLAY变量为设备的$DISPLAY变量内容;
-w:指定容器内的工作目录,进入容器就会直接进入到这个工作目录下;
-v:将容器内的目录与容器外的目录形成映射;
这样的指令有个最大的缺点,就是每次启动都只能是个临时用途的容器,一旦退出之后就会删除工作容器,表示过程中所有执行修改与步骤都将付之一炬,因此这样指令适合做简单的测试用途,但并不适合作为开发阶段的使用,必须做些调整。
在容器中的DeepStream源代码有两个部分:
我们先将这两个部分的内容复制到容器外,然后启动容器的时候再用“-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 |
如果能对应的上,就表示后面在容器内修改的代码文件,都存放在容器外面的指定路径下,这样就不用担心每次退出容器之后的问题。
现在就在第二个终端里执行DeepStream的标准范例,请执行以下指令:
$ |
# 在第二个命令终端 cd /samples/configs/deepstream-app deepstream-app -c source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt |
就能看到下面这个大家相当熟悉的执行结果。
以上就完成DeepStream Samples版的操作环境调试过程,开发人员可以在容器外用编辑器去修改配置文件或C/C++源代码,然后在容器内执行编译或操作,这样就会非常方便。
好文章,需要你的鼓励
临近年底,苹果公布了2024年App Store热门应用和游戏榜单,Temu再次成为美国下载量最多的免费应用。
云基础设施市场现在已经非常庞大,很难再有大的变化。但是,因为人们可以轻松地关闭服务器、存储和网络——就像开启它们那样,预测全球云基础设施开支可能非常困难。