马上就五一了,发呆的时候想到了之前接触过一点儿的Dlib,在c++下的使用,正好今天有人问起了会不会OpenCV,于是…
dlib与OpenCV对比:识别精准度:Dlib >= OpenCV,Dlib更多的人脸识别模型,可以检测脸部68甚至更多的特征点。Dlib是一个跨平台的C++公共库,除了线程支持,网络支持,提供测试以及大量工具等等优点,Dlib还是一个强大的机器学习的C++库,包含了许多机器学习常用的算法。同时支持大量的数值算法如矩阵、大整数、随机数运算等等。Dlib同时还包含了大量的图形模型算法。
Dlib主页:http://dlib.net/
之前是在vs环境下,今天主要说一下在ubuntu下的环境配置。人脸标记的算法也是来自Dlib库,Dlib实现了One Millisecond Face Alignment with an Ensemble of Regression Trees中的算法(http://www.csc.kth.se/~vahidk/papers/KazemiCVPR14.pdf,作者为Vahid Kazemi 和Josephine Sullivan)
安装模块:之前使用的一些模块numpy、python-dev、python-scipy、python-matplotlib等,还是“缺啥装啥”就可以。
安装dlib
首先必须安装libboost,不然是不能使用.so库的:
sudo apt-get install libboost-python-dev cmake
以dlib-18.17为例:下载在自己的一个目录下 链接:https://pan.baidu.com/s/1QWL1XA9E79KiVuTgotPaIA 提取码:qfmz
之后进入python_examples下使用bat文件进行编译,编译需要先安装libboost-python-dev和cmake
cd /home/*****/dlib-18.17/python_examples
sudo chmod 777 /home/*****/dlib-18.17/python_examples/compile_dlib_python_module.bat
./compile_dlib_python_module.bat
之后会得到一个dlib.so,复制到dist-packages目录下即可使用(视自己的电脑python版本而定的对应目录)
sudo cp dlib.so /usr/local/lib/python2.7/dist-packages/
或者 sudo cp dlib.so /usr/local/lib/python3.5/dist-packages/
安装skimage的时候,发现有问题
(1)from skimage import io 报错,找不到模块,直接安装发现pip版本不对
(2)sudo apt-get install python-skimage 发现已经安装
(3)sudo apt-get install scikit-image
之后使用 sudo -H python3 -m pip install scikit-image完成了.whl的安装
需要注意的是,在py文件import的时候,不需要from scikit-image import io,否则会报错“SyntaxError: invalid syntax”输入符号错误,直接使用from skimage import io即可。
测试照片:
控制台命令行输入:python3 test.py ./data/2.jpg
# -*- coding: utf-8 -*-
import sys
import dlib
from skimage import io
#使用dlib自带的frontal_face_detector作为我们的特征提取器
detector = dlib.get_frontal_face_detector()
#使用dlib提供的图片窗口
win = dlib.image_window()
#sys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码本身文件路径,所以参数从1开始向后依次获取图片路径
for f in sys.argv[1:]:
#输出目前处理的图片地址
print("Processing file: {}".format(f))
#使用skimage的io读取图片
img = io.imread(f)
#使用detector进行人脸检测 dets为返回的结果
dets = detector(img, 1)
#dets的元素个数即为脸的个数
print("Number of faces detected: {}".format(len(dets)))
#使用enumerate 函数遍历序列中的元素以及它们的下标
#下标i即为人脸序号
#left:人脸左边距离图片左边界的距离 ;right:人脸右边距离图片左边界的距离
#top:人脸上边距离图片上边界的距离 ;bottom:人脸下边距离图片上边界的距离
for i, d in enumerate(dets):
print("dets{}".format(d))
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}"
.format( i, d.left(), d.top(), d.right(), d.bottom()))
#也可以获取比较全面的信息,如获取人脸与detector的匹配程度
dets, scores, idx = detector.run(img, 1)
for i, d in enumerate(dets):
print("Detection {}, dets{},score: {}, face_type:{}".format( i, d, scores[i], idx[i]))
#绘制图片(dlib的ui库可以直接绘制dets)
win.set_image(img)
win.add_overlay(dets)
#等待点击
dlib.hit_enter_to_continue()
from skimage import io
import matplotlib.pyplot as plt
img=io.imread(‘2.jpg’)
io.imshow(img)
plt.show()