3月23日起,智东西联合NVIDIA推出「实战营」第一季,共计四期。第三期于4月13日晚8点在智东西「智能安防」系列社群开讲,由西安交通大学人工智能与机器人研究所博士陶小语、NVIDIA高级系统架构师易成二位讲师先后主讲,主题分别为《智能监控场景下的大规模并行化视频分析方法》和《NVIDIA DGX-2 驱动智能监控革命》。

深度学习在图像识别、智能视频分析技术方面的精度不断提升,使得安防成为了深度学习快速落地的最清晰方向之一,而计算力的发展,使得大规模的并行计算成为了可能。西安交通大学人工智能和机器人研究所借助双路Tesla P100 GPU强大的并行计算能力,基于大规模深度神经网络构建了智能视频分析系统,实现了对多路视频流的实时处理以及对大规模离线监控录像的高效分析,极大地加速了视频处理的运行效率。

本文为陶小语博士的主讲实录,共计7192字,预计13分钟读完。在浏览主讲正文之前,可以思考以下四个问题:

-如何正确认知基于深度学习的视频分析技术?
-如何通过多路视频流的数据并行或并发流水线方法实现视频分析系统的并行化?
-在大规模视频分析应用中如何合理、灵活的分配计算资源以实现资源利用最大化?
-如何利用跳帧采样技术避免计算资源浪费、提高资源利用率?

智东西「实战营」第一季第一期由图玛深维首席科学家陈韵强和NVIDIA高级系统架构师付庆平,分别就《深度学习如何改变医疗影像分析》、《DGX超算平台-驱动人工智能革命》两个主题在智东西旗下「智能医疗」社群进行了系统讲解。第二期由NVIDIA深度学习学院认证讲师侯宇涛主讲,主题为《手把手教你使用开源软件DIGITS实现目标检测》。第四期是在智东西旗下「高性能计算」社群开讲,主题为《GPU加速的空间天气预报》,主讲老师为清华大学计算机系副教授都志辉、NVIDIA高级系统架构师易成。

「提醒:如果希望下载每期实战营的完整课件,可以在智东西公众号(zhidxcom)回复关键词“实战营”获取。如果你希望成为讲师,可以回复关键词“讲师”,进行申请」

陶小语:大家晚上好!我是西安交通大学人工智能与机器人研究所博士陶小语,今天讲解的主题是《智能监控场景下的大规模并行化视频分析方法》。这个主题也是我们实验室合作项目里面做的比较多的一个应用。我们是视频监控组,随着深度学习发展,对大规模的视频图像去做智能分析,在安防领域是非常有应用场景的,所以今天我会给大家来讲解一下,我们实验室在智能监控场景下的大规模并行化视频分析方法。

这一次演讲主要是有以下五个部分:

1,智能监控领域的应用背景以及行业进展;
2,基于深度学习的视频分析技术;
3,视频分析系统的组成以及如何对一个视频分析系统进行并行化;
4,基于Tesla P100的视频分析加速平台;
5,P100视频硬解码加速与视频跳帧采样等一些工程化的应用技巧。

一、智能监控领域的应用背景以及行业进展

4

目前来说,智能安防是智慧城市非常重要的一项组成部分。智能安防主要包括视频监控以及人脸识别这些已经落地的商业应用,此外,智能安防还和目前非常火爆的无人驾驶息息相关。

5

从这一页PPT里面我们可以看到视频监控占整个安防行业的50%,而且呈现逐年上升的趋势。在其他方面,包括实体防护、出口控制、防盗报警等几项应用也瓜分了安防市场50%的份额,而近年来,中国安防行业市场规模也在逐年扩大,从2011年的2773亿直接涨到了2017年的6540亿,每年都有15%到20%增长率,是非常具有应用场景的一个行业。

6

