从零配置dlib(GPU)
Written by Aquish
参考:
[ 记一次Win10环境python3.7安装dlib模块趟过的坑 ]
[ win10系统python下实现dlib的GPU加速 ]
写在前面
配环境真的是一件考验耐心的事,各种报错真的让人崩溃。但考虑到项目实时性的需要以及我那天天被拉满的可怜CPU,还是决定将GPU环境配好,网上的配置教程各有优劣,这里集几家之长做个记录,也给需要的同学排下雷。本文情况不一定契合你的情况,请读者们按需取用,谢谢。
整体环境
Windows10+GTX 1060
anaconda3+python 3.5.0
dlib19.9 + TensorFlow 1.12.0
cmake 3.13.0
CUDA 9.0+ cudnn 7.3.0
总体步骤
- 新建conda环境并配置python 3.5.0
- 安装vs2015 updata3
- 配置GPU环境
- CUDA
- cudnn
- 安装cmake
- 编译配置dlib
- 验证及常见报错解决
新建conda环境
以下默认你安装了anaconda并且会使用相应命令管理包
conda create -n 环境名称 python==3.5.0
# 激活环境,后续pip操作一定记得先激活相应环境
activate 环境名称
# 退出环境
conda deactivate
安装vs2015 update
SHA1:40EA340070E3684935689E60D8B7669D519D49D4
(我装的时候这个码并没有用到,可能这里只是用到它的环境,后续如果要用软件的话可能会用到)
在安装时记得自定义安装路径和工具。至少应该包括python工具、.net和C++环境,选择好安装目录后就是无尽的等待...
安装好后将cl.exe的路径加入环境变量,这里贴上我的环境供参考
配置好后在cmd界面输入cl测试,出现以下界面则代表vs环境配置完成
安装cmake
-
网上的教程很多是直接
pip install cmake
。但这个方法不适用我,后续添加环境变量以及编译的时候会有错,这里参考这篇文章,采用cmake客户端的方式安装。cmake客户端+dlib19.9的好处是可以自动避免很多环境变量的配置,减少了配置成本。 -
这里直接贴出cmake 3.13.0 安装包的下载链接,安装的过程中一定注意要添加系统环境变量选项打勾,重启机器后生效。
-
重启之后打开cmake,然后点击途中的“configure”按钮选择相应的vs版本,对于vs2015 update3应该选择“visual studio 14 2015 win64”选项;在上面的源码路径填写解压之后dlib的目录,注意是dlib目录,而不是包含版本信息的那个目录;然后选择编译输出的二进制文件目录,点击完成,开始配置。
如果一切顺利,cmake会提示类似于下面的信息,表示cuda版本的dlib已经顺利编译完成,在使用的时候可以开启gpu加速
配置GPU环境
首先,之前配置了CUDA的,想重新装一定要卸载干净CUDA和显卡驱动!
比如我之前装的是2.x的TensorFlow-gpu+CUDA10,在没卸载干净之前无论怎么装都是报错,具体卸载不要用杀毒软件,用系统自带的卸载工具,将带有cuda字眼的,除了留下:NVIDIA的图形驱动程序、NVIDIA Physx系统软件,其余全部删除。删除后重新安装你的TF环境
这个教程已经讲得特别详细了,请大家自行参照,唯一需要注意的点就是一定要把以前的CUDA和显卡驱动删除干净,顺便还可以把TensorFlow-gpu给配了hh
配置Dlib
可以采用源码方式,或在确保上面cmake成功配置的前提下,直接在环境内运行pip install dlib==19.9
,至此不出问题的话,dlib-gpu应该是配置完毕了,下面验证一下
验证
命令行验证
activate 环境名
python
>>>import dlib
>>>print(dlib.DLIB_USE_CUDA)
True
如图
demo验证
# -*- coding: utf-8 -*-
from datetime import datetime
import cv2
import dlib
img = cv2.imread('team.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()
模型参数可以在这里下载并解压到代码目录
可以看到编译速度降到了0.19s左右,正式大功告成!