天天看點

Python下的人臉檢測

Python這門語言的十分的簡潔和優雅,并且有着豐富的第三方庫。在這裡,它隻需要7行代碼就能完成人臉的檢測,讓我們試着來玩一下吧,感受一下它的魅力。

1、首先需要導入包

所用電腦為window系統,Python版本為3.6.0

numpy(圖檔數字化),opencv-python(攝像頭和圖檔處理),scipy(科學計算),dlib(人臉識别)

實際上簡單的人臉檢測不需要導入這麼多包,隻需要導入opencv-python這個就足夠了。我這裡寫這麼多是因為我看的第一篇文章用50行Python代碼實作人臉檢測點選打開連結,但我并沒有成功,可能是因為某些方面沒讓我看明白。首先,我在導包的時候就碰到了一些問題。導包過程其實很簡單,cmd打開指令行,然後在彈出的視窗中輸入:

pip install numpy

pip install scipy

pip install opencv-python

這一步一切都很順利

Python下的人臉檢測

這裡要說一下這個dlib包,dlib的導入就沒有這麼成功了,因為它依賴Boost和cmake兩個包,是以在導入dlib前需要将這兩個包導入。否則就會報一下錯誤:

Python下的人臉檢測

怎麼導入dlib了,網上方法很多是在Ubuntu下操作的,那我豈不是還要裝個虛拟機或雙系統才行,我想太麻煩了,其實也沒必要。可以直接在網上找到自己安裝Python版本對應的dlib包即可。怎麼檢視下載下傳哪個包麼,win7下按下windows鍵的所有程式中找到安裝python對應的IDLE界面,打開對應的shell:

Python下的人臉檢測
Python下的人臉檢測

輸入指令:

import pip;

print(pip.pep425tags.get_supported());即可顯示需要下載下傳的版本。

Python下的人臉檢測

是以,我在網上找了好久,其實csdn上也有很多人上傳了,但是要積分才能下,不夠人性化,找到了python3.6下對應的dlib包https://pypi.python.org/pypi/dlib/19.8.1

dlib-19.8.1-cp36-cp36m-win_amd64.whl (md5)

然後cmd指令視窗cd進入下載下傳的dlib報下的目錄,輸入:

pip install dlib-19.8.1-cp36-cp36m-win_amd64.whl 即可。

感覺走遠了,但要作進一步的人臉識别的話,這些包必須要導入。言歸正傳,接下來看看7行代碼如何實作檢測的。

2、代碼實作與說明

第一行 引入OpenCV

import cv2

openCV是一個基于BSD許可發行的跨平台計算機視覺庫,可以運作在Linux、Windows和Mac OS作業系統上,輕量而且高效,用C/C++編寫,同時提供Python、Ruby、Matlab等接口,實作了圖像處理和計算機視覺方面的很多通用算法。

第2行 加載分類器cv2.CascadeClassifier

face_patterns = cv2.CascadeClassifier('C:/Users/###/AppData/Local/Programs/Python/Python36/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')

這裡要說明一下,找到安裝openCV目錄下的haarcascade_frontalface_default.xml即可。

怎麼找了,我是用的PyCharm工具,點選PyCharm檔案下的設定按鈕,找到項目,打開:

Python下的人臉檢測

這個并非要找的路徑,但是這個提供了找到xml檔案的線索,進入Python36目錄下的Lib,Lib目錄下的site-packages,這裡有很多導入的包,進入cv2檔案夾下的data,是不是感覺發現新大陸了,裡面有很多xml

Python下的人臉檢測

CascadeClassifier是OpenCV中做人臉檢測時候的一個級聯分類器,該類中封裝的是目标檢測機制即滑動視窗機制+級聯分類器的方式。資料結構包括Data和FeatureEvaluator兩個主要部分。Data中存儲的是從訓練獲得的xml檔案中載入的分類器資料;而FeatureEvaluator中關于特征的載入、存儲和計算。這裡采用的訓練檔案是OpenCV中預設提供的haarcascade_frontalface_default.xml。至于Haar,LBP的具體原理,可以參考OpenCV的相關文檔,簡單地,可以了解為人臉的特征資料。

第3行 加載目标圖檔imread

sample_image = cv2.imread('E:/###/pythonprojects/Face/c23e4fd29d58e9eac327b781a04d695d.jpg')

這一步是讀取相應的圖檔,imread後是圖檔的路徑,下面是我測試用的圖檔,百度圖檔下的:

Python下的人臉檢測

第4行 多尺度檢測detectMultiScale

faces = face_patterns.detectMultiScale(sample_image, scaleFactor=1.1, minNeighbors=5, minSize=(100, 100))

CascadeClassifier中調detectMultiScale函數進行多尺度檢測,多尺度檢測中會調用但尺度的方法detectSingleScale。

參數說明:

scaleFactor: 圖形的縮放因子

minNeighbors:為每一個級聯矩陣應該保留的鄰近個數,可以了解為一個人周邊有幾個人臉

minSize:是檢測視窗的大小

這些參數都是可以針對圖檔進行調整的,處理結果傳回一個人臉的矩形對象清單。

第5行和第6行 為每個人臉畫一個框

for (x, y, w, h) in faces:

    cv2.rectangle(sample_image, (x, y), (x+w, y+h), (0, 255, 0), 2)

循環讀取人臉的矩形對象清單,獲得人臉矩形的坐标和寬高,然後在原圖檔中畫出該矩形框,調用的是OpenCV的retangle方法,其中矩形框的顔色等是可調整的。

第7行 儲存檢測後的圖檔結果

cv2.imwrite('E:/###/pythonprojects/Face/smilegirl1.png', sample_image)

調用imwrite,将檢測的結果儲存到指定位置。打開圖檔:

Python下的人臉檢測

是不是覺得很神奇了。

其實這個方法并非十全十美,我之前用截的圖來進行檢測但并沒有得到任何結果,可見對于不太清晰的圖檔,該方法就會有遺漏,你看上面的第一張人臉不是也沒有檢測出來麼。

3、整理代碼

import cv2

face_patterns = cv2.CascadeClassifier('C:/Users/###/AppData/Local/Programs/Python/Python36/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')

sample_image = cv2.imread('E:/###/pythonprojects/Face/c23e4fd29d58e9eac327b781a04d695d.jpg')

faces = face_patterns.detectMultiScale(sample_image, scaleFactor=1.1, minNeighbors=5, minSize=(100, 100))

for (x, y, w, h) in faces:

    cv2.rectangle(sample_image, (x, y), (x+w, y+h), (0, 255, 0), 2)

cv2.imwrite('E:/###/pythonprojects/Face/smilegirl1.png', sample_image)

是不是更清晰了,7行代碼中真正核心的是OpenCV。有興趣的可以多花點時間研究下其中的原理。

參考連結:

https://blog.csdn.net/wireless_com/article/details/64120516

https://mp.weixin.qq.com/s?__biz=MzAxMjUyNDQ5OA==&mid=2653555689&idx=1&sn=88ade47d3a1e106522dbe9ad742a2cbe&chksm=806e2554b719ac429eeffbc76191f9e81629b0954e90c1b389d2a46b5d947b178aa84a58ac10&mpshare=1&scene=23&srcid=03160dPMObw9v9fgJGmeupb1#rd

https://www.zhihu.com/question/34524316