发布信息

基于深度学习的目标检测去搭建一个简单但有效的监控系统

作者:软荐小编      2024-02-17 15:09:46     163

机器之心合集

参演:卓慧媛、张谦

监控在安全检查中发挥着重要作用,但同时也是一项非常繁琐的工作。 深度学习的出现在一定程度上将人类从这项任务中解放出来。 本文介绍了如何使用基于深度学习的目标检测来构建简单但有效的监控系统,并比较了使用 GPU 多处理进行行人检测推理的不同目标检测模型的性能。

监控是安全和检查的一个组成部分。 大多数情况下,这份工作需要很长时间才能发现一些你意想不到的事情发生。 我们所做的事情很重要,但也是一项非常乏味的任务。

如果有什么东西可以替我们完成“守候”的工作,生活不是简单多了? 嗯,你很幸运。 随着过去几年技术的进步,我们可以编写脚本来自动执行上述任务,而且很容易做到。 但在我们深入探讨之前,我们先问自己:机器能像人类一样表现吗?

熟悉深度学习的人都知道,图像分类器已经达到了超越人类水平的准确性。

数字监控器_数字监控系统软件教程_监控教程数字软件系统有哪些

在 ImageNet 数据集上与人类相比,传统计算机视觉 (CV) 和深度学习的时变错误率。 (来源: )

机器可以按照与人类相同(或更好)的标准对物体进行监视。 所以使用技术来监控效率要高得多。

此外,同一技术除了安全之外还有多种应用,例如婴儿监视器或自动化产品交付。

伟大的! 但我们如何实现自动化呢?

在设计复杂的理论之前,让我们先考虑一下监视通常是如何运作的。 如果我们在观看视频时发现异常情况,我们会采取行动。 因此,从本质上讲,我们的技术应该仔细阅读视频的每一帧,以期发现异常情况。 这个过程听起来是不是很熟悉?

正如您可能已经猜到的,这就是使用目标检测和定位的本质。 它与分类略有不同,我们需要知道目标的确切位置。 此外,我们可能在一张图像中包含多个对象。

数字监控器_监控教程数字软件系统有哪些_数字监控系统软件教程

为了找到对象的确切位置,我们的算法应该检查图像的每个部分以查找某个类的存在。 这比听起来更难。 但自 2014 年以来,深度学习领域不断发展的研究引入了可以实时检测物体的复杂神经网络。

数字监控器_数字监控系统软件教程_监控教程数字软件系统有哪些

看看,短短两年时间,性能提升了这么多!

有几种深度学习架构在内部使用不同的方法来实现相同的任务。 最流行的变体是 Faster RCNN、YOLO 和 SSD 网络。

监控教程数字软件系统有哪些_数字监控器_数字监控系统软件教程

速度和准确性之间的权衡。 更高的 mAP 和更少的 GPU 运行时间是最佳选择。

每个模型都依赖于一个基分类器,这对最终的精度和模型大小有很大影响。 此外,目标检测器的选择极大地影响了计算复杂度和最终精度。

选择对象检测算法的过程通常是速度、准确性和模型大小之间的权衡。

在这篇博文中,我们将学习如何使用对象检测构建一个简单但有效的监控系统。 让我们首先讨论由于监控任务的性质而受到限制的约束。

深度学习在监控中的局限性

我们经常想要关注大片区域。 在实施自动化监控之前,我们需要考虑一些因素。

1. 视频输入

一般来说,为了监控大范围的区域,我们需要多个摄像机。 此外,这些相机需要在某处存储数据; 本地或某些远程存储中。

监控教程数字软件系统有哪些_数字监控器_数字监控系统软件教程

典型的监控摄像头。 (图片来自 Unsplash 上的 Scott Webb)

较高质量的视频比较低质量的视频会占用更多的内存。 此外,RGB 输入流比 BW 输入流大 3 倍。 由于我们只能存储有限数量的输入流,因此通常会降低质量以最大化存储。

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

2、处理能力

现在输入约束已经解决了,我们可以回答一个更大的问题了。 我们在哪里处理从摄像头获得的数据? 有两种方法可以做到这一点。

来自摄像机的视频流在远程服务器或集群上逐帧处理。 这种方法非常稳健,使我们能够以高精度利用复杂模型。 明显的问题是延迟; 因此您需要快速的网络连接来解决延迟问题。 另外,如果不使用商业API,服务器设置和维护的成本会很高。

数字监控器_数字监控系统软件教程_监控教程数字软件系统有哪些

内存消耗与 GPU 推理时间(毫秒)。 大多数高性能模型都会消耗大量内存。 (来源: )

通过连接小型微控制器,我们可以对相机进行实时推理。 这消除了传输延迟,并且可以比以前的方法更快地报告异常情况。 此外,它对于移动机器人来说是一个很好的补充,因此它们不再需要受到可用 WiFi/蓝牙范围的限制。 (例如微型无人机。)