智能监控都要做些什么呢?传统的监控领域,仅仅是用监控设备去拍一些监控视频,然后由人来对视频中一些敏感的目标进行分析。而智能视频监控,旨在通过视觉模式识别技术,对监控视频中目标、行为、事件等对象来进行智能识别和分析。比如我需要检测监控场景里面都有哪些目标,其中有人还是车,再分析监控场景中目标的行为,对监控视频中的一些敏感事件进行检测等。

7

随着深度学习技术的发展,智能监控所用到的检测、识别、跟踪等技术已经达到了非常高的精度,大家可以看图中从上到下分别是人脸检测与识别、行人检测与跟踪、行人姿态估计、车辆检测、车型识别以及交互识别等几大主要领域,而视频监控需要把这些领域的技术融合起来,然后对监控视频做各个维度的分析。

二、基于深度学习的视频分析技术

现在我来向大家介绍一下基于深度学习的视频分析技术概括。这张PPT里大致把目前最核心的几个技术给列了出来:

9

首先是目标检测,这个不用介绍,我相信做过视觉的同行大都了解此领域。目标检测和图像分类是视觉技术中一个非常基础的任务,其目的就是跟踪场景中感兴趣的一些物体,包括常规的目标检测、人员检测以及车辆检测等等;

目标检测完成以后,需要针对每个检测到的目标来计算其运动轨迹,根据目标的数量以及摄像头的数量,可以分为单目标跟踪、多目标跟踪,单摄像头跟踪、跨摄像头跟踪等;

人脸识别又是另一个已经落地的商业应用,它主要是为了识别或验证场景中的人脸,包括人脸检测、关键点检测、属性分析、人脸比对以及检索等;

而行为识别是为了识别人体动作以及人与物体之间的交互,现在做行为识别比较简单一点的任务,就是在一段视频中去判断里面是否发生了某个动作,稍微难一点的是做行为检测,需要从一段很长的视频中去找出每个动作所发生的时间段;而更难一些的还要识别出动作的主体、客体以及交互的对象、动作的状态等;

还有一个应用领域是图像增强,也是最近进展比较快的。在我们监控到的视频中,它很容易受到环境和视频采集设备的影响。通常我们采集到的视频是不理想的,伴有噪音、运动模糊等,是需要进行视频方面的增强,比如做超分、去模糊、去抖动以及去雾、去雨雪之类的。

10

下面是一个目标检测的事例。目标检测需要把场景中所有感兴趣的目标逐个地给框出来,并识别出这个目标的类别,也是视频监控分析时所用到的第一步。对于一个场景,我常常需要把场景中的行人、车辆等目标挨个点出来,并且还需要把它们的边框准确的框出来,框出来以后才可以进行下一步再识别等任务。

11

目前检测领域主要分为两大方法:基于区域的检测算法和基于回归的检测算法。基于区域的检测方法,一般是通过两阶段的算法,分为区域候选阶段和区域检测阶段:区域候选阶段,就是通过候选框生成算法先从大图里面找到目标潜在的位置,比如传统的Selective Search、EdgeBoxes和基于CNN的RPN方法;区域检测阶段,就是从区域候选阶段得到候选框后再去做进一步精细的分类和定位,目前主流的方法包括R-CNN以及R-CNN的各种改进版。

基于回归的检测方法是另一个流派,从YOLO开始,到之后的SSD做了进一步的定位优化,这种方法基本上采用的是单阶段直接回归检测框的思路。它比较显著的一个特点就是检测速度非常快,可以做到实时性,它的缺点是,相比基于区域的检测方法,其定位精度往往会差一些。

12

这张图是目前最流行的基于区域的Faster R-CNN检测算法的示意图。

13

完成检测以后,我们仅仅是知道场景中有哪些目标以及它们的位置,如果需要做进一步分析,需要知道每个目标的ID是多少,同时还需要跟踪每个目标的运动轨迹来确定视频里面每一帧目标所属的ID。目前做行人的tracking需要较好的ID特征,通常先用Person ReID任务的数据集训练一个网络,然后提取一个比较好的特征计算轨迹,常用的方法是Sort和Deep Sort。

