OPENCV实现PCA降维中的GENN函数说明

本文介绍了在行人检测项目中使用OpenCV的PCA降维时遇到的矩阵运算问题,重点讨论了gemm函数。对比了OpenCV的gemm函数与OpenBlas在矩阵运算效率上的差异,指出gemm函数适用于小规模矩阵,而OpenBlas更适合高维矩阵。实验结果显示,当矩阵维数增大时,OpenBlas的表现优于OpenCV。
摘要由CSDN通过智能技术生成

刚使用OpenCV不久,最近在做关于行人检测方面的项目,使用HOG+SVM的方法实现,但是由于维数过高,致使处理时间过长,达不到实时检测的要求,因此选择了对HOG检测子进行了降维。在使用PCA降维的过程中,利用到了gemm函数,这个函数主要是对于矩阵的运算,是在最近版本的OPENCV版本中才集成进来了。代码是C语言写的,2.4.9版本的文件在modules/core/src/matmul.cpp中下面对于函数进行简单的说明:函数定义如下:

函数定于如下:

void cv::gemm( InputArray matA, InputArray matB, double alpha,
             InputArray matC, double beta, OutputArray _matD, int flags )
该函数比较复杂,代码量在600行左右,具体计算的是:

当然可以使用OpenBlas来实现矩阵的运算,两者之间的对比如下:

1.OpenBlas第一次运行的时候需要很多时间,其实Opencv也有这个这个现象,第一次启动时运行时间要比第二次运行时间长点点。 
2.当矩阵的维数增大时,Opencv所花的矩阵相乘时间成指数增长,而OpenBlas却保持得很好,从下面的30个数据的结果可以看出,OpenBlas所花的时间成线性增长,factor因子是成线性增长的,所以,OpenBlas中的时间复杂度是O(n),这时OpenBlas完胜OpenCV。 


结论
1.Opencv中的矩阵乘法函数gemm只适应于矩阵维数小的情况,大概加估计的话,当矩阵阶数是1000以内时,Opencv可以1000ms内完成两个矩阵相乘。 
2.OpenBlas适合处理高维矩阵相乘,对于小矩阵有点像杀鸡用牛刀,当矩阵维数为1500*3000时,仍然可以在500ms以内完成两个矩阵相乘。
当然,具体时间可能跟机器有些差别,本结论是程序在Release 32bit配置下运行在AMD3.5GHz,6核64位win7系统上的结果。 


参考:http://m.blog.csdn.net/article/details?id=50133505

   http://blog.csdn.net/yeyang911/article/details/31816807

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值