数字监控系统软件教程_数字监控器_监控教程数字软件系统有哪些

不同物体检测器的 FPS 性能。 (来源:@jonathan_hui/object-detection-speed-and-accuracy-comparison-faster-r-cnn-r-fcn-ssd-and-yolo-5425656ae359)

缺点是微控制器不如 GPU 强大,因此您可能被迫使用精度较低的模型。 使用板载GPU可以避免这个问题,但成本很高。 一个有趣的解决方案是使用 TensorRT 这样的软件,它可以优化程序的推理过程。

培训监控系统

在本节中,我们将使用对象检测来研究如何识别行人。 我们将使用 TensorFlow 对象检测 API 来构建我们的模块。 我们将简要探讨如何设置 API 并训练它执行监控任务。 详细解释请参见另一篇博文()。

整个过程可以概括为3个阶段:

1. 数据准备

2. 训练模型

3. 推论

监控教程数字软件系统有哪些_数字监控系统软件教程_数字监控器

涉及训练对象检测模型的工作流程。

如果您想看到能够激励您尝试更多的结果,请向下滚动到第 3 阶段!

第一阶段:数据准备

步骤一:获取数据集

过去拍摄的监控录像可能是您可以获得的最准确的数据集。 然而,在大多数情况下,获取这样的监控录像往往很困难。 在这种情况下,我们可以训练我们自己的对象检测器来从正常图像中识别我们的对象。

数字监控系统软件教程_数字监控器_监控教程数字软件系统有哪些

从我们的数据集中提取带注释的图像。

如前所述,相机中的图像质量可能会较低。 因此,您必须训练您的模型以适应此类工作条件。 一个聪明的方法是使用数据增强,详细解释见这里 ()。 本质上,我们必须添加一些噪声来降低数据集中图像的质量。 我们还可以尝试模糊和侵蚀效果。

对于对象检测任务,我们将使用 TownCentre 数据集。 我们将使用视频的前 3600 帧进行训练和验证,其余 900 帧用于测试。 您可以使用我的 github 存储库中的脚本来提取数据集。 GitHub 存储库:.

第 2 步:注释数据集

您可以使用LabelImg等工具进行注释。 这是一项乏味的任务,但同样重要。 注释存储为 XML 文件。

幸运的是,TownCentre 数据集的所有者提供了 csv 格式的注释。 我编写了一个快速脚本,将注释转换为所需的 XML 格式,该脚本也可以在上面的 github 存储库中找到。

第 3 步:克隆存储库

克隆存储库()。 运行以下命令安装所需的软件包,编译一些 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

第 4 步:准备支持的输入

我们需要为我们的目标分配一个 ID。 我们在名为 label_map.pbtxt 的文件中定义 ID,如下所示:

item {
 id: 1
 name: ‘target’
}

接下来,您必须创建一个包含 XML 和图像文件名的文本文件。 例如,如果您的数据集包含图像 img1.jpg、img2.jpg 和 img1.xml、img2.xml,则您的 trainval.txt 应如下所示:

img1
img2

将数据集拆分为两个文件夹:图像和注释。 将 label_map.pbtxt 和 trainval.txt 放入注释文件夹中。 在注释文件夹中创建一个名为 xmls 的文件夹,并将所有 XML 文件放入其中。 您的目录层次结构应如下所示:

-base_directory
|-images
|-annotations
||-xmls
||-label_map.pbtxt
||-trainval.txt

步骤5:创建TF记录

API 接受 TFRecords 文件格式的输入。 使用我的存储库中提供的 create_tf_records.py 文件将数据集转换为 TFRecords。 您应该在基本目录中执行以下命令:

python create_tf_record.py \
    --data_dir=`pwd` \
    --output_dir=`pwd`

程序执行后,你会发现两个文件:train.record和val.record。

第 2 阶段:训练模型

第一步:型号选择

如前所述,这是速度和准确性之间的权衡。 同时,从头开始创建和训练目标检测器非常耗时。 因此,TensorFlow 对象检测 API 提供了一系列预训练模型,您可以根据任务进行微调。 这个过程称为迁移学习,可以显着加快您的训练过程。

数字监控器_数字监控系统软件教程_监控教程数字软件系统有哪些

MS COCO 数据集上的一堆预训练模型

下载其中一个模型并将内容解压到您的基本目录中。 您将获得模型的检查点、冻结的推理图和 pipeline.config 文件。

第 2 步:定义培训任务

您必须在 pipeline.config 文件中定义“训练任务”。 将文件放置在基本目录中。 真正重要的是文件的最后几行 - 您只需将突出显示的值设置为它们自己的文件位置。