14

接下来是人脸识别技术,相信大家也都是非常熟悉了。就是先检测人脸,然后定位出他的特征点,再进一步用特征点对其进行属性分析,之后再做人脸检索,关键点跟踪等等,还有一个任务就是人脸比对,也是目前商业公司做得非常多的一个任务,现在精度已经做得非常高了,商用是完全没问题的。

15

目前人脸识别的研究进展主要是由工业界贡献。对于结构,在学术领域主要用主流的那几个,还有一些改loss的方法,比如center loss和sphereface。到工业界后,大家都有各自数据源,主要精力都用在一些工程化的调优上。

三、视频分析系统的组成及并行化方案设计

接下来是本次课程的核心部分——视频分析系统的组成以及并行化方案设计。视频分析系统主要包括以下几个阶段:

17

第一步,视频采集,把模拟视频转换成数字视频,再把数字视频文件进行保存;
第二步,视频解码,对原始的视频进行解压缩,再转化为可以被深度学习模型处理的图像序列;
第三步,视频分析,它是整个视频分析系统最核心的阶段,也是主要的算力所在,包括目标检测、特征提取、目标跟踪和特征存储等模块。
最后,视频检索,根据输入的待检索目标,进行特征比对以及轨迹匹配。

18

以行人监控视频分析为例,视频分析和视频检索阶段包括以上流程,首先是监控视频流的获取,采集到监控视频以后,需要对视频进行解码,解码之后再做一个转码,把它转成单帧图片的格式,然后对每一张图片进行行人检测,检测完后再根据检测得到的检测框从图片中提取行人特征,再根据提取得到的行人特征来计算行人的轨迹,当完成跟踪以后,可以把行人特征和轨迹进行结构化存储来便于之后的检索。

检索的时候,对一张待检索图片用同样的模型去提取行人特征,并在数据库里面进行特征比对,找到最相似的行为特征所对应的行人ID。从而可以根据之前视频分析得到的行人数据来找出所需要检测的行人对应的视频频段。

19

如果对视频分析系统各个算法模块的计算资源来进行划分的话,我们可以看到视频解码可以用CPU来做软解或者是用GPU来做硬解,而检测部分,GPU的计算主要在CNN的推理,NMS可以放在CPU上,也可以由GPU来算,对于行人特征提取,基本上全都是在GPU上来完成计算的,行人轨迹一般是需要在CPU上来计算,最后需要把计算得到的特征和轨迹存入数据库里面,这一块IO(输入/输出)占得比较多。

20

当视频监控数据非常大且手头计算资源又比较充裕的时候,可以把这些监控视频分析划分到不同的GPU上,通过数据并行的方法来进行并行加速。先给出一个比较简单的方案——方案A:多路视频流的数据并行。视频解码、行人检测和特征提取这部分,对于每一段视频流来说都是独立的,可以把它直接进行分片,而对于行人轨迹的计算,由于可能存在跨摄像头的行人跟踪,所以需要把不同视频流之间的同一个行人的轨迹连起来,这部分需要放在CPU上来算,而且还需要等每一个视频流的行人特征提取完成之后,才把行人的一整条轨迹给计算出来,并把它存储到数据库里面。

21

方案B——并发流水线,像刚才数据并行方案,如果用进程实现的话,可以用一个GPU进程来处理一条并行链路,最后在CPU上做一个轨迹的计算。还有一种方案就是所有任务同时进行,这种是采用并发流水线的设计,这套系统里面所有的模块都是处于异步状态,调度模块的时候是通过任务槽的形式来进行,而模块之间的数据共享通过队列来实现。

