使用NVIDIA Jetson和OpenDataCam探索计算机视觉和物联网分析

2020-09-08 23:28:24

计算机视觉是一个发展非常迅速的领域,最近的发展使人们有可能迅速开始几乎没有任何经验的实验。在这篇文章中,我们将向你展示如何使用价值99美元的Nvidia Jetson Nano Developers Kit,运行OpenDataCam,建立一个实用的计算机视觉分析系统。有了OpenDataCam,我们可以识别、跟踪和统计USB网络摄像头馈送的人和各种车辆的数量。我们将把收集到的数据发送到InfluxDB进行可视化和分析,并设置Jetson Nano,以便使用蜂窝调制解调器和全息SIM进行远程操作和管理。

下面的视频显示了我在加油站外进行的现场测试的录音,计算了不同方向行驶的车辆和行人的数量。

NVIDIA Jetson Nano是一款功能强大的小型单板计算机,配有GPU,用于运行神经网络来执行图像分类、物体检测或语音处理等工作。它的大小和低成本意味着它是零售分析或各种工业用途等边缘计算应用的完美选择。与蜂窝调制解调器和USB网络摄像头相结合,它允许快速轻松地进行远程部署,唯一的现场要求就是电源。

Jetson Nano并不缺乏文档和在线资源,NVIDIA确实在努力让几乎所有人都能接触到机器学习。可以在10行python代码中运行一个基本的对象演示。

将图像从您的计算机刷新到SD卡。在Windows PC上,我更喜欢BalenaEtcher。如果您以前没有这样做过,NVIDIA网站上有完整的说明。

如果您正在使用桶式插座电源,请将跳线放在J48引脚上,就在桶式插座的后面。这将停用作为电源的微型USB端口。

Jetson现在应该会启动,并指导您完成系统和网络配置,并设置登录凭据。在User Setup(用户设置)页面上,选择“Log in Automatic”(自动登录),允许所有服务在没有用户干预的情况下启动。

完成后,您应该会看到桌面。打开终端窗口并执行以下操作:

对于部署来说,蜂窝连接确实很方便,但是对于测试和初始设置,以太网或WiFi连接设置起来更快。如果您使用Wi-Fi适配器进行测试,请禁用Wi-Fi电源管理以提高连接稳定性。

在继续之前重新启动Jetson。从这一点开始的任何命令行操作都可以使用键盘、鼠标和显示器直接在Nano上完成,也可以从同一网络上的任何计算机使用SSH。

现在你有了一台正在运行的Nano,是时候开始使用计算机视觉软件了。

OpenDataCam是一个用于计算机视觉分析的开源工具,它可以跟踪和计数几乎任何视频馈送中的对象。它可能是我见过的用于此目的的最容易使用和设置的工具。它是根据许可的麻省理工学院许可证获得许可的,这允许在商业产品中使用。

NVIDIA OpenDataCam在‍平台上运行,需要访问NVIDIA用于在GPU上运行并行处理任务的工具CUDA。首先,我们需要通过编辑.bashrc文件来确保在Nano上的路径中定义了CUDA。

将以下两行添加到文件的末尾,然后保存并关闭它。

将Jetson的交换分区大小增加到6 GB,以提高性能和可靠性。

安装OpenDataCam。在此过程中将要求您输入sudo密码,这可能需要一段时间。

安装完成后,从Jetson打开Chromium并转到localhost:1880,或从同一网络上的任何计算机转到*JetsonIP*:1880。一旦OpenDataCam启动,您将看到以下视频提要。它是OpenDataCam中包含的演示文件,演示了其对象检测功能。在针对我们的特定用例更改视频提要之前,我们将以此为例熟悉该界面。

点击左上角的“探路者”按钮,你将看到每辆车在被识别和跟踪时生成的“轨迹”。

若要清点车辆,请点击“计数器”按钮,增加清点行,如下图所示。这些线充当检查点,对经过它们的对象进行计数。在下面的示例中,我添加了用于迎面、离开和横穿交通的线。您还可以通过单击线中心的箭头来切换要计数的对象的移动方向。要开始计数,请单击“开始录制”按钮。

为了提高计数器的可靠性,重要的是将它们放置在检测置信度较高的区域。通过单击右上角的汉堡菜单,您可以激活跟踪器精度热图,它将突出显示检测置信度级别最低的区域。

这意味着在放置计数线时应避免这些区域。将相机移动到不同的视角,甚至使用转移学习改进检测模型也可能是一个好主意。

如果您有一个要测试的示例视频文件,只需将其拖放到OpenDataCam窗口中,它就会开始播放新文件。

要使用网络摄像头或IP摄像头流,您需要编辑~/opendatacam/中的config.json文件以指定所需的视频源。OpenDataCam Github页面上提供了完整的详细信息,包括您可以更改的所有其他设置。现在我将坚持使用演示文件,同时我们将项目的所有不同部分链接在一起,我将在文章末尾描述我为部署所做的最终设置。

我想以设定的间隔收集交通数据,并将其存储以供分析。InfluxDB是专门为时间序列数据构建的数据库解决方案,这正是我们从OpenDataCam获得的。它还有一些内置的可视化工具。您可以在Jetson上本地安装和运行InfluxDB,但在生产环境中,我们可能有多个数据源,因此将其发送到云进行分析更有意义。

OpenDataCam为与其交互和提取数据提供了一个简单但有效的API,但是我们需要创建一个简单的应用程序来完成这项工作。我将为Node.js使用Node-red、基于流的GUI包装器,它还允许我们一目了然地看到数据是如何通过应用程序流动的,并快速进行更改。

