转载请注明出处,Writer:Zhonlihao钟硕 @ 20190713
全尺度卷积算法的时间复杂度
全尺度卷积虽然有非常强的细节提取能力,但其是以大量增加运算量为代价的,下面的伪代码给出了其基本的运算过程:
for i = 尺度遍历 n
for j = 时域遍历 k
for m = 特征遍历 f
卷积核操作;
end
end
end
一个没有经过优化的全尺度卷积算法的算法时间复杂度大概是O(n * k * f) ~O(n^3) 这无论对于电脑还是嵌入式cpu都是比较慢的,不利于算法的实时实现,细心分析下来,我们可以发现如果想实现快速算法,可以从特征的组合出发去实现它们特定的卷积操作,这样就会省下很多无谓的卷积扫描的时间耗费。
一种快速全卷积算法
如上图所示,把机械的扫描转化为对特征点事件的描述,从2个特征点开始组合到全部特征点的尺度,这是一个三角级别的算法展开:
for i = 特征点个数遍历 2~n
for j = 起始特征点遍历 1 : n - i
for k = 特征点组内元素遍历 j:j+i
卷积核扫描操作;
end
end
end
譬如m = 6,那么这个事件展开就是
1 2,2 3,3 4,4 5,5 6
1 2 3,2 3 4,3 4 5 ,4 5 6
1 2 3 4,2 3 4 5,3 4 5 6
1 2 3 4 5, 2 3 4 5 6
1 2 3 4 5 6
这样就把较大量的O(n^3)转化为一个小量的O(n^3)操作;下面说一下卷积核扫描操作的变化:
如上图所示选取f1,f2两点特征为这次分析的基本事件,s1,s2是其邻近特征,那么,第一首先要确保窗的大小最小为f2-f1距离触发启动这个事件,其次,窗的最大长度不能超过s2-s1以免把邻近点纳入形成了新的一个组合事件,滑动时窗口的右端点必须碰到f2,如果左端点离开f1,则结束整个扫描过程,因此这个方法可以从本质上省去很多无谓的过渡时间浪费。
算法时间对比
以下是旧算法在matlab中的时间消耗:
以下是新算法在matlab中的时间消耗:
大概快了30倍以上,得出的数据统计基本一致。