比如我设置了n个解码器来对n路视频进行解码,解码的结果我直接把它放到一个帧队列里面,与此同时,检测器也随时从帧队列中去取解码得到的视频帧,直接进行检测,检测完后再把检测的结果放到检测框队列里面,而特征提取器也从检测框队列里面去取已经检测得到的检测框,最后去计算特征,这几个模块采用异步多进程的方法,通过进程复用队列来实现数据交换。

使用这种方案比较明显的一个优点是它对于每一块的调度是非常灵活的。比如有一段时间,视频里面出现的行人目标可能比较少,这时就可以把特征提取器设置少一点,把检测器设置相对多一些,从而可以实现资源最大化的利用。

22

这里用到了任务槽或者池化任务槽。就是将GPU资源池划分为任务槽,每个任务槽预置一个处于挂起状态的GPU任务,根据每个任务的算力需求以及任务在运行时的出错情况来动态更新任务状态。比如在上图中,以D开头的任务槽是用来放检测进程的;而F开头的任务槽是用来放特征提取进程的,我可以给检测进程划分四个槽,给特征进程也划分四个槽,在默认的情况下,我可以激活检测进程的三个槽,关闭一个槽,而特征进程,我可以开启两个槽,关闭两个槽。这是因为检测通常对算力的需求会比特征提取的任务要高一些,比如检测一张图的时间要远远比提取一个patch的时间要多很多,所以我会把更多的资源给到检测这一部分,如果遇到了一个密集场景,里面有非常密集的行人目标时,我可以适当地关闭一些检测进程的槽,同时开启一些特征进程的槽。

这种方法还能够比较有效地应对一些出错的情况,比如像图中GPU 1上的 F11进程挂掉了,这时可以直接把F12打开,让F12进程去接替F11进程的工作,因为我们是采用队列来实现进程之间数据的通信,所以是非常灵活的,不存在进程只能处理分配给自己的数据的这种情况。

四、基于Tesla P100的视频分析加速平台

24

我们基于双路Tesla P100 GPU加速器搭建了视频分析并行加速平台,最多可以支持八路视频流的实时解析,意思是每片卡可以解析4路。Tesla P100加速器是NVIDIA Pascal架构的核心产品,其中的一个特点就是采用了HBM 2的CoWos技术来提高内存带宽,P100的带宽可以达到700GB/s 以上,相比于Maxwell架构有了非常大的提升。

25

我们选取方案A,采用双路P100 加双路E5-2620v4的硬件平台来搭视频分析的加速平台。通过监控设备采集到的视频流会由P100硬解码模块解码成图片,然后输入到每一路检测器里面,P100主要是用来加速行人检测以及行人特征提取,而行人轨迹计算和轨迹特征存储则由CPU来处理。

26

本页PPT主要说明了我们视频分析模块所用到的模型,框架是基于TensorFlow1.3实现;行人检测用的是SSD-MobileNet-V1版,在COCO 上pretrain(预训练)之后用内部的行人数据集来做了一下finetune;对于行人特征提取,我们自己做了一个8层的reid网络,然后在CUHK03 + Maket上做了一个pertrain(预训练);行人轨迹用的是比较流行的DeepSort方法,最后的结构化存储直接用SQLite来实现。

27

这一页PPT是行人检测模型SSD-MobileNet-V1在不同的芯片上的单帧计算时间,可以看到,我们用了P100加速卡后,相对于前代的K80卡片有了非常显著的提升,1路的单帧时间从80毫秒缩短到60毫秒,在检测任务上,可以提供一个比较好的实质性需求。

值得注意的一点是从1路到2路,大家可以看到单帧的计算时间基本上没有延长多少的,而经过3路和4路以后,它的计算时间显著提升,这主要是因为我们现在用的SSD-MobileNet模型,它并没有把CUDA核心全都占满,所以我们只用一路的话,还有非常多资源能够赋予核心,一般做到4路仍能保证加速效率。

28

