斯坦福新深度学习系统 NoScope:视频对象检测快1000倍
以作备份,来源http://jiasuhui.com/archives/178954

斯坦福大学的新研究构建一个名为 NoScope 的深度学习视频对象检测系统,利用视频的局部性对 CNN 模型进行优化,相比当前性能最好的 YOLOv2 或 Faster R-CNN 速度加快了1000倍,同时仍保持高精度。这一系统在安防、交通等领域有着巨大的应用价值和潜力。
视频数据正在爆炸性地增长——仅英国就有超过400万个CCTV监控摄像头,用户每分钟上传到 YouTube 上的视频超过300小时。深度学习的最新进展已经能够自动分析这些海量的视频数据,让我们得以检索到感兴趣的事物,检测到异常和异常事件,以及筛选出不会有人看的视频的生命周期。但是,这些深度学习方法在计算上是非常昂贵的:当前 state-of-the-art 的目标检测方法是在最先进的NVIDIA P100 GPU上以每秒10-80帧的速度运行的。这对单个视频来说还好,但对于大规模实际部署的视频来说,这是难以维持的。具体来说,假如用这样的方法来实时分析英国所有的CCTV监控视频,仅在硬件上就得花费超过50亿美元。
为了解决视频增长速度与分析成本之间的巨大差距,我们构建了一个名为 NoScope 的系统,与目前的方法相比,它处理视频内容的速度要快数千倍。我们的主要想法是,视频是高度冗余的,包含大量的时间局部性(即时间上的相似性)和空间局部性(即场景中的相似性)。为了利用这种局部性,我们设计了用于高效处理视频输入任务的 NoScope。通过利用一系列利用视频局部性的优化,显著降低了在每个帧上的计算量,同时仍保持常规检索的高精度。
本文将介绍NoScope优化的一个示例,并描述NoScope如何在模型级联中端到端地堆叠它们,以获得倍增的加速——在现实部署的网络摄像机上可提速1000倍。
一个典型例子
试想一下,我们想检索下面的监控摄像头拍摄的视频,以确定公交车在什么时候经过台北的某个交叉路口(例如,用于交通分析):


台北某个交叉路口的两个视频片段
那么,当前最好的视觉模型是如何处理这个问题的呢?我们可以运行 YOLOv2 或Faster R-CNN 之类的用于对象检测的卷积神经网络(CNN),通过在视频的每个帧上运行CNN来检测公交车:


使用YOLOv2标记的交叉路口片段
这种方法工作得很好,尤其是如果我们使视频中出现的标签流畅的话,那么问题出现在哪里呢?就是这些模型非常昂贵。这些模型的运行速度是每秒10-80帧,这对监控单个视频输入来说还好,但如果要处理上千个视频输入的话,效果并不好。
机会:视频中的局部性
为了提高检索的效率,我们应该看视频内容本身的性质。具体来说,视频的内容是非常冗余性的。让我们回到台北的街道监控视频,看一下以下一些出现公交车的帧:

从这个视频影像的角度看,这些公交车看起来是非常相似的,我们称这种局部(locality)形式为场景特定的局部性(scene-specific locality),因为在视频影像中,对象之间看起来并没有很大的不同(例如,与另一个角度的摄像头相比)。
此外,从这个监控视频中,很容易看出,即使公交车正在移动,每一个帧之间都没有太大的变化:

我们将这种特征称为时间局部性(temporal locality),因为时间点附近的帧看起来相似,并且包含相似的内容。
NoScope:利用局部性
为了利用上面观察到的特征,我们构建了一个名为 NoScope 的检索引擎,可以大大加快视频分析检索的速度。给定一个视频输入(或一组输入),一个(或一组)要检测的对象(例如,“在台北的监控视频影像中查找包含公交车的帧”),以及一个目标CNN(例如,YOLOv2),NoScope 输出的帧与YOLOv2的一致。但是NoScope 比输入CNN要快许多:它可以在可能的时候运行一系列利用局部性的更便宜的模型,而不是简单地运行成本更高的目标CNN。下面,我们描述了两类成本较低的模型:专门针对给定的视频内容(feed)和要检测的对象(以利用场景特定局部性)的模型,以及检测差异(以利用时间局部性)的模型。
这些模型端到端地堆叠,比原来的CNN要快1000倍。
利用场景特定局部性
NoScope 使用专用模型来利用场景特定局部性,或训练来从特定视频内容的角度检测特定对象的快速模型。如今的CNN已经能够识别各种各样的物体,例如猫、滑雪板、马桶等等。但在我们的检测台北地区的公交车的任务上,我们不需要关心猫、滑雪板或马桶。相反,我们可以训练一个只能从特定角度的监控视频检测公交车的模型。
举个例子,下面的图像是MS-COCO数据集中的一些样本,也是我们在检测中不需要关心的对象。

