人脸检测Integral Image思想在流式指标计算的应用实践

前言

2002年Paul Viola等人在《Robust Real-time Object Detection》利用积分图算法,将矩形内像素值累加简化为四个点的加减,大大提升训练与检测速度,从而实现实时人脸检测。笔者尝试将该算法思路引入易盾反作弊指标计算,规避隐含的大量重复计算,用空间换时间的方法提升计算速度。同时,本文提出一种基于动态时间系数的方案,量化时间与空间的收益比,实现性能与空间的Tradeoff。

人脸检测的积分图计算

该论文利用Adaboost算法将多个若分类器组合成强分类器,每个迭代需要选择当前误差最小的弱分类器。假设图片窗口为24*24,那么一共有45396个潜在的haar-like特征值。每个特征值的生成,需要计算矩形范围内所有像素之和。

早在2001年,SIFT算法尚未发展成熟,神经网络还处于比较寂静的时期,当时人脸检测算法最大的难度是实时计算。为了能够快速的计算Haar-like特征数据,Paul Viola等人提出Intergreted Image算法,将矩形内所有像素之和简化为四个点的加减。

image.png

对于小图片而言,求累加值比较快。但是,如果图片比较大,且每次迭代选择最优分类器时都要计算矩形和,计算量将非常大。积分图顾名思义就是将图像做一层积分变换。对于点(x,y)的积分值ii(x,y),等于点(1,1)到点(x,y)矩形范围内的像素值累加。如图所示,矩形A的像素之和,等于A+D-B-C。

指标计算的数学模型

实时统计的各维度用户指标数据,最常见的分为:求累加值、去重计数。

求累加值计算类型,就是计算某个时间窗口内的数值累加,比如计算最近一周内每个用户的消费金额总和。为了简化计算模型,我们将一个指标计算窗口分为10个步长,对于一个窗口的求值转化为为最近10个步长数据累加。

image.png

去重计算计算类型,统计某个维度的下高频统计,比如某个用户一周切换ip的个数。简单理解,就是把最近一周时间内的ip都存下来,然后去重计数。

image.png

积分图思想引入指标计算

去重累加基本可以完全套用原始积分图的思想,将二维降为一位,原始数据的求累加操作转化为两个数的减法。如下图所示,原需要累加10次,使用积分图只要减一次,大大降低了计算次数。

image.png

求累加值可以用数据公式概况

image.png

再进一步解释,t+1计算结果result(t+1)其实可以分解为t时刻计算的结果result(t) + g(t+1)-g(t-9),是不是很熟悉,其实就是动态规划,将本次计算的结果直接带入下一次的迭代计算省掉重复计算。近几年神经网络很火热,训练时用到的反向传播算法,本质上也是一个意思,就是把t次迭代求导梯度计算的结果,作为中间结果直接带入到下一层迭代计算。

image.png

去重计数的如何解决?

由于去重计算不想简单的累加,需要把多个集合的数据合并,返回集合的大小。由于步长间可能有重读数据,不能简单转换为两个点的减法。于是我们想出一个改进方案,对于每个步长第一个数据,去合并前面10各步长的集合,标记为tmp_result,并将其过期时间设置为一个步长。如果步长内后续有数据过来,那么直接把数据加到tmp_result,并返回改set的size,不在需要sunion每个步长集合。合并所有步长操作算法复杂度是O(n),往一个集合里面加一个数据的算法复杂度是O(1),因此该优化方案将计算整体算法复杂度从O(n)降到O(1)。

image.png

内存与性能的Tradeoff

原始优化方案,临时set有效期时间为步长t,预期内存使用涨一倍。

1.可以考虑有效期时间,在步长基础上乘以一个系数 ratio ,0 < ratio <= 1, expiredtime = ratio * t。每次sunionstore重新设置相对过期时间。

2.因此正常情况下,预计内存增长ratio倍,这样可以调整ratio大小,量化牺牲多大内存换取多大的rt收益。ratio可以设置在配置文件里面,上线初期可以设置小一点,比如0.1,根据内存增长情况调整大小。

3.ratio越大对内存占用越大, 预计rt减少约明显。那么就要找到合适的系数ratio,让内存增长在合理范围内,同时获取比较好的rt收益。

根据经线上经验数据数据量较大时一次sunion时间大概50ms,一个正常情况的时间大概2ms,可以计算平均rt和ratio的关系式,N为一个步长内的总数据量。

image.png

如下图所示,选择性价比最高的elbow point,用相对比较小的raio获取比较大的性能提升。对N=100来说,raion等于0.1已经有比较好的预期。如果对rt有一定的性能要求,也可以根据具体的目的来确定ratio系数大小。

image.png

有几个好处:

1.正常情况下数据比较稀疏,临时数据不需要存太长时间

2.被刷或者压测的时候,一般数据会在短时间内集中过来,临时数据较小的过期时间也够用了

3.ratio的值可以根据redis内存容量的情况调整,以达到灵活折中效果

你可能感兴趣的:(人脸检测Integral Image思想在流式指标计算的应用实践)