gradient_clipping_by_norm: 10.0
  fine_tune_checkpoint: "model.ckpt"
  from_detection_checkpoint: true
  num_steps: 200000
}
train_input_reader {
  label_map_path: "annotations/label_map.pbtxt"
  tf_record_input_reader {
    input_path: "train.record"
  }
}
eval_config {
  num_examples: 8000
  max_evals: 10
  use_moving_averages: false
}
eval_input_reader {
  label_map_path: "annotations/label_map.pbtxt"
  shuffle: false
  num_epochs: 1
  num_readers: 1
  tf_record_input_reader {
    input_path: "val.record"
  }
}

第 3 步:开始训练

执行以下命令开始训练。 建议使用具有足够大 GPU 的机器(假设您安装了 GPU 版本的 TensorFlow)以加快训练过程。

python object_detection/train.py \
--logtostderr \
--pipeline_config_path=pipeline.config \
--train_dir=train

第三阶段:推理

步骤一:导出训练好的模型

在使用模型之前,您需要将训练好的检查点文件导出到冻结推理图。 实际上比说的更容易 - 只需执行以下代码(将“xxxxx”替换为检查点编号):

python object_detection/export_inference_graph.py \
--input_type=image_tensor \
--pipeline_config_path=pipeline.config \
--trained_checkpoint_prefix=train/model.ckpt-xxxxx \
--output_directory=output

您将获得一个名为 freeze_inference_graph.pb 的文件和一堆检查点文件。

第 2 步:在您的视频流上使用它

我们需要从视频源中提取单个帧。 这可以通过使用 OpenCV 的 VideoCapture 方法来完成,如下所示:

cap = cv2.VideoCapture()
flag = True
while(flag):
    flag, frame = cap.read()
    ## -- Object Detection Code --

第 1 阶段使用的数据提取代码会自动创建一个包含测试集图像的文件夹“test_images”。 我们可以通过执行以下命令在测试集上运行我们的模型:

python object_detection/inference.py \
--input_dir={PATH} \
--output_dir={PATH} \
--label_map={PATH} \
--frozen_graph={PATH} \
--num_output_classes=1 \
--n_jobs=1 \
--delay=0

实验

如前所述,在选择目标检测模型时,需要在速度和准确性之间进行权衡。 我进行了一些实验,测量使用三种不同模型检测到的人员的 FPS 和计数准确性。 此外,实验是在不同的资源约束(GPU 并行约束)下运行的。 这些实验的结果可以为您在选择对象检测模型时提供一些有价值的见解。

设置

我们选择以下模型进行实验。 这些可以在 TensorFlow 对象检测 API 的 Model Zoo 中找到。

所有模型都在 Google Colab 上训练 10k 步(或直到损失不再减少)。 推理使用 AWS p2.8xlarge 实例。 计数准确性是通过将模型检测到的人数与真实结果进行比较来衡量的。 每秒帧数 (FPS) 在以下约束下测试推理速度:

结果

下图是在我们的测试集上使用 FasterRCNN 生成的输出的一部分。 下面的视频中展示了更多结果。

数字监控器_监控教程数字软件系统有哪些_数字监控系统软件教程

训练时间

下图显示了训练每个模型 10 k 步所需的时间(以小时为单位)。 这不包括超参数搜索所需的时间。

数字监控系统软件教程_监控教程数字软件系统有哪些_数字监控器

当您的应用程序与用于迁移学习的预训练模型显着不同时,您可能需要大幅调整超参数。 但是当您的应用程序相似时,您不需要进行大量搜索。 不过,您可能想尝试不同的训练参数,例如学习率和优化器选择。

速度(每秒帧数)

这是我们实验中最有趣的部分。 如前所述,我们测量了三种模型在五种不同资源限制下的 FPS 性能。 结果如下:

数字监控器_数字监控系统软件教程_监控教程数字软件系统有哪些

当我们使用单个GPU时,SSD速度极快,可以轻松超越Faster RCNN的速度。 然而,当我们增加(并行)GPU 的数量时,Faster RCNN 很快就赶上了 SSD 的速度。 不用说,在低 GPU 环境中,使用 SSD 配合 MobileNet 比使用 SSD 配合 InceptionNet 快得多。

上图中的一个显着特征是,当我们通过 MobileNet 增加 SSD 的 GPU 数量时,FPS 略有下降。 这个看似悖论实际上有一个简单的解释。 事实证明,我们处理图像的设置比图像读取功能可以提供的速度更快!

视频处理系统不可能比图像输入系统快。

为了证明我的假设数字监控系统软件教程,我首先启动图像读取功能。 下图显示了采用 MobileNet 的 SSD 在增加延迟时的 FPS 改进。 早期图表中 FPS 略有下降是由于从多个 GPU 请求输入所涉及的开销。

