win10+anaconda+cuda配置dlib,使用GPU对dlib的深度学习算法进行加速(以人脸检测为例)
在计算机视觉和机器学习方向有一个特别好用但是比较低调的库,也就是dlib,与opencv相比其包含了很多最新的算法,尤其是深度学习方面的,因此很有必要学习一下。恰好最近换了一台笔记本,内含一块GTX1060的显卡,可以用来更快地跑深度学习算法。以前用公司HP的工作站配置过dlib,GPU是Quadro K420,用dlib自带的人脸识别算法(ResNet)测试过,相比较1060的速度确实要快上很多。dlib、cuda和cudnn的版本经常会更新,每次重新配置环境会遇到一些问题,在这里记下来吧。
一、dlib介绍
- 介绍
dlib是一个非常非常非常好用的机器学习库,所有的源代码都用C++实现,而且也提供了编译得到的供python使用的接口。很多算法在工业界和学术界都取得了广泛应用,有不少对实时计算的性能要求很高的场合已经用到这些了吧,比如嵌入式、手机等等。官方网址戳这里: http://dlib.net/,官方博客http://blog.dlib.net/也会经常更新一些新的算法介绍,不过博客网站可能需要翻墙,下面的评论很多~从官网的介绍可以看出来里面实现了不少像矩阵计算、图像处理、机器学习之类的算法,并且提供了好用的接口;你可以按照教程使用cmake+vs2015(这个至少需要比update3的vs版本,否则cmake会报错)编译得到lib库,然后在C++环境下对库中的算法进行使用,不过对于很多人还是喜欢用python来捣鼓~~一般情况直接用pip安装就可以了。不过非常重要的一点是,默认的安装是不带某些特殊功能的,比如使用GPU对深度学习算法进行加速,或者利用CPU架构的特性提高逻辑运算的速度,这种情况下需要手动编译了,这个在后面部分会提高怎样配置这些~

- 与opencv的比较
大部分同学接触的计算机视觉方面的库应该是opencv,不过相比较而言dlib提供了一些最近几年很新的算法,而且实现的效果非常的好,比如在人脸检测方面,opencv依然用的是Viloa-Jones的haar特征+adaboost级联分类的经典算法,opencv自带的训练模型跑起来的检测效果会很差;dlib上会使用到HOG特征+回归树,其提供的已经训练好的模型检测效果要远好于opencv上面的,不过代价是提高了计算开销,在我的机器上测试一张640x480的图像大概需要0.2s不到;不过dlib也封装了一套用cnn实现的人脸检测算法,如果开启了cuda,检测同样大小的图像(以我的GTX1060为例)只需要0.07s左右,完全可以满足实时性,并且实际效果非常的好。其他一些比较经典或者新的算法就不一一说明了,都可以在官网上查到相应的接口和实现。
二、配置工具
本文主要介绍在Windows10下编译python版本dlib并且使用cuda对深度学习算法加速的方法,需要使用到的配置工具如下:
1.Anaconda3-4.2.0-Windows-x86_64,自带了python3.5,并且附带了很多python的库,anaconda首页上给出的一般都是最新的版本,先前的老版本戳这里:https://repo.continuum.io/archive/;
2.dlib19.9,新的dlib版本相比较以前更好配置,不需要手动配置boost之类的库了,记得之前19.4版本的需要手动安装,非常麻烦~
3.vs2015 update3,新的dlib版本需要用比较新的vs版本,版本至少新于vs2015 update3;
4.cmake,因为dlib的源代码是用C/C++写的,所以用cmake进行编译非常方便,作者也非常提倡使用,到官网下个就可以了;
5.cuda9.0 + cudnn5.1,如果你想让dlib中的深度学习算法跑得更快并且显卡支持GPU加速,那么可以使用cuda大大提高计算性能。
三、配置过程
python版本的dlib安装大致分成两种,一种是直接安装编译好的dlib库,通过pip install dlib执行安装,如果报错则可以手动下载指定版本的wheel文件到指定的目录,以本机为例,cd到C:\anaconda\anaconda\Lib\site-packages目录,然后pip install packname.whl就可以了,这一种方式非常简单,不过这种安装方式的劣势是默认不会开启GPU加速,以及一些其他提供编译选项的功能,否则就必须手动编译出dlib的python库了,这也是本文要说的安装方法,大致过程如下:
1.安装anaconda,这个没什么,一直下一步即可;
2.安装visual studio比较新的版本,之前已经说过了,至少新于2015 update3,整个文件很大,等待安装完毕之后自己手动建立一个C++工程,如果不能,则提示需要再次更新以支持C++项目;
3.安装cuda和cudnn,cuda的下载目录:https://developer.nvidia.com/cuda-downloads,注意一下cuda的版本,因为你可能也会使用其他的深度学习平台,比如tensorflow,它不一定支持最新的cuda版本,所以可以选择图中的“legacy release”,也就是老的版本。

