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++源代码,然后在容器内执行编译或操作,这样就会非常方便。
好文章,需要你的鼓励
北京大学研究团队开发出基于RRAM芯片的高精度模拟矩阵计算系统,通过将低精度模拟运算与迭代优化结合,突破了模拟计算的精度瓶颈。该系统在大规模MIMO通信测试中仅需2-3次迭代就达到数字处理器性能,吞吐量和能效分别提升10倍和3-5倍,为后摩尔时代计算架构提供了新方向。
普拉大学研究团队开发的BPMN助手系统利用大语言模型技术,通过创新的JSON中间表示方法,实现了自然语言到标准BPMN流程图的自动转换。该系统不仅在生成速度上比传统XML方法快一倍,在流程编辑成功率上也有显著提升,为降低业务流程建模的技术门槛提供了有效解决方案。
谷歌宣布已将约3万个生产软件包移植到Arm架构,计划全面转换以便在自研Axion芯片和x86处理器上运行工作负载。YouTube、Gmail和BigQuery等服务已在x86和Axion Arm CPU上运行。谷歌开发了名为CogniPort的AI工具协助迁移,成功率约30%。公司声称Axion服务器相比x86实例具有65%的性价比优势和60%的能效提升。
北京大学联合团队发布开源统一视频模型UniVid,首次实现AI同时理解和生成视频。该模型采用创新的温度模态对齐技术和金字塔反思机制,在权威测试中超越现有最佳系统,视频生成质量提升2.2%,问答准确率分别提升1.0%和3.3%。这项突破为视频AI应用开辟新前景。