MS-COCO数据集中没有出现公交车的3个样本

MS-COCO数据集中出现公交车的2个样本
NoScope 的专用模型也是CNN,但它们比通用的对象检测CNN更简单(更浅)。这有什么作用呢?与YOLOv2的每秒80帧相比,NoScope的专用模型每秒可以运行超过15000帧。我们可以将这些模型作为原始CNN的替代。
使用差异检测器来利用时间局部性
NoScope 使用差异检测器(difference detector)或设计来检测对象变化的快速模型来利用时间局部性。在许多视频中,标签(例如“有公交车”,“无公交车”)的变化比帧的变化少很多(例如,一辆公交车出现在帧中长达5秒,而模型以每秒30帧的速度运行)。为了说明,下面是两个都是150帧长度的视频,但标签并不是在每个视频中都有变化。


每个视频都是150帧,标签一样,但下边的视频没变过!
相比之下,现在的对象检测模型是逐帧地运行的,与帧之间的实际变化无关。这样设计的原因是,像YOLOv2这样的模型是用静态图像训练的,因此它将视频视为一系列的图像。因为NoScope可以访问特定的视频流,因此它可以训练差异检测模型,这些模型对时间依赖性敏感。NoScope的差异检测器目前是使用逐帧计算的逻辑回归模型实现的。这些检测器在CPU上的运行速度非常快,每秒超过10万帧。想专用模型一样,NoScope可以运行这些差异检测器,而不是调用昂贵的CNN。
把这些模型放到一起
NoScope将专用模型和差异检测器结合在一起,堆叠在一个级联中,或堆叠在使计算简化的一系列模型。如果差异检测器没有发生任何变化,那么NoScope会丢弃这一帧。如果专用模型对其标签有信心,那么NoScope会输出这个标签。而且,如果面对特别棘手的框架,NoScope 可以随时返回到完整的CNN。
为了设置这个级联(cascade)以及每个模型的置信度,NoScope提供了可以在精度和 速度之间折衷的优化器。如果想更快地执行,NoScope将通过端到端级联传递更少的帧。如果想得到更准确的结果,NoSceop 则将提高分类决定的简化阈值。如下图所示,最终结果实现了比当前方法快10000倍的加速。

上图是NoScope的系统图示;下图显示了在一个有代表性的视频中速度和准确度的相关性。
差异检测器和专用模型都有助于这一结果。我们先是只使用YOLOv2进行因素分析,然后将每个类型的快速模型添加到级联中。两者都是为了实现最大话性能所必需的。

