在计算机视觉和机器学习方向有一个特别好用但是比较低调的库,也就是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/也会经常更新一些新的算法介绍,不过博客网站可能需要FQ,下面的评论很多~从官网的介绍可以看出来里面实现了不少像矩阵计算、图像处理、机器学习之类的算法,并且提供了好用的接口;你可以按照教程使用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:anacondaanacondaLibsite-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:anacondaanacondaLibsite-packagesdlib-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)。测试代码如下:
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Tue Feb 13 23:28:44 2018 4 5 @author: czz 6 """ 7 8 import dlib 9 import cv2 10 from datetime import datetime 11 12 img = cv2.imread('test.jpg')#载入测试图片 13 cnn_face_detector = dlib.cnn_face_detection_model_v1('mmod_human_face_detector.dat')#加载训练好的人脸检测模型 14 15 t1= datetime.now()#测试起始时间 16 dets = cnn_face_detector(img, 1)#使用卷局神经网络进行检测 17 print("Number of faces detected: {}".format(len(dets))) 18 19 for k, d in enumerate(dets): 20 print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format( 21 k, d.rect.left(), d.rect.top(), d.rect.right(), d.rect.bottom())) 22 face = dlib.rectangle(d.rect.left(),d.rect.top(),d.rect.right(),d.rect.bottom()) 23 cv2.rectangle(img, (face.left(), face.top()+10), (face.right(), face.bottom()), (0, 255, 0), 2)#显示人脸区域 24 cv2.imshow('image', img) 25 26 t2 = datetime.now()#测试结束时间 27 print('time spend: ',(t2-t1).microseconds)#显示总的时间开销 28 29 cv2.waitKey(0) 30 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进行实时人脸识别的过程吧~
(完)