Python中怎么實現(xiàn)人臉檢測,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
鄯善網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)公司于2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運(yùn)維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
首先需要安裝這些包,以Ubuntu為例:
$ sudo apt-get install build-essential cmake $ sudo apt-get install libgtk-3-dev $ sudo apt-get install libboost-all-dev
我們的程序中還用到numpy,opencv,所以也需要安裝這些庫:
$ pip install numpy $ pip install scipy $ pip install opencv-python $ pip install dlib
人臉檢測基于事先訓(xùn)練好的模型數(shù)據(jù),從這里可以下到模型數(shù)據(jù)
http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
下載到本地路徑后解壓,記下解壓后的文件路徑,程序中會用到。
dlib的人臉特征點
上面下載的模型數(shù)據(jù)是用來估計人臉上68個特征點(x, y)的坐標(biāo)位置,這68個坐標(biāo)點的位置如下圖所示:
我們的程序?qū)瑑蓚€步驟:
***步,在照片中檢測人臉的區(qū)域
第二部,在檢測到的人臉區(qū)域中,進(jìn)一步檢測器官(眼睛、鼻子、嘴巴、下巴、眉毛)
人臉檢測代碼
我們先來定義幾個工具函數(shù):
def rect_to_bb(rect): x = rect.left() y = rect.top() w = rect.right() - x h = rect.bottom() - y return (x, y, w, h)
這個函數(shù)里的rect是dlib臉部區(qū)域檢測的輸出。這里將rect轉(zhuǎn)換成一個序列,序列的內(nèi)容是矩形區(qū)域的邊界信息。
def shape_to_np(shape, dtype="int"): coords = np.zeros((68, 2), dtype=dtype) for i in range(0, 68): coords[i] = (shape.part(i).x, shape.part(i).y) return coords
這個函數(shù)里的shape是dlib臉部特征檢測的輸出,一個shape里包含了前面說到的臉部特征的68個點。這個函數(shù)將shape轉(zhuǎn)換成Numpy array,為方便后續(xù)處理。
def resize(image, width=1200): r = width * 1.0 / image.shape[1] dim = (width, int(image.shape[0] * r)) resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA) return resized
這個函數(shù)里的image就是我們要檢測的圖片。在人臉檢測程序的***,我們會顯示檢測的結(jié)果圖片來驗證,這里做resize是為了避免圖片過大,超出屏幕范圍。
接下來,開始我們的主程序部分
import sys import numpy as np import dlib import cv2 if len(sys.argv) < 2: print "Usage: %s" % sys.argv[0] sys.exit(1) image_file = sys.argv[1] detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
我們從sys.argv[1]參數(shù)中讀取要檢測人臉的圖片,接下來初始化人臉區(qū)域檢測的detector和人臉特征檢測的predictor。shape_predictor中的參數(shù)就是我們之前解壓后的文件的路徑。
image = cv2.imread(image_file) image = resize(image, width=1200) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) rects = detector(gray, 1)
在檢測特征區(qū)域前,我們先要檢測人臉區(qū)域。這段代碼調(diào)用opencv加載圖片,resize到合適的大小,轉(zhuǎn)成灰度圖,***用detector檢測臉部區(qū)域。因為一張照片可能包含多張臉,所以這里得到的是一個包含多張臉的信息的數(shù)組rects。
for (i, rect) in enumerate(rects): shape = predictor(gray, rect) shape = shape_to_np(shape) (x, y, w, h) = rect_to_bb(rect) cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.putText(image, "Face #{}".format(i + 1), (x - 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) for (x, y) in shape: cv2.circle(image, (x, y), 2, (0, 0, 255), -1) cv2.imshow("Output", image) cv2.waitKey(0)
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。