智能监控场景下进行大规模并行化视频分析?西安交大博士教给你
来自China Digital Space
随着深度学习技术的发展,智能监控所用到的检测、识别、跟踪等技术已经达到了非常高的精度。
3月23日起,智东西联合NVIDIA推出「实战营」第一季,共计四期。第三期于4月13日晚8点在智东西「智能安防」系列社群开讲,由西安交通大学人工智能与机器人研究所博士陶小语、NVIDIA高级系统架构师易成二位讲师先后主讲,主题分别为《智能监控场景下的大规模并行化视频分析方法》和《NVIDIA DGX-2 驱动智能监控革命》。
深度学习在图像识别、智能视频分析技术方面的精度不断提升,使得安防成为了深度学习快速落地的最清晰方向之一,而计算力的发展,使得大规模的并行计算成为了可能。西安交通大学人工智能和机器人研究所借助双路Tesla P100 GPU强大的并行计算能力,基于大规模深度神经网络构建了智能视频分析系统,实现了对多路视频流的实时处理以及对大规模离线监控录像的高效分析,极大地加速了视频处理的运行效率。
本文为陶小语博士的主讲实录,共计7192字,预计13分钟读完。在浏览主讲正文之前,可以思考以下四个问题:
-如何正确认知基于深度学习的视频分析技术?
-如何通过多路视频流的数据并行或并发流水线方法实现视频分析系统的并行化?
-在大规模视频分析应用中如何合理、灵活的分配计算资源以实现资源利用最大化?
-如何利用跳帧采样技术避免计算资源浪费、提高资源利用率?
智东西「实战营」第一季第一期由图玛深维首席科学家陈韵强和NVIDIA高级系统架构师付庆平,分别就《深度学习如何改变医疗影像分析》、《DGX超算平台-驱动人工智能革命》两个主题在智东西旗下「智能医疗」社群进行了系统讲解。第二期由NVIDIA深度学习学院认证讲师侯宇涛主讲,主题为《手把手教你使用开源软件DIGITS实现目标检测》。第四期是在智东西旗下「高性能计算」社群开讲,主题为《GPU加速的空间天气预报》,主讲老师为清华大学计算机系副教授都志辉、NVIDIA高级系统架构师易成。
主讲环节
陶小语:大家晚上好!我是西安交通大学人工智能与机器人研究所博士陶小语,今天讲解的主题是《智能监控场景下的大规模并行化视频分析方法》。这个主题也是我们实验室合作项目里面做的比较多的一个应用。我们是视频监控组,随着深度学习发展,对大规模的视频图像去做智能分析,在安防领域是非常有应用场景的,所以今天我会给大家来讲解一下,我们实验室在智能监控场景下的大规模并行化视频分析方法。
这一次演讲主要是有以下五个部分:
1,智能监控领域的应用背景以及行业进展;
2,基于深度学习的视频分析技术;
3,视频分析系统的组成以及如何对一个视频分析系统进行并行化;
4,基于Tesla P100的视频分析加速平台;
5,P100视频硬解码加速与视频跳帧采样等一些工程化的应用技巧。
智能监控领域的应用背景以及行业进展
目前来说,智能安防是智慧城市非常重要的一项组成部分。智能安防主要包括视频监控以及人脸识别这些已经落地的商业应用,此外,智能安防还和目前非常火爆的无人驾驶息息相关。
从这一页PPT里面我们可以看到视频监控占整个安防行业的50%,而且呈现逐年上升的趋势。在其他方面,包括实体防护、出口控制、防盗报警等几项应用也瓜分了安防市场50%的份额,而近年来,中国安防行业市场规模也在逐年扩大,从2011年的2773亿直接涨到了2017年的6540亿,每年都有15%到20%增长率,是非常具有应用场景的一个行业。
智能监控都要做些什么呢?传统的监控领域,仅仅是用监控设备去拍一些监控视频,然后由人来对视频中一些敏感的目标进行分析。而智能视频监控,旨在通过视觉模式识别技术,对监控视频中目标、行为、事件等对象来进行智能识别和分析。比如我需要检测监控场景里面都有哪些目标,其中有人还是车,再分析监控场景中目标的行为,对监控视频中的一些敏感事件进行检测等。
随着深度学习技术的发展,智能监控所用到的检测、识别、跟踪等技术已经达到了非常高的精度,大家可以看图中从上到下分别是人脸检测与识别、行人检测与跟踪、行人姿态估计、车辆检测、车型识别以及交互识别等几大主要领域,而视频监控需要把这些领域的技术融合起来,然后对监控视频做各个维度的分析。
基于深度学习的视频分析技术
现在我来向大家介绍一下基于深度学习的视频分析技术概括。这张PPT里大致把目前最核心的几个技术给列了出来:
首先是目标检测,这个不用介绍,我相信做过视觉的同行大都了解此领域。目标检测和图像分类是视觉技术中一个非常基础的任务,其目的就是跟踪场景中感兴趣的一些物体,包括常规的目标检测、人员检测以及车辆检测等等;
目标检测完成以后,需要针对每个检测到的目标来计算其运动轨迹,根据目标的数量以及摄像头的数量,可以分为单目标跟踪、多目标跟踪,单摄像头跟踪、跨摄像头跟踪等;
人脸识别又是另一个已经落地的商业应用,它主要是为了识别或验证场景中的人脸,包括人脸检测、关键点检测、属性分析、人脸比对以及检索等;
而行为识别是为了识别人体动作以及人与物体之间的交互,现在做行为识别比较简单一点的任务,就是在一段视频中去判断里面是否发生了某个动作,稍微难一点的是做行为检测,需要从一段很长的视频中去找出每个动作所发生的时间段;而更难一些的还要识别出动作的主体、客体以及交互的对象、动作的状态等;
还有一个应用领域是图像增强,也是最近进展比较快的。在我们监控到的视频中,它很容易受到环境和视频采集设备的影响。通常我们采集到的视频是不理想的,伴有噪音、运动模糊等,是需要进行视频方面的增强,比如做超分、去模糊、去抖动以及去雾、去雨雪之类的。
下面是一个目标检测的事例。目标检测需要把场景中所有感兴趣的目标逐个地给框出来,并识别出这个目标的类别,也是视频监控分析时所用到的第一步。对于一个场景,我常常需要把场景中的行人、车辆等目标挨个点出来,并且还需要把它们的边框准确的框出来,框出来以后才可以进行下一步再识别等任务。
目前检测领域主要分为两大方法:基于区域的检测算法和基于回归的检测算法。基于区域的检测方法,一般是通过两阶段的算法,分为区域候选阶段和区域检测阶段:区域候选阶段,就是通过候选框生成算法先从大图里面找到目标潜在的位置,比如传统的Selective Search、EdgeBoxes和基于CNN的RPN方法;区域检测阶段,就是从区域候选阶段得到候选框后再去做进一步精细的分类和定位,目前主流的方法包括R-CNN以及R-CNN的各种改进版。
基于回归的检测方法是另一个流派,从YOLO开始,到之后的SSD做了进一步的定位优化,这种方法基本上采用的是单阶段直接回归检测框的思路。它比较显著的一个特点就是检测速度非常快,可以做到实时性,它的缺点是,相比基于区域的检测方法,其定位精度往往会差一些。
这张图是目前最流行的基于区域的Faster R-CNN检测算法的示意图。
完成检测以后,我们仅仅是知道场景中有哪些目标以及它们的位置,如果需要做进一步分析,需要知道每个目标的ID是多少,同时还需要跟踪每个目标的运动轨迹来确定视频里面每一帧目标所属的ID。目前做行人的tracking需要较好的ID特征,通常先用Person ReID任务的数据集训练一个网络,然后提取一个比较好的特征计算轨迹,常用的方法是Sort和Deep Sort。
接下来是人脸识别技术,相信大家也都是非常熟悉了。就是先检测人脸,然后定位出他的特征点,再进一步用特征点对其进行属性分析,之后再做人脸检索,关键点跟踪等等,还有一个任务就是人脸比对,也是目前商业公司做得非常多的一个任务,现在精度已经做得非常高了,商用是完全没问题的。
目前人脸识别的研究进展主要是由工业界贡献。对于结构,在学术领域主要用主流的那几个,还有一些改loss的方法,比如center loss和sphereface。到工业界后,大家都有各自数据源,主要精力都用在一些工程化的调优上。
视频分析系统的组成及并行化方案设计
接下来是本次课程的核心部分——视频分析系统的组成以及并行化方案设计。视频分析系统主要包括以下几个阶段:
第一步,视频采集,把模拟视频转换成数字视频,再把数字视频文件进行保存;
第二步,视频解码,对原始的视频进行解压缩,再转化为可以被深度学习模型处理的图像序列;
第三步,视频分析,它是整个视频分析系统最核心的阶段,也是主要的算力所在,包括目标检测、特征提取、目标跟踪和特征存储等模块。
最后,视频检索,根据输入的待检索目标,进行特征比对以及轨迹匹配。
以行人监控视频分析为例,视频分析和视频检索阶段包括以上流程,首先是监控视频流的获取,采集到监控视频以后,需要对视频进行解码,解码之后再做一个转码,把它转成单帧图片的格式,然后对每一张图片进行行人检测,检测完后再根据检测得到的检测框从图片中提取行人特征,再根据提取得到的行人特征来计算行人的轨迹,当完成跟踪以后,可以把行人特征和轨迹进行结构化存储来便于之后的检索。
检索的时候,对一张待检索图片用同样的模型去提取行人特征,并在数据库里面进行特征比对,找到最相似的行为特征所对应的行人ID。从而可以根据之前视频分析得到的行人数据来找出所需要检测的行人对应的视频频段。
如果对视频分析系统各个算法模块的计算资源来进行划分的话,我们可以看到视频解码可以用CPU来做软解或者是用GPU来做硬解,而检测部分,GPU的计算主要在CNN的推理,NMS可以放在CPU上,也可以由GPU来算,对于行人特征提取,基本上全都是在GPU上来完成计算的,行人轨迹一般是需要在CPU上来计算,最后需要把计算得到的特征和轨迹存入数据库里面,这一块IO(输入/输出)占得比较多。
当视频监控数据非常大且手头计算资源又比较充裕的时候,可以把这些监控视频分析划分到不同的GPU上,通过数据并行的方法来进行并行加速。先给出一个比较简单的方案——方案A:多路视频流的数据并行。视频解码、行人检测和特征提取这部分,对于每一段视频流来说都是独立的,可以把它直接进行分片,而对于行人轨迹的计算,由于可能存在跨摄像头的行人跟踪,所以需要把不同视频流之间的同一个行人的轨迹连起来,这部分需要放在CPU上来算,而且还需要等每一个视频流的行人特征提取完成之后,才把行人的一整条轨迹给计算出来,并把它存储到数据库里面。
方案B——并发流水线,像刚才数据并行方案,如果用进程实现的话,可以用一个GPU进程来处理一条并行链路,最后在CPU上做一个轨迹的计算。还有一种方案就是所有任务同时进行,这种是采用并发流水线的设计,这套系统里面所有的模块都是处于异步状态,调度模块的时候是通过任务槽的形式来进行,而模块之间的数据共享通过队列来实现。
比如我设置了n个解码器来对n路视频进行解码,解码的结果我直接把它放到一个帧队列里面,与此同时,检测器也随时从帧队列中去取解码得到的视频帧,直接进行检测,检测完后再把检测的结果放到检测框队列里面,而特征提取器也从检测框队列里面去取已经检测得到的检测框,最后去计算特征,这几个模块采用异步多进程的方法,通过进程复用队列来实现数据交换。
使用这种方案比较明显的一个优点是它对于每一块的调度是非常灵活的。比如有一段时间,视频里面出现的行人目标可能比较少,这时就可以把特征提取器设置少一点,把检测器设置相对多一些,从而可以实现资源最大化的利用。
这里用到了任务槽或者池化任务槽。就是将GPU资源池划分为任务槽,每个任务槽预置一个处于挂起状态的GPU任务,根据每个任务的算力需求以及任务在运行时的出错情况来动态更新任务状态。比如在上图中,以D开头的任务槽是用来放检测进程的;而F开头的任务槽是用来放特征提取进程的,我可以给检测进程划分四个槽,给特征进程也划分四个槽,在默认的情况下,我可以激活检测进程的三个槽,关闭一个槽,而特征进程,我可以开启两个槽,关闭两个槽。这是因为检测通常对算力的需求会比特征提取的任务要高一些,比如检测一张图的时间要远远比提取一个patch的时间要多很多,所以我会把更多的资源给到检测这一部分,如果遇到了一个密集场景,里面有非常密集的行人目标时,我可以适当地关闭一些检测进程的槽,同时开启一些特征进程的槽。
这种方法还能够比较有效地应对一些出错的情况,比如像图中GPU 1上的 F11进程挂掉了,这时可以直接把F12打开,让F12进程去接替F11进程的工作,因为我们是采用队列来实现进程之间数据的通信,所以是非常灵活的,不存在进程只能处理分配给自己的数据的这种情况。
基于Tesla P100的视频分析加速平台