这页是一段时长为23分12秒的离线行人监控视频进行测试的结果,在检测和跟踪的时候,我们每秒采样6帧,累计采了8356帧,分别在K80和P100设备上进行测试。可以看到,用P100时,GPU计算时长得到了极大地缩短。使用两个GPU节点,每个GPU节点跑两个任务数时,可以达到一个比较理想的并行效果,有将近90%的加速效率。

29

这张图是几种不同加速平台之间加速比的对比。可以看到使用了双路P100以后,视频的处理时间缩短到了几个小时,同时也可以实时地进行监控数据分析。

五、P100视频硬解码加速与视频跳帧采样

31

32

这一部分是视频软解和视频硬解的介绍,我们这一次用到了P100的视频硬解码功能,上面这张图,P100是通过MVDEC来做视频硬解,它支持MPEG-2和H.264主流的视频格式。而相比于前一代,支持的分辨率也有非常显著的提升,从4K提升到了8K。

33

34

使用P100进行硬解码非常简单,可以直接使用FFMPEG库来用NVIDIA提供的H264 CUVID解码库来解码。

36

最后给大家讲解一下视频跳帧采样技术。视频分析平台里面用到了很多工程上的trick。比如,在很多情况下,我们拍到的监控录像,有时候可能人流量非常的稀疏,有时候可能人流量非常的密集,对于不同的情况,计算需求也是不一样的。对于人流量稀疏的时间段,如上班前、下班后,如果是每一帧每一帧地检测,肯定会在这种空白帧计算上消耗很大的资源,对于此,我们通常会通过跳帧来进行检测。

37

举个例子,我可以先把整段时间划分为若干个步长,同时保证每个步长是最小目标出现轨迹长度的一半,然后用这个步长进行跳帧检测。比如之前是对于每一帧都去检测,但现在可以隔上两三秒再去测一帧,直到检测到某一帧出现目标以后才开始进行辨识检测,等目标消失之后,再接着进行跳帧检测,这样可以非常大地提高资源利用率,避免计算资源浪费在一些没有意义的场景上。

以上就是本次演讲的内容,谢谢大家收听。

另外,二位讲师陶小语博士和易成在Q&A环节回答了7位用户的提问:

问题一
刘修综-纬创资通(昆山)有限公司

1,如何在不依靠开源平台下开发神经网路模型?
2,如何在开源平台下,对FP32/16做算法优化?

陶小语:1,开源平台的优势在于封装并优化了算法基元、计算逻辑、任务调度、存储管理等,便于开发、训练和部署模型。对于专用硬件平台下的模型,可以考虑针对硬件架构自己写算法,或移植开源平台的算法。
2,首先要考虑算法的权重、梯度和量级,很多算法的权重梯度有非常小的指数(如SSD 1e-60~1e-11),使用FP16导致梯度置0而显著降低精度,一般通过quantization [1],mixed precision key [2],loss-scaling等技术来解决精度损耗问题。目前开源平台普遍支持混合精度训练(MPT),感兴趣的朋友可以参考以下资料:http://docs.nvidia.com/deeplearning/sdk/mixed-precision-training/index.html
[1] Hubara I, Courbariaux M, Soudry D, et al. Quantized Neural Networks: Training Neural Networks with Low Precision Weights and Activations[J]. 2016.
[2] Micikevicius P, Narang S, Alben J, et al. Mixed Precision Training[J]. 2017.

问题二
彭达-商汤科技-技术总监

是否在单机环境测试过该系统,能否讲下具体流程与细节?

陶小语:我们分别在P100双卡和K80八卡环境下,用多个行人/车辆的离线视频文件模拟多路视频。平台基于tf-1.3搭建,使用ffmpeg + cuvid硬解并转码到内存中,检测基于SSD-MobileNet-V1(fast) / SSD-Inception-V2(normal) / FasterRCNN-Res101(acc),在COCO+kitti+内部数据上pretrain,NMS下沉到GPU上,行人特征基于ReID数据集上pretrain得到的模型,跟踪算法基于deep sort。单卡测了1~4路视频的处理,最多可以做到6路来保证实时性,但需要适当降低采样率。4 GPU近线性加速(加速效率88~98%),继续增加视频路数CPU算力逐渐跟不上(2620睿最高2.3G),16GPU会加速效率退化到34%左右。

