视觉监控实验室






4.85/5 (39投票s)
关于监控系统的描述。
引言
视觉监控是指从图像序列中检测、识别和跟踪特定对象,以及更普遍地理解和描述对象行为[1]。
本两部分文章的目的是描述一个视觉监控系统的框架和示例算法,以帮助世界各地的程序员了解这一主题。第一部分回顾了监控系统的基本结构,第二部分将演示一种用于此类系统的算法。
尽管 Andrew Kirillov 在他的文章[2]中详细讨论了这一主题,但他对监控系统的应有看法比较狭隘。本文试图提供对监控系统结构的更广泛的见解。
监控系统动机
-
异常检测
学习正常行为和异常行为的能力。
例如,在办公楼入口处,人们通常在进入建筑后会直接前往大堂。因此,走错方向的个人可能被视为有害。 -
自动化安全
通过只关注特定事件,而不是像现在这样监视和分析多个不同的监控摄像头,从而提高整个监控过程的效率。这样的系统还可以降低成本。
-
人群流量统计
例如,通过了解有多少辆汽车在使用某条道路,有多少辆来自 A 或 B 道路,我们可以决定拓宽哪条道路。
-
万圣节溅血骷髅[6]
只是 coding4fun 上发现的一个有趣用途,并非所有原因都必须是严肃的。
视觉监控系统的通用结构
首先,系统接收图像流,然后尝试从中学习几个重要事实
- 是否存在任何对象(指人、汽车、行李箱、肢体等)。
- 确定对象的类型(例如,是汽车还是人等)。
- 对象在 x,y 坐标中的当前位置(可能还包括 z)。
- 解释对象的位置是否具有意义,例如,这辆车是否位于位置 10,50 并沿有效轨迹行驶。
通常,前三项被认为是低级,第四项是高级。
下方的通用结构并非强制性,但许多现有系统都遵循它。
相机 1
通常是硬件设备,尽管我们也可以在保存的视频文件中使用视觉监控系统。摄像头提供图像流(也称为帧),这是输入。需要注意的是,尽管我们可以从单个图像中学习许多重要特征,但这还不够。
环境建模
理念很简单,并非所有像素都值得关注,例如属于图像背景的像素。背景是指,例如,在两个人走在树前的一个场景中,树被认为是背景。提取背景时,计算会更精确。
看下面的图片
正如你所见,我们成功地区分了人(前景)和他们的背景环境。
运动分割
尝试检测图像中对应于移动对象的区域。为什么?因为移动的对象是我们感兴趣的。它们通过只关注它们来帮助我们节省计算时间。然而,重要的是要记住,有时静止的对象恰恰是我们感兴趣的,例如一辆汽车一整天都停在一栋房子前面,缺乏运动正是其可疑之处。
对象分类
如前所述,分类(确定类型)意味着给每个对象一个它所属的类别,你可能希望忽略某些类别的对象,例如鸟类。
跟踪
重要的是要理解跟踪不是运动检测(运动分割)。它是在不同帧中识别同一个对象。例如,一个人在第 1 帧中从摄像头前走过,将在连续帧中被识别为同一个人。这提供了该人在整个行程中所采取的轨迹。
例如,看下面的图片
您可以看到,在整个场景中,人都被跟踪了。
跟踪的主要问题是遮挡,即对象被另一对象(如树、汽车等)遮盖。
行为理解/个人识别
在这里,我们可以放置各种学习算法或任何处理已收集数据的算法。
代码概述
主要思想是创建一个支持插件的通用 GUI。它将显示最终结果,然后将监控算法作为外部库添加。这种混合搭配各种算法的架构实现了模块化。另一个优点是教育性的,因为学生可以插入各种算法并查看它们在各种情况下的运行效果。
代码包含 4 个主项目和 3 个实用项目。
在此,我们将回顾如何封装视觉监控系统的结构。
核心项目
这个核心项目在某种意义上是一个接口项目。这里的大多数接口都是辅助接口。任何外部插件库都必须实现 ISurveillanceSystem
接口才能将其添加到系统中。让我们看看这个接口。
此接口定义了允许视觉环境查询底层算法能力属性和方法。大多数这些属性直接对应于 GUI 功能,例如启用或禁用特定菜单或按钮的功能。例如,HasRuntimeInformation
是否返回 true
,如果该算法支持以 GUI 方式显示其内部工作能力。如果此属性返回 true
,则环境可以查询 RuntimeInformation
以检索将显示的表单。此接口中的许多属性工作方式相同。
一个重要的方法是 GetImageProcess
,它返回一个继承自 IImageProcess
接口的对象。
此接口封装了整个监控算法,只有一个接收图像并返回一组 blob 的方法。Blob 是在跟踪部分中识别出的对象,具有唯一的 ID 和位置。
另一个重要的接口是 IOutputSystem
。
IOutputSystem
允许将 IImageProcess
对象的结果输出到不同的格式,例如文件或学习算法。
一个绘制 IImageProcess
最终结果到屏幕上的委托,例如,在所有跟踪的对象周围绘制一个矩形。
我们现在已准备好完全理解监控系统的处理流程。
frame <-- Get frame from camera
trackedObjects <-- IImageProcess.ProcessFrame(frame)
IOutput.Output(trackedObjects)
GraphicalOutputDelegate(trackedObjects, frame)
return frame
Visual Surveillance Laboratory Project
该实验室项目包含主用户界面和加载可用插件到内存中的代码。
GUI 部分将不在此描述,您可以自己查看,但我将描述插件机制。
该项目支持两种类型的插件:跟踪系统和输出系统。为了加载可用的插件,这两种情况都使用了相同的方案,即一个工厂类解析一个 XML 文件,该文件包含磁盘位置和命名空间位置的详细信息,工厂类尝试将插件加载到内存中。
这是 XML 文件的一个示例。
<Configuration>
<TrackingSystem location="...\bin\Debug\SimpleTrackingSystemExample.dll"
class="Zoombut.SimpleTrackingSystemExample.ExampleTrackingSystem"/>
<OutputSystem location="...\bin\Debug\SimpleFileOutputSystemExample.dll"
class="Zoombut.SimpleFileOutputSystemExample.ExampleOutputSystem"/>
</Configuration>
代码本身非常直接。
// Load available tracking systems.
XmlDocument document = new XmlDocument();
document.Load(Settings.Default.ConfigFile);
// Use xml path.
XmlNodeList result =
document.SelectNodes("/Configuration/TrackingSystem");
foreach (XmlNode node in result) {
// Load values.
String location = node.Attributes["location"].InnerText;
String className = node.Attributes["class"].InnerText;
// Create instance.
ISurveillanceSystem value =
(ISurveillanceSystem)Activator.CreateInstanceFrom
(location, className).Unwrap();
availableTrackingSystems.Add(value);
目前它不够健壮,没有错误处理,在系统的下一个版本中会添加一些东西。
用户指南
要开始监控任务,您首先需要确保配置文件指向各个插件的正确位置。尝试运行应用程序而不更改 config.xml 文件将导致插件列表为空。
您可以通过从菜单中选择 Configure 来开始监控任务,此时应该会出现以下对话框。
您可以看到配置窗口包含三个部分
-
输入
图像流将从哪里来,它可以是从连接到计算机的摄像头,也可以是通过普通的视频文件(目前仅支持 Avi 文件)。您可以从项目网站 http://code.google.com/p/vsl/ 下载一个 avi 测试文件。电影文件最初位于[5] 。
本节使用 AForge.NET 框架[3]构建。 -
监控系统
列出了封装监控算法的可用插件。如果系统可以配置,则 Configure 按钮将启用。
-
输出系统
列出了输出监控算法最终结果的可用插件,如果系统可以配置,则 Configure 按钮将启用。单击 Ok 后,主窗口应显示“Connected”消息,表示您已准备好开始。按 Start 或 Stop 来启动或停止运行算法。
未来工作
- 提高软件的健壮性。
- 调试,调试,再调试...
- 添加更多示例算法。
- 添加录制支持。
结论
- 我们了解了监控系统的基本结构。它包含 5 个主要部分:环境建模、运动分割、分类、跟踪和行为理解。
- 我们描述了我们系统中插件的基本结构,并展示了如何动态加载它。
参考文献
继续阅读文章的第二部分 Visual Surveillance Laboratory Part 2
应用使用
- “Walk on the Sun” STEREO 空间任务科学展览。更多信息请访问:http://www.drsrl.com/exhibits.
历史