数字监控系统软件教程_数字监控器_监控教程数字软件系统有哪些

不用说,我们发现如果引入延迟,FPS 会急剧增加。 最重要的是,我们需要优化的图像传输管道来防止出现速度瓶颈。 但将其应用于监控仍存在瓶颈。 监控摄像头的FPS设定了我们系统FPS的上限。

计算准确度

我们将计数准确度定义为我们的对象检测系统正确识别的人数百分比。 我认为这个定义更适合监控。 以下是我们每个模型的表现:

数字监控系统软件教程_监控教程数字软件系统有哪些_数字监控器

毫无疑问,Faster RCNN 是最准确的模型。 同样令人惊讶的是 MobileNet 的性能优于 InceptionNet。

速度和准确性之间的权衡在实验中显而易见。 然而,如果有足够的资源,我们可以以良好的 FPS 速率使用高精度模型。 我们发现使用 ResNet-50 的 Faster RCNN 具有最高的精度,并且在 4 个以上 GPU 上并行部署时具有非常高的 FPS 速率。

有很多步骤!

这里有很多步骤。 此外,为此模型设置实时工作云实例将是繁重且昂贵的。

更好的解决方案是使用服务器上已经部署的API服务,这样您只需担心产品开发。 这就是 Nanonet 的用武之地。他们将 API 部署在带有 GPU 的高质量硬件上,因此您可以轻松获得令人难以置信的性能!

我将现有的 XML 注释转换为 JSON 格式,并将其提供给 Nanonets API。 事实上,如果您不想手动注释数据集,您可以要求他们为您添加注释。 这是 Nanonets 完成繁重工作的简化工作流程。

数字监控系统软件教程_监控教程数字软件系统有哪些_数字监控器

使用 Nanonets 简化您的工作流程

之前,我提到过微型无人机等移动监控设备如何能够大大提高效率。 我们可以使用 Raspberry Pi 等微控制器轻松构建这样的无人机,并且可以使用 API 调用来执行推理。

开始使用 Nanonets API 进行对象检测非常简单,但要获得清晰的指南,您可以查看这篇博客文章 ()。

使用纳米网的结果

Nanonets 大约需要 2 小时才能完成训练。 这包括超参数搜索所需的时间。 就训练时间而言,Nanonets 是明显的赢家。 Nanonets 在计数准确性方面也击败了 FasterRCNN。

FasterRCNN Count Accuracy = 88.77%
Nanonets Count Accuracy = 89.66%

以下是所有 4 个模型在我们的测试数据集上的表现。 很明显,两种 SSD 模型都有些不稳定,并且精度较低。 此外,虽然 FasterRCNN 和 Nanonets 具有相当的精度,但后者具有更稳定的边界框。

自动监测可靠吗?

深度学习是一个了不起的工具,可以轻松提供典型结果。 但我们可以在多大程度上信任我们的监控系统并让它们自行运行? 在某些情况下,自动化是值得怀疑的。

更新:根据 GDPR 并出于下面讨论的原因,考虑监控自动化的合法性和道德非常重要。 本博文仅用于教育目的,并使用公开可用的数据集。 您有责任确保您的自动化系统符合您所在地区的法律。

1.结论不可靠

我们不知道深度学习算法如何得出结论。 即使数据输入过程无可挑剔,也可能存在大量虚假数据。 例如,英国警方使用的人工智能反色情过滤器多次将沙丘图像误认为是裸体图像并将其删除。 像引导反向传播这样的技术可以在一定程度上解释决策,但我们还有很长的路要走。

2. 对抗性攻击

深度学习系统非常脆弱。 对抗性攻击类似于图像分类器上的视错觉。 但可怕的是,计算出的不明显的扰动可能会迫使深度学习模型错误分类。 基于同样的原理,研究人员可以通过使用“对抗性眼镜”来避免基于深度学习的监视系统中的错误。

3. 误报类别

另一个问题是如果出现误报我们该怎么办? 问题的严重性取决于应用程序本身。 例如,误报类别对于边境巡逻系统可能比对于花园监控系统更重要。 应该进行一些人为干预以避免意外。

4.相似的面孔

遗憾的是,您的外表并不像您的指纹那么独特。 两个人(或更多人)可能看起来非常相似。 同卵双胞胎就是最好的例子之一。 据报道,苹果的Face ID无法区分两名不相关的中国员工。 这会使监控和识别人员变得更加困难。

5. 数据集缺乏多样性

您提供的数据越好,深度学习算法就越好。 最流行的人脸数据集只有白色样本。 对于孩子来说,人类有各种肤色似乎是显而易见的数字监控系统软件教程,但深度学习算法有点愚蠢。 谷歌曾因将一名黑人错误分类为大猩猩而陷入困境。

原文链接:

相关内容 查看全部