问题三
陈凯韬-北京航空航天大学-深度学习博士

1,连续关键帧人物行为分析的特点
2,深度学习在视频编解码方面的应用

陶小语:1,单纯对行为识别而言,简化了问题,一段视频包含一段确定的动作,label唯一确定,缺少环境干扰。难点在于如何自动识别关键帧,如何得到具有判别力的特征,如何编码并融合temporal和spatial的信息,基本套路是two-stream (rgb+optical flow/motion vector),CNN-LSTM做长序列,video segment,detection proposal,3D conv,还有近期的non-local nn
2,深度学习在视频编解码方面主要做图片、视频的压缩。

问题四
王言君-力瀚科技-技术总监

想问下陶博士,视频分析领域有哪些有前景的算法?

陶小语:
学术界的算法侧重精度,很多工作是对一些主流框架进行改进的。对工业应用而言,更看重速度、算力、能耗,很多场景下使用的还是成熟的传统方法,如DSP上做检测的DPM、手机上做人脸特征点定位的AMM、Dlib。基于CNN的方法,检测的话如Faster R-CNN/SSD 以及增强版FPN/RetinaNet/Mask R-CNN都是比较好的。分割的话,最近比较热的是Deeplab v3+,google已经放出了code。Tracking部分我们用的是DeepSort,行为识别,像比赛用的比较多的 TSN+I3D/C2D+TSN等,而FAIR去年出的Non-local NN也比较有意思。

问题五
焦超-天瞳威视-深度学习工程师

如何快速进行服务器并行架构环境搭建?有什么好的教程?

陶小语:1,最快就是做数据并行,对数据分片,系统直接做多个副本;
2,选取易用的DL框架,像mxnet-gluon / pytorch;
3,先写个串行系统,测算各模块存储、带宽、资源利用率等,再根据服务器硬件平台结构设计并行方案。关于教程可以参照各DL框架的并行API,主要部分还是要针对专用任务设计。

问题六
曹伟-安维尔信息技术-工程师

如何利用桌面显卡合理的搭建多视频实时深度网络分析系统

陶小语:消费卡(像txp, tv)在搭建分析平台时并无太大区别,需要事先测算视频分析系统各模块的资源占用情况,来设计并行方案。比如,选用tensorflow 自带的Faster R-CNN代码做推理,单卡GPU利用率大概只有40%,那么可以增加batch大小或视频路数把GPU利用率占满。同时要衡量CPU利用率和存储,来调整任务分配。不同的框架在存储和资源管理上是有差异的。像Caffe这种跑一个ResNet就会占满12G显存的,除非预先算好BN-scale-relu,否则多路是比较难的。轻量级的,像mxnet,单卡跑满8路没压力的,这个需要具体任务/具体框架具体分析。

问题七
郑少飞-安徽大学-计算机视觉方向

在什么情况下需要用到GPU并行计算,也即什么样的任务或者说什么量级的数据会需要用集群?我们平时是在高校做研究,对这个问题体会不深,希望您能通过具体例子解释一下。

陶小语:有很多场景都会用到大规模GPU并行集群,正如我在PPT中介绍的,比如百度的语音识别系统,网络模型有3亿个参数,需要20 亿亿次EFLOPS 计算量;谷歌的自然语言翻译系统,有87亿个参数,需要100亿亿次计算量。这些神经网络模型做训练,都需要GPU集群。

易成:这个问题,我也来补充下,做多GPU并行,主要针对算力要求非常高的场景,比如训练大规模数据集,像刷ImageNet,COCO等。或是处理大量的监控视频等。对于高校科研,在小数据集上调算法,几块卡就够了,除非是做网格式调参可能需要一个集群。