[译] 如何通过深度学习轻松实现自动化监控?

SurreyAdonis 发布于1年前
0 条问题

[译] 如何通过深度学习轻松实现自动化监控?

作者 | Bharath Raj

译者 | 孤鸿

编辑 | Jane

出品 | AI 科技大本营( rgznai100  )

【导读】这是一篇关于使用基于深度学习的目标检测来实现监控系统的快速教程。在教程中通过使用 GPU 多处理器来比较不同目标检测模型在行人检测上的性能。

监控是安保和巡逻的一个组成部分,大多数情况下,这项工作都是在长时间去观察发现那些我们不愿意发生的事情。然而突发事件发生的低概率性无法掩盖监控这一平凡工作的重要性,这个工作甚至是至关重要的。

如果有能够代替我们去做“等待和监视”突发事件的工具那就再好不过了。幸运的是,这些年随着技术的进步,我们已经可以编写一些脚本来自动执行监控这一项任务。在深入探究之前,需要我们先考虑两个问题。

机器是否已经达到人类的水平?

任何熟悉深度学习的人都知道图像分类器的准确度已经赶超人类。图1显示了近几年来对于人类、传统计算机视觉 (CV) 和深度学习在 ImageNet 数据集上的分类错误率。

 [译] 如何通过深度学习轻松实现自动化监控? 

图 1 人类、深度学习和 CV 在 ImageNet 上分类错误率

与人类相比,机器可以更好地监视目标,使用机器进行监视效率更高,其优点可总结如下:

  • 重复的任务会导致人类注意力的下降,而使用机器进行监视时并无这一烦恼,我们可以把更多的精力放在处理出现的突发事件上面。

  • 当要监视的范围较大时,需要大量的人员,固定相机的视野也很有限。但是通过移动监控机器人 (如微型无人机) 就能解决这一问题。

此外,同样的技术可用于各种不受限于安全性的应用程序,如婴儿监视器或自动化产品交付。

那 我们该如何实现自动化?

在我们讨论复杂的理论之前,先让我们看一下监控的正常运作方式。 我们在观看即时影像时,如果发现异常就采会取行动。因此我们的技术也应该通过仔细阅读视频的每一帧来发现异常的事物,并判断这一过程是否需要报警。

大家 可能已经知道了,这个过程实现的本质是通过目标检测定位,它与分类不同,我们需要知道目标的确切位置,而且在单个图像中可能有多个目标。为了更好的区分我们举了一个简单形象的例子如图2所示。

[译] 如何通过深度学习轻松实现自动化监控? 

图2 分类、定位、检测和分割的示例图

为了找到确切的位置,我们的算法应该检查图像的每个部分,以找到某类的存在。自2014年以来,深度学习的持续迭代研究引入了精心设计的神经网络,它能够实时检测目标。图3显示了近两年R-CNN、Fast R-CNN 和 Faster R-CNN 三种模型的检测性能。

 [译] 如何通过深度学习轻松实现自动化监控? 

图3 R-CNN、Fast R-CNN 和 Faster R-CNN 性能

这里有几种在内部使用的不同方法来执行相同任务的深度学习框架。 其中最流行的是 Faster-RCNN、YOLO 和 SSD 。图4展示了 Faster R-CNN、R-FCN 和 SSD 的检测性能。

 [译] 如何通过深度学习轻松实现自动化监控? 

图4 Faster R-CNN、R-FCN 和 SSD 的检测性能,速度与准确性的权衡,更高的 mpA 和更低的 GPU 时间是最佳的。

每个模型都依赖于基础分类器,这极大影响了最终的准确性和模型大小。此外,目标检测器的选择会严重影响计算复杂性和最终精度。 在选择目标检测算法时,速度、精度和模型大小的权衡关系始终存在着。

在有了上面的学习了解后,接下来我们将学习如何使用目标检测构建一个简单而有效的监控系统。

我们先从由监视任务的性质而引起的限制约束开始讨论起。

