看了《7行Python的人脸识别》一文后,简单尝试了一下,发现识别准确度不够。原始图像以下:html
识别后的结果:python
把酒杯识别成了人脸,而该是人脸的又没有识别出来,还多余识别了一条裤子。算法
检查代码,最关键是第2条语句:segmentfault
face_patterns = cv2.CascadeClassifier('/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml')
咱们检查/usr/local/opt/opencv/share/OpenCV
这个目录,发现它下面的内容是这样的:工具
下面有2个子目录,分别是haarcascades
和lbpcascades
,这里面还包括了眼睛识别,鼻子识别,嘴巴识别等等,甚至还有猫脸识别,此外,光人脸识别就有好几种:frontalface_default
, frontalface_alt
, frontalface_alt2
, frontalface_alt_tree
等等,你能够挨个试一下(我试的结果是哪一个也不许确)。实际上就是OpenCV
经过Haar
特征和LBP
特征预置了一些事先作好的结果以方便用户调用。关于这些特征是如何提取的,能够参见《图像特征提取三大法宝:HOG特征,LBP特征,Haar特征》。spa
那咱们把第2条语句换成LBP
试一下呢?code
face_patterns = cv2.CascadeClassifier('/usr/local/opt/opencv/share/OpenCV/lbpcascades/lbpcascade_frontalface.xml')
结果也并不理想,不是没有把人脸识别出来,就是把杯子识别成了人脸,不是多了就是少了,老是不能正确识别全部人脸。xml
那么有没有办法提升人脸识别的准确度呢?无心中发现了dlib
这个神器,它实现了一篇大牛论文《One Millisecond Face Alignment with an Ensemble of Regression Trees》里的算法,论文标题就叫《用集成回归树实现一毫秒的人脸识别》,可见做者的自信。htm
膜拜完大神,直接开干!首先,安装dlib
以及相关依赖工具:图片
brew install boost brew install boost-python pip install dlib pip install scikit-image
代码略做改动:
import dlib from skimage import io from skimage.draw import polygon_perimeter detector = dlib.get_frontal_face_detector() sample_image = io.imread('/Users/zhangjing/Desktop/IMG_5528.jpg') faces = detector(sample_image, 1) for d in faces: rr, cc = polygon_perimeter([d.top(), d.top(), d.bottom(), d.bottom()], [d.right(), d.left(), d.left(), d.right()]) sample_image[rr, cc] = (0, 255, 0) io.imsave('/Users/zhangjing/Desktop/IMG_5528_detected_dlib.jpg', sample_image)
执行以后效果是这样的:
完美识别!
结论:若是要作人脸识别的话,建议选择dlib,而不要选择OpenCV。