第一作者和通讯作者:AnDong Zhu(PhD)Sheng Zhang(Associate Professor)
学校:全部来自南京大学
摘要
作者提出了CRUCIO,一个通过压缩和解压缩视频帧来过滤冗余数据、降低延迟的工具。
主要特点
背景介绍
VAP(Video Analytics Pipeline)视频分析流水线概念经常出现于目标分析等视频分析任务中,包含:
- 视频采集:摄像头在客户端捕捉视频帧
- 视频压缩和传输:捕获的视频帧被压缩成视频块,通过无线网络传输到服务器
- 分析/推理:服务器运行DNN等算法来对视频数据进行处理
在第2步中,基于传统编码器会导致许多对分析任务无用的帧也被进行压缩保留,导致更高的传输延迟,解码延迟和推理延迟。冗余可以大致分为空间冗余(指一大片像素中的有效信息很少,比如平滑像素)和时间冗余(指前后视频帧变化不大,比如静止区域)。针对这些冗余已经有很多处理方法:
-
[空间冗余] 根据分析任务定制ROI(Region of Interest)编码,对感兴趣的区域进行高编码,其他地方低编码
缺点:没法彻底消除平滑区域的冗余(比如ROI里面有很多平滑像素对象,单纯对ROI使用高质量编码还是会导致如下图所示的冗余,其实我们只拿到轮廓信息就足够了)
-
[时间冗余] 训练二元分类器,输入帧输出是否包含特定事件来进行过滤
缺点:难以训练,训练不好的话会大大降低准确性
-
[时间冗余/空间冗余] 自适应的CBF(Comparison-Based Filtering)比较帧间相似性并且抛弃过于相似的帧
缺点:可能会破坏关键帧,导致所有基于关键帧记录差异值的差分帧解码失败。(实际上,所有的针对时间冗余进行优化的方法都有可能会遇到这种问题,包括上面提到的二元分类器。另一个问题是对于高帧率来说,由于帧数的增加CBF会丢弃更多的帧从而生成更多的SEGs,如下图所示,从而加大对SEGs压缩的困难)
-
[空间冗余] RESPIRE系统,专注于对多摄像头采集到的视频进行重复空间上的去冗余
缺点:专注于多摄像头系统进行优化
总得来说,传统编码器理解任务的开销较大(每次检测都需要额外运行兴趣区域检测算法),并且帧间压缩容易受到ROI异质性编码(针对感兴趣区域采用较高质量编码,针对不感兴趣的区域则较低)影响。而神经网络(NN)解码器具有更高的性能,例如AdaFocus,MAR等方法(因为自动解码器经过训练后可以直接提取兴趣区域的特征)
但这些NN解码器忽略了端到端的优化,导致分析精度低,客户端编码延迟高,pipeline的额外延迟(难道他们的解码方法测试不是走完整个端到端的流程进行性能上的测试吗,这些因素应该都包含进去了才对),因此作者提出了CRUCIO方法。
方法特点
-
自动编码器
-
端到端优化策略:
基于IR(中间语义特征)进行压缩而不是低层视觉特征(像素或纹理)进行压缩,并且基于任务acc进行优化而不是视觉压缩质量保证对整体任务的感知。(也就是说这个Crucio需要在不同的任务上重新进行训练)
-
时空协调优化(时空冗余处理):
使用GRU和3D-CNN自动编码器协同提取时空特征和3DCNN解码器
-
自适应的批处理:
根据网络带宽和动态帧率来自适应地调整批处理的大小
(动态帧率调整批处理大小是因为当FR高了以后正常的CBF会产生更多的SEGs,而作者的方法只需要拉大batch_size就足够提取特征了,也就是批量级过滤batch-level filtering)
系统架构和工作流
系统首先需要一个预设置的模型权重以及根据场景预定义的batch size。随后整体运行流程如下:
-
客户端的摄像头捕获到许多(FR相关)的视频帧
-
一个batch的帧被输入到GRU-CNN编码器中,使重复IR的帧被去除,剩余的关键帧被3DCNN压缩为单独的视频块
GRU部分:一个batch的帧先输入到GRU中,接下来被并行处理进行时间维度上的过滤得到许多关键帧。
详细流程:视频先被输入到轻量级的SqueezeNet中并行处理,使得每帧视频$(3 \times H \times W)$被表示为IR$(1
\times 1000)$,随后这些IR被输入到双向GRU中,这个双向GRU是使用IR-aware loss进行训练的模型,因此GRU会比较当前帧的IR和前一帧的hidden state来在IR层面判断这帧是不是关键帧。最后因为是双向的,GRU每次会输出两个$256$长度的向量,因为一共有N帧,所以一共会得到$N \times 2 \times 256$大小的输出向量,经过全连接层变为$N \times 1$的向量,使用sigmoid激活函数压缩到$(0,1)的范围后进行四舍五入得到用于mask输入帧的向量,从而筛选得到最后的关键帧。IR-aware loss分为两部分:
- Representativeness Loss:首先GRU输出得到N个IR向量(N为帧数),接着建立N*N大小的距离矩阵,并根据输出的Frame Vector过滤掉非关键帧的列。通过某种度量距离的方法来计算每行(输入帧)和每列(关键帧)之间的距离,最后通过exp运算后取平均得到loss,从而鼓励每个输入帧和其最接近的关键帧之间的差异尽量小
$$
representativeness \ loss = \frac{1}{N}\sum_{i=1}^N{exp(M_{i,min})}
$$-
Diversity Loss:如果只有第一部分的loss,模型只需要无脑输出全1向量即可,这样总能得到最小的representativeness loss。为了限制这一现象,作者加入了多样性损失。我们知道对于一组向量组成的行列式来说,行列式之间越线性相关,那么行列式的值就会越小,反之则会越大。因此我们将SqueezeNet中输出得到的N个特征向量通过高斯核函数来计算相似性
$$
K(x_i,x_j)=exp(-\frac{||x_i-x_j||^2}{2\sigma^2})
$$
构建得到$N*N$大小的相似性矩阵$L$,同样我们根据最终输出的Frame Vector过滤掉非关键帧,只使用关键帧来用同样的方法构成相似性矩阵$L_{key}$,然后计算DPP概率
$$
P_{DPP}=\frac{det(L_s)}{det(L+I)}
$$$$
L_{diversity}=-log(P_{DPP})
$$DPP概率的值越大,就代表$L_s$中的向量相对$L$越线性独立,差距越大,loss计算出来就越小,反之DPP越小,就意味着越相关,差距越小,冗余越大,loss计算出来就越大。
疑问:为什么Representativeness Loss要拿IR计算相似性来选择关键帧,而Diversity Loss要拿Squeeze Net的特征向量来计算相似矩阵使得关键帧的选择能去除冗余,为什么不使用相同的向量来计算?
3DCNN部分:筛选得到的关键帧在将RGB颜色空间转换为YUV空间,随后进入3DCNN网络在时空维度上进行压缩。3DCNN可以无缝衔接GRU,因为输出向量已经加载到了GPU显存中。
(这里论文中说的是帧内卷积提取物体特征,然后帧间卷积实现时间维度上的压缩,但是3DCNN的卷积是针对长,宽,时间维度上的同时卷积,作者的说法更像是深度可分离卷积,也就是先按照通常的2D卷积对逐个时间维度进行处理,实现类ROI的空间冗余过滤,随后使用1*1*时间维度的卷积再在时间维度进行压缩,但论文中的网络结构图张贴的是3DCNN,这里不是很理解)
-
压缩后的视频块基于UDP发送到Server的CNN解码器中
发送之前压缩后的数据还会再使用LZMA算法进行无损熵编码二次压缩,并且在server会使用LZMA进行无损解压缩,之后才会送给CNN解码器中还原得到GRU筛选的关键帧。
-
解码后的关键帧并行输入到分析网络中
注:这种端到端的编解码器架构在经过训练之后,运行所需要的开销远小于传统编解码的开销(比如每次运行都需要跑ROI划定算法的传统编解码方式)
-
客户端的环境监控器收集FR和带宽信息发送给Server的Batch Scheduler中
每个batch的大小越大,每帧在神经网络中处理的消耗就越小,但每个batch传输需要的时间就会越长
因此FR越高或者带宽越高,batch size就越大
-
Batch Scheduler计算得到批大小并且返回给客户端
基准环境曲线的拟合:Batch Scheduler首先会定义一个基准网络带宽 $B_{bench}$,在这个基准网络带宽下,假设当前时间槽的帧率为 $F$,时间槽持续 $T$ 秒,那么系统多次调整参数后就可以获得当前环境的最优带宽大小 $b_{opt}(F)$,经过这样多次采集数据我们就可以拟合一条线性曲线 $b_{opt}(F)=mF+n$
上下界公式中参数的计算:获得了$m$,$n$参数的大小后,由于带宽会波动,因此我们还需要一个动态的batch size范围,作者定义了batch size在不同带宽环境下的上下界 $b_{small}$ 和 $b_{large}$ ,下界仍然为最优曲线的线性公式,上界为时间槽传输的所有帧 * 系数$\gamma$,并且上下界满足相加取平均为最优曲线 $b_{opt}$ ,联立所有方程并且最大化 $b_{large}(F) - b_{small}(F)$ 就可以求出上下界中的参数 $\alpha, \beta, \gamma$。
疑问:
这里$T$也就是时间槽持续的时间应该是系统最开始就给定的,作为一个已知的参数,我们将$b_{small}$ , $b_{large}$ , $b_{opt}$带入到公式中得到
$$
(\alpha +\gamma T )F + \beta b_0 = 2mF + 2n
$$
由于$m,n$已经在之前就求出,所以我们有
$$
\alpha + \gamma T = 2m\
\beta b_0 = 2n
$$
这里 $b_0$ 代表最小batch size,也是作者提前给出的值,因此我们可以直接得到 $ \beta$ 的值就是 $\frac{2n}{b_0}$ ,又因为我们需要最大化 $b_{large}(F) - b_{small}(F)$,也就是最大化 $( \gamma T - \alpha)F - \beta b_0$,那我们肯定直接最大化 $(\gamma T - \alpha)$,也就是 $2\gamma T - 2m$,所以求得
$$
\gamma = min(\frac{2m}{T},1) \
\alpha = max(0,2m - \gamma T) \
\beta = \frac{2n}{b_0}
$$
由于几个参数的取值范围都是开区间,所以作者是假定 $\frac{2m}{T}$ 一定小于1了是吗,否则就说不通了更新策略:
作者提出了DLABSA算法,流程如上图,通过迭代的方式,根据当前带宽和基准网络带宽的大小比较来以1为步长迭代调整最适合的batch size(以1为步长并不会带来过大的计算延迟)
在带宽低于基准网络带宽时,对batch size的调整使用到了
$$
d(b) = \delta_1In(\delta_2b)+\delta_3
$$
式中的$\delta_1, \delta_2, \delta_3$更新是每个时隙在线更新(具体更新策略是怎么样的?)式中定义的函数是凹函数(concave function),也就是在batch size较低时斜率变化大,batch size较大时斜率变化小。低带宽情况下网络传输占延迟的部分很大,相比之下编码占比的部分会较小,而凹函数斜率因自变量的减少逐渐加大。因此1的步长对于延迟的调整就较为合适,逐步减少batch size来让编码开销赶上带宽传输变化。
评估
训练设置
server上的分析任务网络为 Faster R-CNN,通过将未压缩的帧的IR作为GT,和在线IR对比计算F1分数(也就是将GRU输出的关键帧和经过CNN编解码压缩后的关键帧进分别输入到Faster R-CNN中进行对比),给定0.9的F1 score目标来进行训练。
数据集和网络状况
视频来自YoutubeObjects数据集中的视频,包含10中类别的对象,视频帧大小640*480,每个视频只有0.5-2秒,平均带宽1.5Mbps(也就是提到的基准带宽),分布区间为 [0.4, 2.6] Mbps。
Baseline
- DDS:定制的ROI编码来去除帧内背景,但是没有对时间冗余的处理
- Reducto:自适应帧过滤算法来消除时间冗余,并且仅对过滤后的关键帧进行压缩,但是Reducto对于空间冗余的过滤不完全(传统编码器),留下了对分析任务无关的信息。并且频繁的过滤会导致碎片化的传输使得延迟增加
- STAC:DNN驱动的图像编解码器,可以进行帧空间压缩和帧过滤,但是每个帧单独上传压缩,所以消耗了大量带宽,并且很难同时到达服务器,使得server并行解码较为困难。
- Combi:尝试结合DDS和Reducto,但是ROI编码和CBF互斥导致结合效果一般。
结果
CRUCIO不仅在编解码的延迟,端到端延迟,冗余的去除等方面更为优越。
总结
作者提出了CRUCIO,一种针对视频分析系统使用的延迟优化算法,使用端到端的GRU-CNN编解码器来消除时空冗余。
GRU:实现基于IR的批量过滤(空间冗余过滤)
CNN:面向精度的视频时空压缩(时空压缩)
环境监视器和批量调度程序:动态感知FR和带宽来自适应调整批处理大小改善延迟
感想
- GRU可以针对每帧/片进行过滤,实现空间冗余的去除
- 计算相似性也可以使用高斯核函数
- 同样的方向考虑在时空冗余AI压缩算法来创新,同时还需要加入根据网络环境参数自适应调整的算法。