深度学习在监控中的限制

在实现自动化监控之前,我们需要考虑以下几个因素:

1.即时影像

为了在大范围内进行观察,我们可能需要多个摄像头。而且,这些摄像头需要有可用来存储数据的地方 (本地或远程位置)。图5为典型的监控摄像头。

 [译] 如何通过深度学习轻松实现自动化监控? 

图5 典型的监控摄像头

高质量的视频比低质量的视频要占更多的内存。此外,RGB 输入流比 BW 输入流大3倍。由于我们只能存储有限数量的输入流,故通常情况下我们会选择降低质量来保证最大化存储。

因此,可推广的监控系统应该能够解析低质量的图像。同时我们的深度学习算法也必须在低质量的图像上进行训练。

2.处理能力

在哪里处理从相机源获得的数据是另一个大问题。通常有两种方法可以解决这一问题。

集中式服务器处理

来自摄像机的视频流在远程服务器或集群上逐帧处理。这种方法很强大,使我们能够从高精度的复杂模型中获益。但这种方法的缺点是有延迟。此外,如果不用商业 API,则服务器的设置和维护成本会很高。图6显示了三种模型随着推理时间的增长内存的消耗情况。

 [译] 如何通过深度学习轻松实现自动化监控? 

图6 内存消耗与推理时间(毫秒),大多数高性能模型都会占用大量内存

分散式边缘处理

通过附加一个微控制器来对相机本身进行实时处理。优点在于没有传输延迟,发现异常时还能更快地进行反馈,不会受到 WiFi 或蓝牙的限制 (如 microdrones)。缺点是微控制器没有 GPU 那么强大,因此只能使用精度较低的模型。使用板载 GPU 可以避免这一问题,但是太过于昂贵。图 7 展示了目标检测器 FPS 的性能。

 [译] 如何通过深度学习轻松实现自动化监控? 

图 7 各类目标检测器 FPS 的性能

训练监控系统

在接下来的内容里我们将会尝试如何使用目标检测进行行人识别。使用 TensorFlow 目标检测 API 来创建目标检测模块,我们还会简要的阐述如何设置 API 并训练它来执行监控任务。整个过程可归纳为三个阶段 (流程图如图8所示):

  • 数据准备

  • 训练模型

  • 推论

 [译] 如何通过深度学习轻松实现自动化监控? 

图8 目标检测模型的训练工作流程

第1阶段:数据准备

第一步:获取数据集

监控录像是获取最准确数据集的来源。但是,在大多数情况下,想要获取这样的监控录像并不容易。因此,我们需要训练我们的目标检测器使其能从普通图像中识别出目标。

 [译] 如何通过深度学习轻松实现自动化监控? 

图9 从数据集中提取出带标注的图像

正如前面所说,我们的图像质量可能较差,所以所训练的模型必须适应在这样的图像质量下进行工作。我们对数据集中的图像 (如图9所示) 添加一些噪声或者尝试模糊和腐蚀的手段,来降低数据集中的图片质量。

在目标检测任务中,我们使用了 TownCentre 数据集。使用视频的前3600帧进行训练,剩下的900帧用于测试。

第二步:图像标注

使用像 LabelImg 这样的工具进行标注,这项工作虽然乏味但也同样很重要。我们将标注完的图像保存为 XML 文件。

第三步:克隆存储库

运行以下命令以安装需求文件,编译一些 Protobuf 库并设置路径变量



pip install -r requirements.txt
sudo apt-get install protobuf-compiler
protoc object_detection/protos/*.proto --python_out=.
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim



第四步:准备所需的输入

首先,我们需要给每个目标一个标签,并将文件中每个标签表示为如下所示的 label_map.pbtxt

item {
 id: 1
 name: ‘target’
}



接下来,创建一个包含 XML 和图像文件名称的文本文件。例如,如果数据集中有 img1.jpg, img2.jpg, 和 img1.xml, img2.xml ,则 tr