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

本文是使用基于深度学习的对象检测实现监控系统的快速教程。 它还比较了使用GPU多处理进行推理的不同物体检测模型在行人检测方面的性能。

监视是安全和巡逻的一个组成部分。 在大多数情况下,这项工作需要长时间寻找不受欢迎的事情。 我们这样做至关重要,但这也是一项非常平凡的任务。

如果有什么东西可以为我们“观察和等待”,那么生活会不会简单得多? 嗯,你很幸运。 随着过去几年技术的进步,我们可以编写一些脚本来自动执行上述任务 - 而且也很容易。 但是,在我们深入探讨之前,让我们问自己:

Are machines are good as humans?

任何熟悉深度学习的人都会知道图像分类器超出了人类的准确度。
在这里插入图片描述

对于人类,传统计算机视觉(CV)和深度学习,ImageNet数据集随时间的错误率。 (图片来源:链接)
所以,是的,与人类相比,机器可以以相同的标准(或更好)保持对物体的监视。 话虽如此,使用技术进行监视更有效率。

  • 监督是一项重复而平凡的任务。 这可能会导致我们人类的性能下降。 通过让技术进行监控,我们可以专注于采取行动,如果出现问题。
  • 要调查大片土地,您需要大量人员。 固定式摄像机的视野范围有限。 使用移动监控机器人(如微型无人机)可以减轻这些问题。
    此外,相同的技术可用于各种不限于安全性的应用,例如婴儿监视器或自动产品交付。

Fair enough. But how do we automate it?

在我们设计复杂的理论之前,让我们考虑一下监控的正常运作方式。 我们看一个视频源,如果发现异常,我们会采取行动。 所以从本质上讲,我们的技术应该仔细阅读视频的每一帧,希望发现一些异常的东西。 这个过程会响铃吗?

您可能已经猜到,这是使用本地化进行对象检测的本质。 它与分类略有不同,我们需要知道对象的确切位置。 此外,我们可能在单个图像中有多个对象。

在这里插入图片描述
为了找到确切的位置,我们的算法应该检查图像的每个部分以找到类的存在。 它比听起来更难。 但自2014年以来,深度学习中的连续迭代研究引入了可以实时检测物体的重度工程神经网络。
在这里插入图片描述

看看性能在2年的时间内是如何增加的!
有几种深度学习架构在内部使用不同的方法来执行相同的任务。
The most popular variants are the Faster RCNN, YOLO and the SSD networks.
在这里插入图片描述

速度与准确性的权衡。 更高的mAP和更低的GPU时间是最佳的。

每个模型都依赖于基础分类器,这极大地影响了最终的准确性和模型大小。 此外,物体检测器的选择会严重影响计算复杂性和最终精度。

选择对象检测算法时,始终存在速度与精度与尺寸权衡的关系。

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

Constraints for Deep Learning in Surveillance

我们经常想在一大片土地上留意。 这带来了在自动化监控之前我们可能需要考虑的几个因素。

1.视频Feed
当然,要在大面积上观察,我们可能需要多个摄像头。 而且,这些相机需要在某处存储这些数据; 本地或远程位置。
在这里插入图片描述
较高质量的视频将比较低质量的视频占用更多内存。 此外,RGB输入流比BW输入流大3倍。 由于我们只能存储有限数量的输入流,因此通常会降低质量以最大化存储。

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

2. Processing Power

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

  • 在中央服务器上处理:

来自摄像机的视频流在远程服务器或集群上逐帧处理。 这种方法非常强大,使我们能够获得具有高精度的复杂模型的优势。 显而易见的问题是延迟; 你需要有限的延迟快速的互联网连接。 此外,如果您不使用商业API,则服务器设置和维护成本可能很高。
在这里插入图片描述
内存消耗与推理GPU时间(毫秒)。 大多数高性能型号都会占用大量内存。 (资源)

  • 边缘处理:

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

在这里插入图片描述
各种物体探测器的FPS能力。 (资源)

缺点是,微控制器没有GPU那么强大,因此您可能被迫使用精度较低的模型。 使用板载GPU可以避免这个问题,但这是一个昂贵的解决方案。 一个有趣的解决方案是使用TensorRT等软件,它可以优化您的程序进行推理。

Training a Surveillance System

在本节中,我们将使用对象检测来检查如何识别行人。 我们将使用TensorFlow对象检测API来创建我们的对象检测模块。 我们将简要探讨如何设置API并为我们的监控任务进行培训。 有关更详细的说明,您可以查看此博客文章

The entire process can be summarized in three phases:

  • 数据准备
  • 训练模型
  • 推论

在这里插入图片描述
工作流程涉及训练对象检测模型。

