10行Python實現更快更準的人臉識別

7行代碼(OpenCV)的人臉識別

看了《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個子目錄,分別是haarcascadeslbpcascades,這裏面還包括了眼睛識別,鼻子識別,嘴巴識別等等,甚至還有貓臉識別,此外,光人臉識別就有好幾種: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

10行代碼(dlib)的人臉識別

那麼有沒有辦法提升人臉識別的準確度呢?無心中發現了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。

相關文章
相關標籤/搜索