其次是下载cudnn,戳这里:https://developer.nvidia.com/rdp/cudnn-download,需要注册nvidia的账号,然后进去下载,下载cudnn:

因为cuda会需要cudnn中的库文件以及头文件,需要把cudnn目录下的bin、include以及lib目录中的文件拷贝到相应的cuda目录中的bin、include和lib目录中去;
4.安装cmake,安装的过程中一定注意要添加系统环境变量选项打勾,重启机器后生效。为验证是否可以编译dlib项目,重启之后打开cmake,然后点击途中的“configure”按钮选择相应的vs版本,对于vs2015 update3应该选择“visual studio 14 2015 win64”选项;在上面的源码路径填写解压之后dlib的目录,注意是dlib目录,而不是包含版本信息的那个目录;然后选择编译输出的二进制文件目录,点击完成,开始配置。

如果这个过程顺利,cmake会提示类似于下面的信息,表示cuda版本的dlib已经顺利编译完成,在使用的时候可以开启gpu加速。

5.第4步只是验证是否能够正确的编译dlib的二进制文件,对于C++开发的同学可以使用编译好的dlib库文件,而对于需要使用python的同学,需要编译得到供python使用的库文件。以我使用anaconda为例,在Windows命令行中切换到C:\anaconda\anaconda\Lib\site-packages\dlib-19.9目录,然后输入python setup.py install --yes DLIB_USE_CUDA命令,等待编译完成python版本的dlib库文件。
在cmake编译的过程中可能会报出各种问题,稍微总结一下:
- 如果出现类似于没找到相应编译器的原因,说明vs安装可能有问题,可能是vs版本比较老,vs安装不正确,或者vs安装不完整。不管怎么说vs的安装时间会需要很长时间,而且由于vs版本的问题,安装新的vs可能会出现各种问题,如果想手动卸载重装就更坑了,这个时候可以用卸载工具进行卸载:https://github.com/Microsoft/VisualStudioUninstaller/releases,下载之后直接解压然后以运行可执行程序,等待自动清理完成,然后重新安装vs;
- 如果出现类似于找不到cuda的问题,请确认是否正确安装cuda;并且,如果提示找到了cuda但没有正确的cudnn,请确认是否正确地把cudnn中的lib、include和bin目录中的文件拷贝到相应的cuda目录底下;
- 在使用cmake编译的时候如果你更改了配置,那么需要在cmake‘中点击file中的delete cache,然后重新configure;
- 有一种很奇葩的现象是,有可能你的机器上已经安装过了cuda和cudnn,并且之前使用cmake configure的时候成功编译完成得到dlib的python库,但是出于某些原因需要重新安装cuda和cudnn,那么不仅需要手动卸载之前的cuda,而且最好也删除site-packages目录中所有和dlib相关的目录和文件,以及cmake输出得到的临时文件,然后重新安装cuda和cudnn,并且按照之前的步骤执行python setup.py install --yes DLIB_USE_CUDA,得到dlib的python库文件。我在这里就卡了很久,原因是因为为了匹配tensoflow,所以并没有卸载以前的cudn,而是继续安装了新的cuda和cudnn,但是编译dlib的时候总是提示能找到cuda目录但是找不到cudnn,并且cuda还是以前的版本,这说明cmake使用了之前的临时信息,找到的还是以前使用的cuda版本,这是不正确的。
如果编译顺利,并且中间没有报错,可以新建一个python程序,然后import dlib成功,大功告成。
四、验证dlib开启cuda进行gpu加速功能
在编译完成开启gpu加速之后的dlib之后,可以写一个小demo体验一下gpu加速之后人脸检测的效果,这里我用女神黎姿的图像进行测试,图像大小788x394,包含三张人脸。使用dlib自带的卷积神经网络算法,并且用它已经训练好的训练模型(即mmod_human_face_detector.dat文件,如果没有训练模型请戳这里http://dlib.net/files/进行下载,解压之后把dat文件放到同目录),同时使用opencv进行输入输出显示(dlib中也有图像输入输出的接口,不过我还是习惯使用opencv)。测试代码如下:
# -*- coding: utf-8 -*-
"""
Created on Tue Feb 13 23:28:44 2018 @author: czz
""" import dlib
import cv2
from datetime import datetime img = cv2.imread('test.jpg')#载入测试图片
cnn_face_detector = dlib.cnn_face_detection_model_v1('mmod_human_face_detector.dat')#加载训练好的人脸检测模型 t1= datetime.now()#测试起始时间
dets = cnn_face_detector(img, 1)#使用卷局神经网络进行检测
print("Number of faces detected: {}".format(len(dets))) for k, d in enumerate(dets):
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
k, d.rect.left(), d.rect.top(), d.rect.right(), d.rect.bottom()))
face = dlib.rectangle(d.rect.left(),d.rect.top(),d.rect.right(),d.rect.bottom())
cv2.rectangle(img, (face.left(), face.top()+10), (face.right(), face.bottom()), (0, 255, 0), 2)#显示人脸区域
cv2.imshow('image', img) t2 = datetime.now()#测试结束时间
print('time spend: ',(t2-t1).microseconds)#显示总的时间开销 cv2.waitKey(0)
cv2.destroyAllWindows()
运行,finally,显示框出的人脸图像~