上面的屏幕截图让您很好地了解了流是如何工作的。首先,它检查OpenDataCam(ODC)的状态,如果它还没有运行,就启动它,如果没有活动的记录,它就启动一个。如果录制正在运行,它会检索该录制,然后停止该录制,并立即开始新的录制。检索来自已完成录制的数据,并将其发送到InfluxDB。

此过程以蓝色时间戳注入节点中设置的间隔重复。深绿色节点提供用于调试目的的输出。

通过从Jetson转到localhost:1880,或从同一网络上的任何计算机转到*JetsonIP*:1880,打开Node-red UI。

要导入流,请单击右上角的菜单图标,然后选择Import。

从该GitHub存储库复制流代码,将其粘贴到导入窗口中,然后单击Import。该流现在将显示在节点红色编辑器中。在部署它之前,我们需要设置InfluxDB以接收数据,并获取其身份验证详细信息。

现在我们需要设置一个InfluxDB实例来接收数据。首先进入InfluxDB云页面,注册免费账号,在您选择的云平台上创建一个实例。我用的是AWS。

创建实例并登录后,进入数据页的Buckets选项卡,单击创建Bucket,为您的新Bucket命名。

创建了存储桶之后,我们需要获取Node-red将用来向其写入数据的身份验证数据。转到“数据令牌”页面。单击生成并选择读/写令牌。选择您为读写创建的存储桶,并为令牌指定名称。

我们还需要InfluxDB实例的URL,该URL可以在Data&>Client Libraries选项卡下找到。

现在我们可以在Node-red上配置InfluxDB节点。转到您在上一节中导入的Node-red流,打开InfluxDB Write节点,然后单击铅笔图标配置数据库服务器详细信息。

一旦配置了节点,您就可以通过单击右上角的Deploy来部署Node-red流。这将导致它开始向InfluxDB发送数据,您可以通过检查Node-red的调试消息中的错误来确认这一点。

返回到InfluxDB并打开Explore页面。在页面底部的查询构建器中,在From块中选择您的存储桶,选择View Raw Data并单击Submit。如果数据已成功写入,您应该会看到一个表,其中包含我们收集的计数和其他元数据。我们将使用这些元数据值来过滤数据并创建图表。如果您想了解有关如何在InfluxDB中组织数据的更多信息,请查看文档。

现在转到InfluxDB的Boards页面,单击Create Dashboard,然后从下拉菜单中选择New Dashboard。这将创建仪表板,您现在应该在窗口顶部为其命名。单击其正下方的Add Cell以创建您的第一个图形,我们现在必须为其创建一个查询。在窗口底部的查询窗口中,如下所示设置查询。

这将在图形中添加第一行,显示视频提要中穿过十字路口的所有流量的计数。通过单击查询构建器上方的加号图标创建一个新查询,并执行完全相同的操作,只是选择其他areaNames之一。对剩余的areaName也执行相同的操作。

这应该会给您一个类似这样的图表,每条线代表另一个计数区域。

您可以通过多种方式显示和筛选数据,只需在查询生成器中选择不同的选项即可。

管理远程设备可能真的是一件痛苦的事,为了解决这个问题,我们将使用Remote.it,这是一项用于快速轻松地设置对Nano的安全远程访问的服务。转到Remote.it网站并创建一个免费帐户。

这将引导您在Remote.it上注册设备,然后配置指向我们需要的应用程序的远程链接。

配置完成后,您可以从RemoteIt获取设备上每个应用程序的连接详细信息,这样我们就可以从任何地方连接SSH、OpenDatacam和Node-red。您可以从Remote.it网站执行此操作,也可以下载桌面应用程序。

遗憾的是,完整的OpenDataCam配置页面(端口8080)不能通过Remote.it链接工作,因此初始配置必须通过WiFi或有线连接完成。

我们将使用全息SIM来提供蜂窝连接,而无需担心运营商覆盖或部署时的Wi-Fi连接。将带SIM卡的4G转换器插入Nano上的一个USB端口。

重新启动Jetson Nano,然后运行以下命令检查是否检测到调制解调器。

我必须遵循一些额外的步骤来让Jetson检测我使用的D-Link DWM-222,这在项目的GitHub页面上有描述。如果您在使用另一个调制解调器时遇到问题,您可能会发现我采取的步骤也很有帮助。

该连接现在可以使用,并将在将来插入调制解调器时自动连接。要测试连接,请卸下WiFi调制解调器,并检查您是否仍然可以使用Remote.it访问Node-red、OpenDataCam和SSH。

为了进行实地测试,我在当地的一个加油站部署了带有USB网络摄像头的Jetson Nano,以统计过往的流量,如帖子顶部录制的视频所示。对于设置,我仍然喜欢使用WiFi,但在我的笔记本电脑或Jetson上创建了一个热点,但允许通过LTE调制解调器发送数据。

带有长电缆的小型USB网络摄像头便于部署。你不需要高清视频源就能获得好的效果,因为高分辨率的视频源会降低OpenDataCam的运行帧率。我用的是800x600分辨率,640x480也可以。有关我的特定相机设置的更多详细信息,请查看GitHub项目页面。

下面的屏幕截图显示OpenDataCam同时检测车辆和行人。可能降低计数精度的因素包括密集交通中的部分遮挡物体、计数线的次优位置、距离较远的物体和较差的照明。花时间优化相机设置,您将获得准确的结果。

在Jetson Nano上使用OpenDataCam是对行人和车辆进行计数的一种极具成本效益的解决方案。请务必查看OpenDataCam文档以了解所有可能的功能。它非常适合商店的零售分析,也适用于行人和车辆交通监控,以评估营销选项。