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
這一步一切都很順利
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVPjRlT0kFVPBTQU10dVNDTwYVbiVHNHpleO1GTulzRilWO5x0LcRHelR3LcJzLctmch1mclRXY39jM1gDOxcjM1EjMyMDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
這裡要說一下這個dlib包,dlib的導入就沒有這麼成功了,因為它依賴Boost和cmake兩個包,是以在導入dlib前需要将這兩個包導入。否則就會報一下錯誤:
怎麼導入dlib了,網上方法很多是在Ubuntu下操作的,那我豈不是還要裝個虛拟機或雙系統才行,我想太麻煩了,其實也沒必要。可以直接在網上找到自己安裝Python版本對應的dlib包即可。怎麼檢視下載下傳哪個包麼,win7下按下windows鍵的所有程式中找到安裝python對應的IDLE界面,打開對應的shell:
輸入指令:
import pip;
print(pip.pep425tags.get_supported());即可顯示需要下載下傳的版本。
是以,我在網上找了好久,其實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檔案下的設定按鈕,找到項目,打開:
這個并非要找的路徑,但是這個提供了找到xml檔案的線索,進入Python36目錄下的Lib,Lib目錄下的site-packages,這裡有很多導入的包,進入cv2檔案夾下的data,是不是感覺發現新大陸了,裡面有很多xml
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後是圖檔的路徑,下面是我測試用的圖檔,百度圖檔下的:
第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,将檢測的結果儲存到指定位置。打開圖檔:
是不是覺得很神奇了。
其實這個方法并非十全十美,我之前用截的圖來進行檢測但并沒有得到任何結果,可見對于不太清晰的圖檔,該方法就會有遺漏,你看上面的第一張人臉不是也沒有檢測出來麼。
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