65.9K
CodeProject 正在变化。 阅读更多。
Home

视觉监控实验室

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (39投票s)

2007 年 5 月 4 日

Apache

8分钟阅读

viewsIcon

152685

downloadIcon

11015

关于监控系统的描述。

Sample Image - maximum width is 600 pixels

引言

视觉监控是指从图像序列中检测、识别和跟踪特定对象,以及更普遍地理解和描述对象行为[1]。

本两部分文章的目的是描述一个视觉监控系统的框架和示例算法,以帮助世界各地的程序员了解这一主题。第一部分回顾了监控系统的基本结构,第二部分将演示一种用于此类系统的算法。

尽管 Andrew Kirillov 在他的文章[2]中详细讨论了这一主题,但他对监控系统的应有看法比较狭隘。本文试图提供对监控系统结构的更广泛的见解。

监控系统动机

  • 异常检测

    学习正常行为和异常行为的能力。
    例如,在办公楼入口处,人们通常在进入建筑后会直接前往大堂。因此,走错方向的个人可能被视为有害。

  • 自动化安全

    通过只关注特定事件,而不是像现在这样监视和分析多个不同的监控摄像头,从而提高整个监控过程的效率。这样的系统还可以降低成本。

  • 人群流量统计

    例如,通过了解有多少辆汽车在使用某条道路,有多少辆来自 A 或 B 道路,我们可以决定拓宽哪条道路。

  • 万圣节溅血骷髅[6]

    只是 coding4fun 上发现的一个有趣用途,并非所有原因都必须是严肃的。

视觉监控系统的通用结构

首先,系统接收图像流,然后尝试从中学习几个重要事实

  1. 是否存在任何对象(指人、汽车、行李箱、肢体等)。
  2. 确定对象的类型(例如,是汽车还是人等)。
  3. 对象在 x,y 坐标中的当前位置(可能还包括 z)。
  4. 解释对象的位置是否具有意义,例如,这辆车是否位于位置 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 来开始监控任务,此时应该会出现以下对话框。

您可以看到配置窗口包含三个部分

  1. 输入

    图像流将从哪里来,它可以是从连接到计算机的摄像头,也可以是通过普通的视频文件(目前仅支持 Avi 文件)。您可以从项目网站 http://code.google.com/p/vsl/ 下载一个 avi 测试文件。电影文件最初位于[5] 。
    本节使用 AForge.NET 框架[3]构建。

  2. 监控系统

    列出了封装监控算法的可用插件。如果系统可以配置,则 Configure 按钮将启用。

  3. 输出系统

    列出了输出监控算法最终结果的可用插件,如果系统可以配置,则 Configure 按钮将启用。单击 Ok 后,主窗口应显示“Connected”消息,表示您已准备好开始。按 Start 或 Stop 来启动或停止运行算法。

未来工作

  1. 提高软件的健壮性。
  2. 调试,调试,再调试...
  3. 添加更多示例算法。
  4. 添加录制支持。

结论

  1. 我们了解了监控系统的基本结构。它包含 5 个主要部分:环境建模、运动分割、分类、跟踪和行为理解。
  2. 我们描述了我们系统中插件的基本结构,并展示了如何动态加载它。

参考文献

  1. 物体运动和行为的视觉监控调查
  2. 运动检测算法 - Andrew Kirillov 的精彩文章
  3. AForge.NET 框架
  4. 跟踪人群
  5. CAVIAR 测试用例场景

继续阅读文章的第二部分 Visual Surveillance Laboratory Part 2

应用使用

历史

  • [2008.03.08] 应用程序的新版本已上传至 此处
  • [2007.05.21] 版本 1.0.3 - 添加了指向文章第二部分的链接
  • [2007.05.11] 版本 1.0.2 - 添加了对 mjpeg 的支持。
    随时在此处 检查最新版本
  • [2007.05.09] 版本 1.0.1 - 在下载部分添加了 dshow 库。
  • [2007.05.02] 版本 1.0.0
© . All rights reserved.