如果您希望看到结果会激发您更多尝试,请随时向下滚动到第3阶段!

Phase 1: Data Preparation

Step 1: Obtain the dataset

过去拍摄的监控录像可能是您可以获得的最准确的数据集。 但是,对于大多数情况来说,通常很难获得这样的监控录像。 在这种情况下,我们可以训练我们的物体探测器,以便从正常图像中识别我们的目标。
在这里插入图片描述
Sample annotated image from our dataset.

如前所述,相机中的图像质量可能较低。 所以你必须训练你的模型在这样的条件下工作。 一种非常优雅的方法是通过执行数据增强,详细解释这里。 基本上,我们必须添加一些噪声来降低数据集的图像质量。 我们还可以尝试模糊和侵蚀效果。

我们将TownCentre Dataset用于我们的对象检测任务。 我们将使用视频的前3600帧进行培训和验证,剩下的900帧进行测试。 您可以使用我的GitHub repo中的脚本来提取数据集。

Step 2: Annotate the dataset

您可以使用LabelImg等工具来执行注释。 这是一项繁琐的工作,但同样重要。 注释保存为XML文件。

幸运的是,TownCentre Dataset的所有者提供了csv格式的注释。 我编写了一个快速脚本,将注释转换为所需的XML格式,您可以在我的GitHub repo中找到它。

Step 3: Clone the repository

克隆repository。 运行以下命令以安装需求,编译一些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

Step 4: Prepare the supporting inputs

我们需要为目标分配一个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放在注释文件夹中。 在annotations文件夹中创建一个名为xmls的文件夹,并将所有XML放在其中。 您的目录层次结构应如下所示:

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

Step 5: Create TF Records

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

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

You will find two files, train.record and val.record, after the program finishes its execution.

Phase 2: Training the model

Step 1: Model Selection

如前所述,速度和准确性之间存在折衷。 此外,从头开始构建和训练物体检测器将非常耗时。 因此,TensorFlow对象检测API提供了一系列预先训练的模型,您可以根据自己的使用情况进行微调。 这个过程称为转学习,它可以加快你的速度 培训过程庞大。在这里插入图片描述
一组在MS COCO数据集上预先训练过的模型

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

Step 2: Defining the training job

您必须在pipeline.config文件中定义“training job”。 将文件放在基目录中。 真正重要的是文件的最后几行 - 您只需要将突出显示的值设置为各自的文件位置。



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"
  }
}




Step 3: 着手训练

执行以下命令以启动培训作业。 建议使用具有足够大GPU的机器(假设您安装了tensorflow的gpu版本)以加速培训过程。

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

Phase 3: Inference

Step 1: Export the trained model

