基于深度学习的人脸识别系统系列——使用CUBLAS加速计算人脸向量的余弦距离
来源:互联网 发布:java中什么是工厂模式 编辑:程序博客网 时间:2024/06/06 23:17
前言
基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库)、Caffe(深度学习库)、Dlib(机器学习库)、libfacedetection(人脸检测库)、cudnn(gpu加速库)。
用到了一个开源的深度学习模型:VGG model。
最终的效果是很赞的,识别一张人脸的速度是0.039秒,而且最重要的是:精度高啊!!!
CPU:intel i5-4590
GPU:GTX 980
系统:Win 10
OpenCV版本:3.1(这个无所谓)
Caffe版本:Microsoft caffe (微软编译的Caffe,安装方便,在这里安利一波)
Dlib版本:19.0(也无所谓
CUDA版本:7.5
cudnn版本:4
libfacedetection:6月份之后的(这个有所谓,6月后出了64位版本的)
这个系列纯C++构成。
====================================================================
思路
我们先来温习一下两个向量之间余弦距离的数学公式,大家自己可以回忆一下:
x,y均为同维度的向量,如果为6400维,那么我们可以将式子进行展开:
为什么这里我们要用余弦距离,而不用欧式距离?
余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异。(摘自http://www.cnblogs.com/chaosimple/archive/2013/06/28/3160839.html)
我们使用余弦距离能够更好的反映两个人脸向量之间的相似度。
实现
这里我们可以先实现一个,不使用CUDA加速的版本。
ComputeDistance.h:
ComputeDistance.cpp:(提供一个总的接口)
这里的目的是输入vector< float> x, vector< float> y 进行计算,我们使用上一篇博客中提取人脸向量的代码来进行测试,看其运行时间。
main函数:
运行结果:
但是在真实应用中,我们必须要求计算的高速度。这里可以这样来考虑:其一是通过多线程,当有很多人需要进行匹配时,每个线程都进行与测试向量的距离计算。其二是本身人脸向量计算的时候就需要先加速,这里我们先使用CUBLAS来尝试对cosine函数进行加速。
CUBLAS
cublas是一个开源的矩阵加速运算库,它使用更为优秀的浮点运算设备GPU来对线性运算进行加速。因为余弦公式(上面有),我们需要做的核心数学公式及为向量点乘(向量的模可以看成是向量自己对自己的点乘然后再开方):
值得一提的是,CUBLAS为我们提供好了这样一个函数:cublasSdot(即为cublasSdot_v2)
n代表的是输入向量的维度,x是第一个向量,y是第二个向量,incx 与incy 取1,result 是点积结果。
我们在配置Caffe的过程中,早已经把cublas的库添加了。所以我们新建一个cpp,在文件里包含
即可,做一个小测试。
如何撰写这个求余弦的公式?一个直观的感受即为:
我们的主函数:
这里我们算了一个10000维向量的点积(自己乘自己),计算速度为0ms(应该是可以看比毫秒精度更高的时间单位的,大家可以自己试试):
使用CUBLAS,我们可以获得很快速的两个向量之间求点积的解决方案。其实事实上,比起两个向量之间求点积的速度,我们更为重要的,是如何求解一个向量与多个向量求余弦距离的优化方法。在之后的几章会对这个问题进行讨论。
=================================================================
http://blog.csdn.net/mr_curry/article/details/52468349
- 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【四】使用CUBLAS加速计算人脸向量的余弦距离
- 基于深度学习的人脸识别系统系列——使用CUBLAS加速计算人脸向量的余弦距离
- 【深度学习】基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)
- 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【六】设计人脸识别的识别类
- 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【一】如何在Visual Studio中像使用OpenCV一样使用Caffe
- 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【五】设计人脸识别的注册类
- 基于深度学习的人脸识别系统
- 深度学习与人脸识别系列(3)__基于VGGNet的人脸识别系统
- 深度学习与人脸识别系列(2)__基于VGGNet的人脸识别系统
- 深度学习与人脸识别系列(2)__基于VGGNet的人脸识别系统
- 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【二】人脸检测与预处理接口的设计
- 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【三】使用Caffe的MemoryData层与VGG网络模型提取Mat的特征
- 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【三】使用Caffe的MemoryData层与VGG网络模型提取Mat的特征
- 计算两向量的欧式距离,余弦相似度
- 计算两向量的欧式距离,余弦相似度
- 手把手教你开发基于深度学习的人脸识别【考勤/签到】系统
- 深度学习基于VGGNet的人脸识别系统及fine-tuing
- 手把手教你开发基于深度学习的人脸识别【考勤/签到】系统
- Hdu 2032 杨辉三角
- 线段树基本操作C++
- Unity自动化打包工具
- openssl移植到ARM Linux
- 数组做为参数传入Oracle存储过程操作数据库
- 基于深度学习的人脸识别系统系列——使用CUBLAS加速计算人脸向量的余弦距离
- 浅谈js中如何动态添加表头/表列/表格内容
- 《一个Android工程的从零开始》-2、base(一) BaseActivity布局
- poj1330 Nearest Common Ancestors(lca,tarjan&倍增)
- PostgreSQL 数据类型介绍(四)
- 特征点匹配 opencv系列函数解析 追踪相关(一)
- HDU 3709 数位dp
- 根据经纬度画多边形(返回各个顶点坐标)
- iOS 崩溃调试