看了《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。