我叫黄君实,来自于 360 人工智能研究院,目前主要在从事视频内容分析,以及视频推荐一些相关的工作。今天,我要分享的主要内容是关于视频内容的理解和应用。
在这个分享当中,我将选取视频内容理解里几个比较典型的场景来介绍我们的一些场景定义,我们遇到的一些问题和难点,以及我们的技术体相关的一些解决方案。
这是我们今天的大纲。首先,我会从背景上来介绍我们目前搭建的一个关于视频内容理解的服务平台,即视频大脑。接着我会挑选以下三个比较典型的场景来介绍我们的视频内容理解的实际落地应用和一些相关技术,这三个场景包括,移动端的视频特效、远端的互联网视频内容分析,以及智能生活的辅助驾驶系统。最后,是我在参与这些项目当中总结出来的一些个人经验和想法,希望对大家未来的工作会有所帮助。
我们进入第一部分,关于视频大脑的概述。
我想大家可能都有所感受,身边越来越多的人都在讨论大数据、IoT 和人工智能,智能手机、智能摄像头等智能设备也确实在慢慢地渗透到人们生活当中,并且对人们的社会工作、生活造成了一些潜移默化的影响。智能设备的普及也在悄悄地改变人们的交流方式,相信大家也看到了身边越来越多的人不是在使用图片,或者文本来进行交流,更多的是以视频的形式来进行日常沟通交流。这就是说,视频已经成为了人们记录生活的一种主流模式了。
在这种时代背景下,人们就开始去研究如何理解、识别并分析利用海量视频里的一些有用信息。人工智能的发展则开启了一扇新的大门,基于大数据和人工智能、以及机器学习的一些算法,人们开始教会了机器如何去自动地抽取、识别、理解视频里的内容,进而推动了整个社会更加智能化地发展,欢迎大家来到视频时代。
首先,我们用几组数据来看一下目前视频行业的发展现状。这是一份 2017 年的报告,该报告显示,目前互联网上 70% 的流量来自于视频,而 2017 年移动网络视频用户规模已经达到了 5.25 亿人。同年,中国智能可穿戴设备的市场规模也达到了 260 亿人民币,而且随着时间的推移,所有的数据还在迅猛地增长。右侧是 360 公布的相关数据,从这些数据里面,相信大家不难看出来,视频正在慢慢地成为我们未来生活的一种主流模式,成为我们未来信息交互的一种主要媒介。在这个时代背景下,如何对视频内容进行分析和理解,就显得尤为重要了。在这个背景下,360 推出来了视频大脑的概念,以迎接未来信息时代的挑战。
什么是视频大脑呢?视频大脑实际上就是基于一系列场景方案,在云端搭建一些相关的服务,对视频里面的图像、文本、声音进行分析和理解的服务性平台。
关于视频上的技术图谱,我将挑选短视频这个场景来做大概的介绍。
在 短视频 这个场景里,我们实现了如下几个功能,如 智能选品,即如何从一些相似的视频里选取一个质量较高的视频,以及从一个视频里挑选一些质量较高的帧作为视频封面。视频指纹的 主要目的则在于用一组数据来表征视频里某些特定内容。智能标签 主要目的在于用丰富的文本标签来表征视频所属的类别。
所有的这些解决方案,实际上是基于一系列相似的数据、技术进行不同的定制化得到的。为了使这些功能和技术落地成为可能,在 360 内部,我们做了以下的一些基础服务和架构,如构建了云训练平台,主要包括 Hbox,一个多机多卡的离线训练平台;Online Learning,即实时的、以输入流式数据来进行实时训练的平台;以及一个轻量级的边端部署平台,叫做 Std-CNN,这个平台使得很多模型快速训练、更新,以及在移动端的部署成为了可能。
同时,我们还做了一些模型加速方面的工作,来进一步提高模型的运行速度。此外,我们还对模型的结构进行了深入优化,如提出 NIN、DPN、MFN 等基础结构,来进行模型精度和速度优化。在这些基础之上,我们就可以根据不同的场景,整合出不同的技术,来推出不同的产品功能,进而推动整个社会智能化的发展。
这是我们视频大脑的设计平台,从最上端可以看出,用户是通过 RESTful API 来同整个平台进行交互的。在这个平台的内部核心,是一些基础服务和基本解决方案。该平台还实现了一些产品化的设计,如用户可以通过调度器来实现计算资源弹性调度,整个任务内部是进行异步的流式处理。同时,我们还有一些优先级的设置、任务监控、可视化的等产品功能。
下面我们深入到平台内部,挑选几个比较典型的场景,介绍其中的一些落地方案与相关技术。
首先第一个场景是关于 视频信息流 的。在视频信息流当中,视频的生产、审核和内容分析贯穿了视频的整个生命周期。在这个场景下面,我将主要挑选 视频特效 和 内容结构化 两个子场景来进行详细介绍。
1.移动端视频特效
在 视频特效场景中,我们的主要目的是构建一些功能多样,但是又比较小巧、易于部署移动端 SDK。内容结构化则研究如何从用户的行为及视频内容数据里挖掘出比较丰富的视频标签,或者说理解视频的整体内容,进行视频相关的产品落地。
这个视频展示的是我们实现的实时人脸检测、定位、及属性分析的 Demo。在这个 Demo 里,我们解决了 姿态、形变,以及遮挡 带来的问题。视频防抖 也是我们研究的一个重点,我们通过对前后帧的特征抽取,以及特征对齐校正,将前后帧进行对齐、裁剪,来达到视频防抖的目的。最后,基于所有这些基础技术,我们还实现了一些炫酷的功能,如实时特效,在特效里加入美颜、化妆,以及手势特效等。
下面我们讲一些技术细节。
首先在 产品特效 里,大家都知道人脸的检测和定位实际上是至关重要的基础技术。我们的主要目的是在移动端进行人脸检测定位的部署。
这种情况下,就需要我们在网络模型的速度和精度之间取得相对平衡。在人脸检测方面,我们还是基于 CNN,我相信这跟很多人的做法比较类似,但是区别在于,我们设计了一些底层的基础结构,比如我们提出 DPN 保证检测的精度,同时根据以往的经验,进行模型结构的优化来进行加速。为了能够在移动端部署我们的人脸检测模型,我们对视频进行隔帧检测,并基于检测框在帧与帧之间进行平滑来保证检测框的稳定。基于这整套方案,在苹果 A9 端处理器上,针对一个 640P 的视频,我们基本能达到 30fps 的检测速度。
基于人脸检测的结果,关键点定位就是定位检测框所覆盖的人脸关键点。一般地,我们会把关键点定位问题建模成回归每个人脸关键点相对于检测框中心点的相对位移。在定位的第一步,为了保证精度,我们采用了深度模型来进行关键点的初始化,从第二步开始的迭代过程中,我们直接采用了 LR 模型来进行关键点的微调,使模型在整体的精度和速度上取得了一定的平衡。在这个流程当中,比较困难的点在于很多时候,会有一些极端的情况发生,比如大姿态、大形变,或者大遮挡。针对这种情况,我们根据已有的 3D 人脸重建技术,生成一些虚拟样本,来丰富我们的训练数据集。
这就是我们人脸检测和关键点定位的大致流程。
智能扣图 也是另一个视频特效里比较重要的基础技术。相对于人脸检测或关键点定位,实际上前背景的分割问题具有更大的挑战性。因为我们知道,这个问题需要对图片里所有的像素点进行分类,比如:区分图片中的前景和背景。
基于 FCN 模型的智能扣图算法实际上存在很多问题,比如它对小物体的检测效果并不好,因为它最终的输出尺寸是相对较小的,而且很多物体边缘是相对比较模糊的。
针对这些问题,我们主要采用了如下一些方法,比如:直接选取了 HyperNet,一个 U 形的网络结构作为基础网络,以增大最终的响应图,这可以很好地处理一些小尺寸物体的分割问题。
这里需要注意一个细节,为了保证整体的速度,在进行上采样的时候,针对一些尺寸较大的响应图,我们直接采用了差值的方式;而对于一些尺寸较小的响应图,则采用了 Deconvolution 的方式,这也是对分割模型的精度和速度进行平衡的一种常见做法。
同时,为了缓解边缘模糊的问题,我们一般采用层级特征融合,把不同层的特征融合起做为图片的特征表征,并进行前背景预测。另外,上下文信息有时候非常重要,大家都可以考虑用一下。
最后一个比较关键的地方,不同于常见的 ReLU 的激活函数,我们采用了 CReLU 作为模型的激活函数。由于该函数额外使用了每层输出结果进行取反后的响应图,所以它能够在保持输出层的 channel 不变的前提下,减少 1/2 的计算量。右上角是智能扣图及合成的 Demo,可以看出,随着摄像头角度的偏转,光照情况发生变化,我们的模型基本上都能够取得相对较好的前背景分割效果。
这些基础技术都有一个共同的难点,即如何设计一个高精度的网络。我们知道,实际上提高模型的精度有很多种方式,比如说最简单最直观的方法,就是加大加深一个网络的结构,另一种方式是使用多特征进行特征融合。
我们先来看一下之前的人都是怎么做的吧。首先,对于传统 CNN 产生的特征,有人提出,为什么不对旧的特征进行修正改进之后,把它加回到原始的特征当中,来进行特征的更新?不难看出,这实际上就是 Residual Network;后来有人有觉得“加进去”这个方法好像也不是太好,有没有其他的方式进行特征融合呢?对一个旧的特征进行特征探索之后,把它作为新的特征串进去,这就是我对 DenseNet 一个简单的解读。
既然”加”和“串”的方法都可行,为什么不直观一点,同时把它们“串起来”并“加起来”呢?而且,在探索新特征的过程中,我们可以把两个模态的旧特征融合在一起进行共同探索,以增加特征的丰富度。这就是我们所提出来的 Dual Path Network 的一个简单解读。
说了这么多,DPN 的性能到底怎么样?让我们来看一下它在 ImageNet 1000 类的分类问题上的的表现。首先,我们选取 ResNeXt-101 来作为 Baseline,大家看一下这两行数据,相对于 Baseline,DPN-98 层在模型结构和计算量上均减少了 1/4 左右,但是它的 Top-1 和 Top-5 的 Error 是基本保持不变的,甚至有少量的精度优势。
进一步地,通过做一些优化工作,比如把输入图像的尺寸扩展到 299,我们可以看到 DPN-98 的 error rate 从 5.2 降到 4.1,相对 Baseline 有了更大的精度提升。同时需要注意的是,DPN-98 层在训练速度比 ResNeXt 要快的多。
那么有人可能会问,我们为什么一直要讨论基础网络呢?个人觉得,目前视觉领域的很多应用,如果把问题抽象成分类或者回归问题,那么实际上都是可以通过一些传统的 CNN 结构进行求解的。举一些简单的例子,比如人脸的关键点定位实际上就是一个点回归的问题;而刚才提到的 FCN-Based 的 segmentation 方法就是图片像素点的分类问题。
在实际场景和操作过程中,我们一般会使用多任务学习,即 Multi-Task 来增强整个模型的性能。简单来说,就是如果我们有几个相通的任务,那么我们就可以在一个模型里同时学习这几个任务,来进行彼此的增强。比如我们熟知的 Faster R-CNN 检测框架,它实际上就是检测框的回归和候选物体的分类这两个问题的融合;Mask R-CNN 实际上则是在 Faster R-CNN 的基础之上,再加入像素点的分类问题,这样可以使所有问题的精度都有了整体上的提升。
在人脸相关的领域里,也有一些类似的做法。比如说在这篇文章中,作者使用同一个基础网络抽取图片特征,然后在这个基础特征上同时进行了关键点的检测定位,以及四个人脸属性的预测,结果是所有问题的精度都有一定程度的提升。
2.互联网视频分析
讨论完视频移动端的视频特效后,让我们来进入到视频内容分析这个场景。
在这个场景中,我们实现了以下一些功能:智能封面、视频 OCR、分类标签和视频指纹特征。
首先,智能封面是指给定一个视频,如何从其中抽取并裁剪一部分帧来作为视频封面。
视频 OCR,是指识别视频里包含的字幕、弹幕,或者相关文本。
分类标签在于如何自动化地从一些用户行为、视频内容,或者互联网的嘈杂数据中抽取一些丰富的文本标签,来表征视频的内容。
最后一部分是视频的指纹特征,简单来讲就是用一组向量来表征视频里的内容。利用不同的视频特征,我们可以快速地实现视频搜索、视频判重等功能。今天,我将主要从选取智能封面和视频 OCR 来大概地介绍一下实现流程,并深入到视频指纹特征当中,探讨一下我们如何快速地抽取一个视频的指纹特征。
首先是视频封面。实际上,智能视频封面涉及到较多的基础技术,而如何进行基础技术的融合是较为关键的地方。
对于一个视频,我们做的第一步是每隔一定秒数来抽取一些关键帧,并通过简单的打分模型来判断视频帧的质量。接着,我们选取一些质量分比较高的图片作为侯选封面,并对侯选封面进行详尽的分析,包括人脸、人体的检测,主体物体的识别、图片质量分析、清晰度打分等。最后,针对所有信息进行一个特征融合,把封面选取问题建模成一个排序问题来判断所有帧的质量,并通过智能裁剪的方式对关键部位进行检测和截取,来作为最终的视频封面。
在视频 OCR 问题上,我们采取了一个常见的方法,即把它建模成文本框的检测和文本序列的识别问题。
相对于传统的检测来讲,文本框的检测是存在很多难点的。比如常见的小尺度问题,文本框的宽高比是比较极端的,同时存在大量的非水平情况。针对这些问题,在文本框检测里我们还是使用 HyperNet 结构来支持多尺度物体的检测,并在最后的上采样结果中进行小物体的检测。
我们还改变了检测框的编码,使它能够支持非水平文字的检测。简单来讲,就是对于 HyperNet 结构产生的最终响应图,我们建模了以下几个问题,第一个是每个像素点作为一个前景的分数;第二个是回归每一个像素点到它潜在的四条边的垂直距离;最后,我们还用一个额外的变量来预测文本框的偏离角度。在一些极端情况下,我们甚至可以支持对不规则四边形的检测。这种情况下,我们使用一个额外的分支,直接去回归不规则四边形的四个顶点来达到这个目的。
在文本检测之后,基于检测出来的文本框,接下来就是文本框的内容识别。文本识别实际上也存在很多难点,比如我们刚才检测出来的框没有进行任何的分割,而且文本在空间上是有相互依赖性的。针对这些问题,我们结合了 RNN 和 CTC 这两个方法,实现文本框到文本序列的预测问题。简单地说,对于输入文本框,我们会把它拆成多个 Patch,针对每个 Patch,我们会通过 RNN 来判断它可能属于哪一个序列,输出完这个序列之后,下一步工作就是通过 CTC 来实现未知序列到已知序列的序列预测问题。
这就是视频 OCR 和智能封面的大概流程。
我们进入到第三个技术点——视频指纹特征。相对于前面两个功能点来讲,视频指纹特征存在着更大的挑战性,因为它对速度有更高的要求。
要抽取视频指纹特征,我们需要对视频里所有的内容进行详尽的分析,速度就显得非常重要了。那么,如何提升模型的速度呢?
首先,我们来看一下 2D 场景下大家都是怎么做的。给定一张图片,如果想抽取这个图片的特征,一种做法是把一些训练得比较好的网络的最终输出层作为特征,比如我们可以选取 ResNet 来作为特征抽取网络。但实际上,像 ResNet 这种网络,它虽然性能很好,但是在速度上面有些局限。针对这个问题,有人提出来用 ResNeXt 来提升模型的速度。简单地讲,就是在 ResNet 分支里挑选出一些计算量比较高的卷积层,在这个卷积层里面引入 Group 操作来进行模型的加速。在这个例子里,它使得一个比较大的矩阵操作,变成三个比较小的矩阵操作。这种方式确实是能够在保持精度基本不变的前提下,一定程度上提高模型的速度。
按照这个想法,我们可能就会极端地想,既然要加速模型,为什么不对所有的卷积层都引入 Group 操作?实际上这也是可行的,如右图所示,对所有的卷积层,我们采用 Group 把它切分成 N 个独立的路径,这种做法会使整体的计算量缩减到原来的 N 分之一。但是从这张图可以看出,这么做是有问题的,因为每个路径都是相互独立的,路径与路径之间缺乏信息交流,实际上相当于变成三个独立小网络的合成模型了,这必然会导致整体精度的下降。
既然我们知道精度的下降是由于每一个层之间缺少信息交流导致的,解决办法就很简单。我们可以采用一些比较简单的操作,在每个独立路径的前面或后面进行特征融合。比如在这个例子中,我们在所有路径的前面引入了两个比较小的一层卷积层来实现对所有特征的融合和分发,这个结构就是我们提出来的 Multi-fiber 结构。值得注意的是,Multi-fiber 只是一个结构,并不是一个网络,这个结构可以切入到所有模型里,为模型加速。
这是 Multi-fiber 结构在 2D 场景下的性能,左图是我们选取的 RestNet-18 层作为 Baseline,红线是我们在卷积层里切入了 Multi-fiber,可以看到整体精度和收敛的速度实际上都有了一定程度的提升。右表则是在评估集上的表现,这是 RestNet 嵌入 Multi-fiber 的重现结果,可以看到精度和速度都有了一定程度的提升。
下面让我们把问题延伸到 3D 领域。在视频领域,做法就很简单了,对于原本 2D 的卷积核,我们把它扩展成 3D 的卷积核,这个结构是我们目前在使用的视频指纹特征的抽取模型,其中每个 block 实际上就是一个 Multi-fiber 结构。
让我们来看一下这个简单的模型在 Kinetics 视频分类问题上的表现。
首先,让我们来看一下这个表,可以看到相对于大部分的 Baseline,比如 Two-stream network、ConvNet+LSTM,以及最近提出来的 S3D 等,我们的模型精度基本上都有一定的优势。同时,值得注意的是,我们的运算量是大部分 Baseline 的 1/10 左右。从右图可以更明显地看出来它们性能上的差距,横轴是运算量,纵轴是模型精度,在精度相当的前提下,我们的运算量远小于其他大部分 Baseline 的运算量。
3.智能生活
让我们进入到今天的第三个场景,关于智能生活。
在这个场景下,视频大脑提供了一系列不同的功能点和技术解决方案,来支持智能设备和产品的落地。比如对于 360 的 智能摄像头,我们主要提供人脸、人形、异常行为的检测。目前,360 智能摄像头的销量已达八百多万,日活约两百万,人脸检测 API 每天的调用量约 1.5 亿次。
我们为 移动机器人 提供了整套 SLAM 技术。最后是 360 的后视镜产品,我们在这个后视镜产品中嵌入了研究院研发的高级辅助驾驶系统,即 ADAS 系统。今天,我将主要对 ADAS 系统进行深入的介绍。
在技术点上,我们实现了车尾检测、车道线检测,以及一些常见的路牌、路标检测。基于这些技术点,我们实现了前车防碰撞的偏离,即根据前车的检测框来判断当前车与前车之间的距离,以及车道线的偏离预警等。整套方案封装约 98KB,小于 100KB。同时,在 Arm 单核处理器上,它达到了 15 帧每秒的运行速度。
让我们来深入地探讨一下 ADAS 的检测模型。在这个系统中,行人、车辆和路牌检测都基于 Faster-RCNN,不同模型的主要区别在于具体结构的优化、定位优化、侯选区域选择,以及训练过程中的一些细节。
我们知道 Faster R-CNN 实际上是一个 two-stage 的模型,它第一步会通过一个 RPN 产生大量的 proposal,这些 proposal 通过反投到原来的特征层来抽取当前 proposal 的特征,并通过该表征进行框的回归优化,以及框里物体的分类。如果我们把第二步当作可迭代的步骤,实际上我们可以引入迭代优化操作,即把当前网络最终输出的边框重新反投到特征层里,抽取特征并进一步优化模型。
右图是我们进行一轮迭代优化之后的效果,可以看到,这辆白车的检测框变得更加紧致一点。
同样地,还是在 RPN 网络里,响应图的每个输出点都会通过锚点产生一定量的 proposal,但 proposal 太多会导致检测速度的下降。为了缓解这个问题,Faster R-CNN 用 NMS 的策略去压制大部分 proposal,只保留下来一些质量比较高的 proposal。其具体的做法是,针对一系列 IoU 相对较高的侯选框,如它们的 IoU 大于 0.7 的阈值,直接选取分数最高的框作为最终的检测结果。很明显,这种操作是有缺陷的,因为这会丢失大量其他框的信息。
因此,如何进行信息融合就显得非常重要。一般我们会采用 Box Voting 方式来进行改进,对一些重复度相对较高的框加权求平均,来合成新的框作为最终的检测结果。这是一个我们实际产生的 Box Voting 案例。
最后,为了增强模型的检测性能,我们实现了在线负样本挖掘的过程,简单的说,就是我们将 RPN 产生的大量 proposal 分成三种类别,一种类别是正样本,第二种是 easy negative,就是很容易区分为负样本的样本,以及一些 hard negative。在模型训练的过程当中,我们必须精心地去调整这三种类别的样本比例。同时还要注意一些其他问题,比如如何设计好的模型结构,如刚才提到的使用 Multi-fiber 结构进行加速,DPN 等多特征融合的策略来提升模型特征精度,这都是一些比较重要的细节。
最后,我们要选取一些相对比较好的 loss function,如 focal loss,它在分类问题上性能略有提升。所有的这些方法,在推理过程当中不会产生特别大的推理负担。
接下来,我们来小结一下如何设计检测模型。
当遇到检测问题我们该如何处理?个人认为,遇到检测问题时,首先应对数据进行详尽的分析,如分析数据里存在的物体、物体类别、尺寸、分布,根据以往的经验,我们可以依照数据里的物体尺寸分布来设定锚点的个数和尺寸,比如我们可以对所有已知的检测框进行 K-means 聚类,把它的中心框作为最终的锚点。同时,我们必须精心地设计输入图片的尺寸,因为图片尺寸对整个模型的性能有极大的影响,图片太大,检测速度会急剧降低;图片太小,模型精度会受到很大的影响。
设定完输入和模型超参数之后,下面就是如何选取卷积网络。刚才也提到基础网络的选取对整个模型性能的影响是比较大的。一般的,在已知硬件限制的前提下,我们应尽量先去设定一个比较好、比较大的大模型网络,分析网络里面每个费时的部分,并且使用以往的一些手段,对费时部分进行改进,比如使用 Multi-Fiber 结构、模型稀疏化等,对模型里的费时部分进行剪枝。
基于这个网络结构,接下来是 RPN 的构造,以及 RPN 网络里大量的 proposal 如何处理,我们一般不会使用 NMS,而是采用 Box Voting 的方式,因为两者的运算速度是基本相当的,但是 Box Voting 的精度高很多,且可以进行侯选框的迭代修正等。
这就是整个检测模型需要注意到的一些细节,但还有最后一步,就是检测的后处理。检测后处理可以根据不同的场景进行不同的定制,比如在我们的视频场景中,我们经常采用对前后帧进行检测框平滑的方法,让检测框相对稳定。
方案未定,数据先行
定义问题,优化目标
基础模型和框架的选取
快速迭代,问题总结
我来小结一下今天的分享。实际上,这个总结更多的是我在工作中的一些思考方式,而不是技术上的方法。
首先,遇到问题,第一步应该做什么。我们应该去了解我们有什么东西,有什么数据,以及我们需要什么东西,这就是我们所谓的方案未定,数据先行。
已知数据和目标之后,任务就很简单了,去建造一座桥梁连接数据和我们的目标,这就是如何去定义一个问题,以及设定优化目标。
已知数据和目标之后,接下来就是一些经验性的问题,我们如何去选取工具,比如如何选取基础模型,对问题进行建模,如何选取适合自己的框架来实现基础模型。
最后,我个人比较习惯的一种做法,就是快速迭代,实际上,很多方案和技术并不是在想问题的过程中就能够想到的,而更多的是自己在实际动手的过程当中发现问题、总结问题,来进行技术的探索。
黄君实,奇虎 360 人工智能研究院资深研发科学家,新加坡国立大学电子和计算机工程系博士。其主要研究领域包括图片中的物体检测与识别、视频内容分析与理解等,曾在国内外顶级期刊与会议上发表过多篇学术文章,同时担任若干国际期刊和会议的审稿人。目前任职于奇虎 360,人工智能研究院担任资深研发科学家,负责 360 视频大脑平台中的多项关键解决方案。
你也「在看」吗?👇