NoScope系统的因素分析
总结NoScope的级联车辆,优化器先在一个特定视频流中运行较慢的参考模型(YOLOv2,Faster R-CNN等),以获取标签。给定这些标签,NoScope训练一组专用模型和差异检测器,并使用一个holdout set来选择使用哪个特定模型或差异检测器。最后,NoScope的优化器将训练好的模型串联起来,可以在优化模型不确定是调用原始的模型。
结论总结而言,视频数据非常丰富,但使用现代神经网络进行检索的速度非常慢。在NoScope中,我们利用时间局部性,将视频专用管道中差异检测和专用CNN相结合,视频检索速度比普通CNN检索提高了1000倍。也就是说,每秒处理的视频帧数超过8000帧。我们将继续改进NoScope来支持多类分类,非固定角度监控视频,以及更复杂的检索。
斯坦福新深度学习系统 NoScope:视频对象检测快1000倍的更多相关文章
- Google会思考的深度学习系统
上周五在旧金山举行的机器学习会议上,Google软件工程师Quoc V. Le讲解了Google的"深度学习"系统是如何运作的. "深度学习"需要用到大型计算机 ...
- NNVM打造模块化深度学习系统(转)
[摘录理由]: 之所以摘录本文,主要原因是:该文配有开源代码(https://github.com/dmlc/nnvm):读者能够直接体会文中所述的意义,便于立刻展开研究. MXNet专栏 :NNVM ...
- Deep Learning 10_深度学习UFLDL教程:Convolution and Pooling_exercise(斯坦福大学深度学习教程)
前言 理论知识:UFLDL教程和http://www.cnblogs.com/tornadomeet/archive/2013/04/09/3009830.html 实验环境:win7, matlab ...
- Deep Learning 19_深度学习UFLDL教程:Convolutional Neural Network_Exercise(斯坦福大学深度学习教程)
理论知识:Optimization: Stochastic Gradient Descent和Convolutional Neural Network CNN卷积神经网络推导和实现.Deep lear ...
- Deep Learning 13_深度学习UFLDL教程:Independent Component Analysis_Exercise(斯坦福大学深度学习教程)
前言 理论知识:UFLDL教程.Deep learning:三十三(ICA模型).Deep learning:三十九(ICA模型练习) 实验环境:win7, matlab2015b,16G内存,2T机 ...
- Deep Learning 12_深度学习UFLDL教程:Sparse Coding_exercise(斯坦福大学深度学习教程)
前言 理论知识:UFLDL教程.Deep learning:二十六(Sparse coding简单理解).Deep learning:二十七(Sparse coding中关于矩阵的范数求导).Deep ...
- Deep Learning 11_深度学习UFLDL教程:数据预处理(斯坦福大学深度学习教程)
理论知识:UFLDL数据预处理和http://www.cnblogs.com/tornadomeet/archive/2013/04/20/3033149.html 数据预处理是深度学习中非常重要的一 ...
- Deep Learning 9_深度学习UFLDL教程:linear decoder_exercise(斯坦福大学深度学习教程)
前言 实验内容:Exercise:Learning color features with Sparse Autoencoders.即:利用线性解码器,从100000张8*8的RGB图像块中提取颜色特 ...
- Deep Learning 8_深度学习UFLDL教程:Stacked Autocoders and Implement deep networks for digit classification_Exercise(斯坦福大学深度学习教程)
前言 1.理论知识:UFLDL教程.Deep learning:十六(deep networks) 2.实验环境:win7, matlab2015b,16G内存,2T硬盘 3.实验内容:Exercis ...
随机推荐
- inconsistent line endings 解决方法
I'm using Unity 3D in combination with Visual Studio 2008 on a Windows 7 64 bit system. When savi ...
- Struts2 的工作原理
Struts2 的工作原理: 1)client向server发出一个http请求.webserver对请求进行解析,假设在StrutsPrepareAndExecuteFilter的请求映射路径(在w ...
- Android 编程下获得应用程序的签名
说明:应用程序的签名被封装在 packageInfo 中,所以我们要获得应用程序的签名就需要获得 PackageManager 来获得包含有签名信息的 packageInfo,再通过 packageI ...
- oracle 11gR2 如何修改scan vip 地址 /etc/hosts方式
这次帮客户搭建了一套oracle 11gR2 rac for aix环境,scan vip因为网络调整需要,需要更改以前设置好的scan vip,是采用/etc/hosts的方式,比如将scan vi ...
- Spring框架知识梳理(一) IOC
1 写在前面 Spring框架是在大一的时候学习的,但是经过几个项目下来发现自己只不过会用某些常用的东西,对于Spring家族,虽然现在大都使用Spring Boot开发,但是我发现Spring框架的 ...
- .NET中的异步操作及线程同步
执行异步操作 CLR使用了WIN的线程处理能力,但保留了与其分离的权利.某些时候CLR的线程与Win的线程不是完全的匹配. 线程的系统开销较大,应限制其数量. 创建:分配并初始化一线程内核对象,保留1 ...
- DIV水平方向居中的几种方法
一.使用margin: 1 #center0 { 2 background: red; 3 margin: 0 auto; 4 } 或者: margin: auto; 这样的前提是父盒子里没有其他盒子 ...
- HTML5 CSS3面试题
一.CSS3有哪些新特性? 1. CSS3实现圆角(border-radius),阴影(box-shadow), 2. 对文字加特效(text-shadow.),线性渐变(gradient),旋转(t ...
- JavaScript设计模式学习——builder pattern(建造者模式)
个人理解的应用场景 举个例子,比如想要创建各种类型的车的实例,车的类型有很多种,但创建每种类型车的接口定义可能是一样的,就用到了此模式 相关概念的通俗解释 上述例子中接口的定义叫builder 接口到 ...
- Sqlite简单操作
1.student类 public class Student { int id; String name; String sex; String address; int money; public ...