终端显示:
Number of faces detected: 3
Detection 0: Left: 550 Top: 54 Right: 668 Bottom: 172
Detection 1: Left: 368 Top: 62 Right: 450 Bottom: 144
Detection 2: Left: 73 Top: 86 Right: 215 Bottom: 228
time spend: 176613
结果看出788x394大小包含三张人脸的图像检测花费了0.17s左右。Windows下cuda dlib的配置就到这里,本文也小试了一把用dlib进行人脸检测,后面有时间再写一下使用dlib进行实时人脸识别的过程吧~
(完)
win10+anaconda+cuda配置dlib,使用GPU对dlib的深度学习算法进行加速(以人脸检测为例)的更多相关文章
- TVM 优化 ARM GPU 上的移动深度学习
TVM 优化 ARM GPU 上的移动深度学习 随着深度学习的巨大成功,将深度神经网络部署到移动设备的需求正在迅速增长.与桌面平台上所做的类似,在移动设备中使用 GPU 既有利于推理速度,也有利于能源 ...
- TVM在ARM GPU上优化移动深度学习
TVM在ARM GPU上优化移动深度学习 随着深度学习的巨大成功,将深度神经网络部署到移动设备的需求正在迅速增长.与在台式机平台上所做的类似,在移动设备中使用GPU可以提高推理速度和能源效率.但是,大 ...
- Google Colab——用谷歌免费GPU跑你的深度学习代码
Google Colab简介 Google Colaboratory是谷歌开放的一款研究工具,主要用于机器学习的开发和研究.这款工具现在可以免费使用,但是不是永久免费暂时还不确定.Google Col ...
- Ubuntu16.04下安装配置numpy,scipy,matplotlibm,pandas 以及sklearn+深度学习tensorflow配置+Keras2.0.6(非Anaconda环境)
1.ubuntu镜像源准备(防止下载过慢): 参考博文:http://www.cnblogs.com/top5/archive/2009/10/07/1578815.html 步骤如下: 首先,备份一 ...
- 深度学习 GPU环境 Ubuntu 16.04 + Nvidia GTX 1080 + Python 3.6 + CUDA 9.0 + cuDNN 7.1 + TensorFlow 1.6 环境配置
本节详细说明一下深度学习环境配置,Ubuntu 16.04 + Nvidia GTX 1080 + Python 3.6 + CUDA 9.0 + cuDNN 7.1 + TensorFlow 1.6 ...
- 深度学习应用系列(一)| 在Ubuntu 18.04安装tensorflow 1.10 GPU版本
tensorflow目前已经升级至r1.10版本.在之前的深度学习中,我是在MAC的虚拟机上跑CPU版本的tensorflow程序,当数据量变大后,tensorflow跑的非常慢,在内存不足情况下,又 ...
- (转)深度学习主机环境配置: Ubuntu16.04+Nvidia GTX 1080+CUDA8.0
深度学习主机环境配置: Ubuntu16.04+Nvidia GTX 1080+CUDA8.0 发表于2016年07月15号由52nlp 接上文<深度学习主机攒机小记>,这台GTX10 ...
- 深度学习“引擎”之争:GPU加速还是专属神经网络芯片?
深度学习“引擎”之争:GPU加速还是专属神经网络芯片? 深度学习(Deep Learning)在这两年风靡全球,大数据和高性能计算平台的推动作用功不可没,可谓深度学习的“燃料”和“引擎”,GPU则是引 ...
- 玩深度学习选哪块英伟达 GPU?有性价比排名还不够!
本文來源地址:https://www.leiphone.com/news/201705/uo3MgYrFxgdyTRGR.html 与“传统” AI 算法相比,深度学习(DL)的计算性能要求,可以说完 ...
随机推荐
- 怎么解决ERROR in Node Sass does not yet support your current environmen问题?
好久没有重新安装node.js,昨天和小伙伴们一起安装,由于自己是在网上自行下载的node,安装地比较顺利,但另外两个小伙伴用的共享文件夹里自带的node,却是屡次碰到问题,快被逼疯,在运行Vue时总 ...
- js的join和split
1,split 将字符串转为数组 第一个参数必须,可以是字符串和正则表达式,表示从该地方开始分割字符串:第二个参数可选,表示返回数组的最大长度. split():把整个字符串塞入一个数组中 spl ...
- Linux - ubuntu中vi不能正常使用方向键与退格键的问题
一度怀疑是键盘坏了! 之前安装solaris也是这个问题! 重新安装vim就可以了! $sudo apt-get remove vim-common $sudo apt-get install vim
- linux 巨页使用测试以及勘误1
linux使用hugetlbfs的方式来支持巨页,也成为大页. 网上看到有人说巨页不支持read,和write调用,只支持mmap,但是看3.10内核代码的时候发现: const struct fil ...
- js_1_变量类型
js中有哪些变量类型? 数字(包括int和float),字符串,数组(字典,js没有字典类型,把字典看成一个对象) 如何把字符转成数字呢? obj.parseInt() // 转化成 ...
- base64_encode与base64_decode
base64_encode 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! base64_encode() returns 使用 base64 对 data 进行编码. ...
- android 通过getDimension,getDimensionPixelOffset和getDimensionPixelSize获取dimens.xml文件里面的变量值
dimens.xml里写上三个变量: <dimen name="activity_vertical_margin1">16dp</dimen> <di ...
- Zabbix-3.2.4实现微信(WeChat)告警
摘自abcdocker网站 原文地址:https://www.abcdocker.com/abcdocker/2472 Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式, ...
- AutoCAD开发选择----ObjectARX还是.net API(转载)
本文基于AutoCAD 2006新推出的.NET API为工具,介绍了在.NET平台下对AutoCAD进行二次开发的技术,并与目前常用的VBA.ObjectARX作了对比.同时讨论了如何弥补.NET ...
- c# 类属性和方法
属性 public 类字段 就相当于c#里面暴露给外面的属性 类似nodejs的 module.exports 但是属性又不同于普通的字段,属性只是外部包装字段 没有自己的任何含量 类似退换后的方法. ...