在使用模型之前,需要将训练好的检查点文件导出到冻结的推理图。 它实际上比说起来更容易 - 只需执行下面的代码(用检查点号替换’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

You will obtain a file named frozen_inference_graph.pb, along with a bunch of checkpoint files.

Step 2: Use it on a video stream

我们需要从视频源中提取单个帧。 它可以通过使用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

Experiments

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

Setup

我们的实验选择了以下模型。 这些可在TensorFlow Object Detection API的Model Zoo中找到。

  • 使用ResNet 50加快RCNN
  • 带MobileNet v1的SSD
  • 带有InceptionNet v2的SSD

所有模型都在Google Colab上进行了10k步训练(或直到它们的损失饱和)。 推断时,使用了AWS p2.8xlarge实例。 通过比较模型检测到的人数和基本事实来测量计数准确度。 在以下约束条件下测试每秒帧数(FPS)的推理速度:

  • 单GPU
  • 两个并行的GPU
  • 四个并行的GPU
  • 并行8个GPU

Results

以下是在我们的测试集上使用FasterRCNN生成的输出的摘录。 我还附上了一个视频,比较了本博客末尾附近每个模型产生的输出。 随意向下滚动并查看它!

在这里插入图片描述

Training Time

下图显示了以10k步(以小时为单位)训练每个模型所需的时间。 这不包括超参数搜索所需的时间。在这里插入图片描述
当您的应用程序与用于转移学习的预训练模型非常不同时,您可能需要大量调整超参数。 但是,当您的应用程序类似时,您不需要进行大量搜索。 尽管如此,您可能仍需要尝试训练参数,例如学习速率和优化器的选择。

Speed (Frames per Second)

这是我们实验中最有趣的部分。 如前所述,我们测量了三种模型在五种不同资源约束下的FPS性能。 结果如下所示:
在这里插入图片描述

当我们使用单个GPU时,SSD速度非常快,轻松超越RCNN的速度。 然而,当我们增加GPU的数量(并行工作)时,更快的RCNN很快赶上SSD。 毋庸置疑,在低GPU环境下,采用MobileNet的SSD比使用InceptionNet的SSD要快得多。

上图中的一个值得注意的特征是,当我们使用MobileNet增加SSD的GPU数量时,FPS略有下降。 对于这个明显的悖论,实际上有一个简单的答案。 事实证明,我们的设置处理图像的速度比图像读取功能提供的图像更快!
视频处理系统的速度不能高于图像输入系统的速度。
为了证明我的假设,我给了图像读取功能一个先机。 下图显示了添加延迟时带有MobileNet的SSD的FPS改进情况。 早期图表中FPS的轻微下降是由于多个GPU请求输入所涉及的开销。
在这里插入图片描述
不用说,如果我们引入延迟,我们会观察到FPS急剧增加。 最重要的是,我们需要一个优化的图像传输管道,以防止速度瓶颈。 但由于我们的预期用例是监控,我们还有一个瓶颈。 监控摄像机的FPS设置了我们系统FPS的上限。

Count Accuracy

我们将计数准确度定义为我们的对象检测系统正确识别的人的百分比。 我觉得在监控方面更合适。 以下是我们每个模型的表现:
在这里插入图片描述

毋庸置疑,更快的RCNN是最准确的模型。 同样令人惊讶的是,MobileNet的性能优于InceptionNet。

基于实验,很明显确实存在速度与精度的权衡。 但是,如果我们有足够的资源,我们可以以良好的FPS率使用高精度的模型。 我们观察到,使用ResNet-50的更快RCNN可提供最佳精度,并且当并行部署在4+ GPU上时具有非常好的FPS评级。

That was a lot of steps!

嗯…我不会争辩。 这确实是很多步骤。 此外,为此模型设置实时工作的云实例将是繁重且昂贵的。

更好的解决方案是使用已部署在服务器上的API服务,这样您就可以担心开发产品了。 这就是Nanonets的用武之地。他们的API部署在带有GPU的高质量硬件上,这样你就可以获得疯狂的性能 没有麻烦!

我将现有的XML注释转换为JSON格式并将其提供给Nanonets API。 事实上,如果您不想手动注释数据集,可以请求它们为您添加注释。 这是Nanonets负责繁重工作时减少的工作流程。
在这里插入图片描述
Nanonets减少了工作流程

早些时候,我曾提到微型无人机等移动监控设备如何大大提高效率。 我们可以使用像Raspberry Pi这样的微控制器轻松创建这样的无人机,我们可以使用API调用来执行推理。

开始使用Nanonets API for Object Detection非常简单,但是对于一个解释良好的指南,你可以查看这个博客文章

Results with Nanonets

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

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

以下是我们的测试数据集中所有四个模型的性能。 很明显,两种SSD型号都有点不稳定并且精度较低。 此外,尽管FasterRCNN和Nanonets具有可比较的精度,但后者具有更稳定的边界框。
视频

自动监视是否负责?

深度学习是一种令人惊叹的工具,可以轻松提供示范结果。但是,我们可以在多大程度上相信我们的监控系统可以独立行事?有一些情况下自动化是有问题的。

更新:鉴于GDPR和下述原因,我们必须思考有关监控自动化的合法性和道德问题。此博客仅用于教育目的,它使用了公开的数据集。您有责任确保您的自动化系统符合您所在地区的法律。
1.可疑的结论
我们不知道深度学习算法如何得出结论。即使数据馈送过程无可挑剔,也可能存在大量的虚假命中。例如,英国警察使用的这种AI亵渎过滤器不断删除[认为它们是淫秽图像的沙丘的pictures](https://gizmodo.com/british-cops-want-to-use-ai-to-spot-porn - 丁它-保持-M-1821384511?utm_campaign = socialflow_gizmodo_twitter&utm_source = gizmodo_twitter&utm_medium = socialflow)。诸如引导反向传播等技术可以在一定程度上解释决策,但我们还有很长的路要走。

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

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

4.相似的面孔
可悲的是,你的外观并不像指纹那么独特。两个人(或更多)可能看起来非常相似。同卵双胞胎是最好的例子之一。据报道,Apple Face ID 未能区分两位无关的中国同事。这可以使监视和识别人更难。

5.数据集缺乏多样性
深度学习算法与您提供的数据一样好。最受欢迎的人脸数据集,只有白人样本。虽然对于孩子来说,人类可以以各种颜色存在似乎是显而易见的,但深度学习算法却有点愚蠢。事实上,谷歌陷入了麻烦,因为它将一个黑人错误地当作大猩猩归类。

猜你喜欢

转载自blog.csdn.net/weixin_41697507/article/details/89319711