面部標(biāo)志的檢測(cè)是檢測(cè)面部各個(gè)部位的過(guò)程,例如眉毛、眼睛、鼻子、嘴巴和下巴。有許多應(yīng)用程序使用面部地標(biāo)檢測(cè)技術(shù)。
今天我們將使用相同的 OpenCV 和 Raspberry Pi 進(jìn)行人臉標(biāo)志檢測(cè)。來(lái)自 dlib 庫(kù)的預(yù)訓(xùn)練面部標(biāo)志檢測(cè)器模塊將用于檢測(cè)面部關(guān)鍵面部結(jié)構(gòu)的位置,python OpenCV 將用于可視化檢測(cè)到的面部部分。
所需組件
硬件組件
樹(shù)莓派 3
Pi 相機(jī)模塊
軟件和在線(xiàn)服務(wù)
開(kāi)放式CV
數(shù)據(jù)庫(kù)
在繼續(xù)這個(gè) Raspberry Pi 3 面部地標(biāo)檢測(cè)之前,首先,我們需要在這個(gè)項(xiàng)目中安裝 OpenCV、imutils、dlib、Numpy 和一些其他依賴(lài)項(xiàng)。OpenCV 在這里用于 數(shù)字圖像處理。數(shù)字圖像處理最常見(jiàn)的應(yīng)用是 物體檢測(cè)、 人臉識(shí)別和 人數(shù)統(tǒng)計(jì)。
要了解有關(guān)如何將 Pi 相機(jī)與 Raspberry Pi 連接的更多信息,請(qǐng)按照我們 之前的教程進(jìn)行操作。
在樹(shù)莓派中安裝 OpenCV
這里 OpenCV 庫(kù)將用于 Raspberry Pi QR 掃描儀。要安裝 OpenCV,首先,更新 Raspberry Pi。
?
sudo apt-get 更新
?
然后安裝在 Raspberry Pi 上安裝 OpenCV 所需的依賴(lài)項(xiàng)。
?
sudo apt-get install libhdf5-dev -y sudo apt-get install libhdf5-serial-dev –y sudo apt-get install libatlas-base-dev –y sudo apt-get install libjasper-dev -y sudo apt-get install libqtgui4 –y sudo apt-get install libqt4-test –y
?
之后,使用以下命令在 Raspberry Pi 中安裝 OpenCV。
?
pip3 安裝 opencv-contrib-python==4.1.0.25
?
安裝?imutils:??imutils 用于執(zhí)行一些必要的圖像處理功能,例如平移、旋轉(zhuǎn)、調(diào)整大小、骨架化,以及使用 OpenCV 更輕松地顯示 Matplotlib 圖像。因此,使用以下命令安裝?imutils? :
?
pip3 安裝 imutils
?
安裝 dlib:dlib是現(xiàn)代工具包,其中包含用于解決實(shí)際問(wèn)題的機(jī)器學(xué)習(xí)算法和工具。使用以下命令安裝 dlib。
?
pip3 安裝 dlib
?
安裝NumPy:NumPy是科學(xué)計(jì)算的核心庫(kù),包含強(qiáng)大的 n 維數(shù)組對(duì)象,提供集成 C、C++ 等的工具。
?
Pip3 安裝 numpy
?
如何使用 dlib 檢測(cè)面部部位
我們將使用 dlib 庫(kù)的預(yù)訓(xùn)練面部標(biāo)志檢測(cè)器來(lái)檢測(cè)映射到面部面部結(jié)構(gòu)的 68 個(gè) (x, y) 坐標(biāo)的位置。dlib 面部地標(biāo)預(yù)測(cè)器在iBUG 300-W 數(shù)據(jù)集上進(jìn)行訓(xùn)練。下面給出了包含 68 個(gè)坐標(biāo)索引的圖像:
對(duì) Raspberry Pi 進(jìn)行面部地標(biāo)檢測(cè)編程
頁(yè)面末尾給出了帶有 dlib 的預(yù)訓(xùn)練面部標(biāo)志檢測(cè)器的面部部件識(shí)別的完整 Python 代碼。在這里,我們將解釋代碼的一些重要部分,以便更好地理解。
因此,像往常一樣,通過(guò)包含所有必需的庫(kù)來(lái)啟動(dòng)代碼。
?
從 imutils 導(dǎo)入 face_utils 將 numpy 導(dǎo)入為 np 導(dǎo)入參數(shù)解析 導(dǎo)入 imutils 導(dǎo)入 dlib 導(dǎo)入簡(jiǎn)歷2 從 picamera.ar??ray 導(dǎo)入 PiRGBArray 從 picamera 導(dǎo)入 PiCamera?
?
然后初始化相機(jī)對(duì)象并將分辨率設(shè)置為 (640, 480),幀速率設(shè)置為 30 fps
?
相機(jī) = PiCamera() camera.resolution = (640, 480) 相機(jī).幀率 = 30
?
現(xiàn)在在接下來(lái)的幾行中,使用參數(shù)解析器提供面部標(biāo)志預(yù)測(cè)器的路徑。
?
ap = argparse.ArgumentParser() ap.add_argument("-p", "--shape-predictor", required=True, help="面部地標(biāo)預(yù)測(cè)路徑") args = vars(ap.parse_args())
?
在接下來(lái)的幾行中,初始化基于 HOG 的 dlib 的預(yù)訓(xùn)練面部檢測(cè)器并加載預(yù)訓(xùn)練的面部特征預(yù)測(cè)器。
?
檢測(cè)器 = dlib.get_frontal_face_detector() 預(yù)測(cè)器 = dlib.shape_predictor(args["shape_predictor"])
?
然后使用capture_continuous函數(shù)開(kāi)始從 Raspberry Pi 相機(jī)捕獲幀。
?
對(duì)于 camera.capture_continuous(rawCapture, format="bgr", use_video_port=True) 中的幀: 圖像 = frame.array cv2.imshow("幀", 圖片) 鍵 = cv2.waitKey(1) & 0xFF rawCapture.truncate(0)
?
使用鍵盤(pán)鍵“S”捕獲特定幀。然后調(diào)整捕獲的圖像大小并將其轉(zhuǎn)換為灰度。
?
如果鍵 == ord("s"): 圖像 = imutils.resize(圖像,寬度 = 400) 灰色 = cv2.cvtColor(圖像,cv2.COLOR_BGR2GRAY)
?
使用 dlib 庫(kù)的檢測(cè)器功能來(lái)檢測(cè)捕獲圖像中的人臉。
?
rects = 檢測(cè)器(灰色,1)
?
拍攝執(zhí)行人臉檢測(cè)的照片,確定人臉標(biāo)志,并將 68 個(gè)點(diǎn)轉(zhuǎn)換為 NumPy 數(shù)組。分別循環(huán)每個(gè)面部區(qū)域。
?
枚舉(rects)中的(i,rect): 形狀 = 預(yù)測(cè)器(灰色,矩形) 形狀 = face_utils.shape_to_np(形狀)
?
然后,獲取原始圖像的副本并用于循環(huán)以在圖像上繪制面部部分的名稱(chēng)。文本顏色將為紅色,您可以通過(guò)更改 RGB 值將其更改為另一種顏色。
?
對(duì)于 face_utils.FACIAL_LANDMARKS_IDXS.items() 中的 (name, (i, j)): 克隆 = image.copy() cv2.putText(克隆, 名稱(chēng), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
?
現(xiàn)在我們將遍歷檢測(cè)到的面部部位,并使用OpenCV繪圖功能在這些面部部位上繪制圓圈。您可以關(guān)注此OpenCV 文檔以獲取有關(guān)繪圖功能的更多信息
?
對(duì)于形狀 [i:j] 中的 (x, y): cv2.circle(克隆, (x, y), 1, (0, 0, 255), -1)
?
現(xiàn)在在接下來(lái)的幾行中,我們將通過(guò)計(jì)算特定面部部分坐標(biāo)的邊界框來(lái)將每個(gè)面部部分提取為單獨(dú)的圖像。提取的圖像將被調(diào)整為 250 像素。
?
(x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]])) 投資回報(bào)率 = 圖像[y:y + h, x:x + w] roi = imutils.resize(roi, width=250, inter=cv2.INTER_CUBIC)
?
現(xiàn)在在代碼的最后幾行中,顯示面部部位及其名稱(chēng)和該部位的單獨(dú)圖像。使用 ESC 鍵更改面部區(qū)域。
?
cv2.imshow("ROI", roi) cv2.imshow("圖像", 克隆) cv2.waitKey(0)
?
測(cè)試面部識(shí)別器
要測(cè)試項(xiàng)目,請(qǐng)創(chuàng)建一個(gè)目錄并使用以下命令導(dǎo)航到該目錄:
?
mkdir face-part-detector cd face-part-detector
?
現(xiàn)在從此鏈接下載 shape_predictor_68_face_landmarks.dat 文件,然后將shape_predictor_68_face_landmarks.dat文件提取并復(fù)制到該庫(kù)中,然后打開(kāi)一個(gè)名為detect.py的新文件并粘貼下面給出的代碼。
現(xiàn)在使用以下命令啟動(dòng) python 代碼:
python3 detect.py --shape-predictor shape_predictor_68_face_landmarks.dat
您將看到一個(gè)窗口,顯示您的相機(jī)的實(shí)時(shí)視圖。然后按“S”鍵從實(shí)時(shí)流中選擇一幀。您會(huì)在嘴巴區(qū)域看到紅點(diǎn)。使用 ESC 鍵查看其他面部零件。
從 imutils 導(dǎo)入 face_utils
將 numpy 導(dǎo)入為 np
導(dǎo)入?yún)?shù)解析
導(dǎo)入 imutils
導(dǎo)入 dlib
導(dǎo)入簡(jiǎn)歷2
從 picamera.ar??ray 導(dǎo)入 PiRGBArray
從 picamera 導(dǎo)入 PiCamera
從 PIL 導(dǎo)入圖像
相機(jī) = PiCamera()
camera.resolution = (640, 480)
相機(jī).幀率 = 30
rawCapture = PiRGBArray(相機(jī),尺寸=(640,480))
# 構(gòu)造參數(shù)解析器并解析參數(shù)
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--shape-predictor", required=True,
help="面部地標(biāo)預(yù)測(cè)路徑")
args = vars(ap.parse_args())
檢測(cè)器 = dlib.get_frontal_face_detector()
預(yù)測(cè)器 = dlib.shape_predictor(args["shape_predictor"])
對(duì)于 camera.capture_continuous(rawCapture, format="bgr", use_video_port=True) 中的幀:
圖像 = frame.array
cv2.imshow("幀", 圖片)
鍵 = cv2.waitKey(1) & 0xFF
rawCapture.truncate(0)
如果鍵 == ord("s"):
圖像 = imutils.resize(圖像,寬度 = 300)
灰色 = cv2.cvtColor(圖像,cv2.COLOR_BGR2GRAY)
rects = 檢測(cè)器(灰色,1)
# 循環(huán)人臉檢測(cè)
枚舉(rects)中的(i,rect):
# 確定面部區(qū)域的面部標(biāo)志
形狀 = 預(yù)測(cè)器(灰色,矩形)
形狀 = face_utils.shape_to_np(形狀)
# 分別循環(huán)面部部分
對(duì)于 face_utils.FACIAL_LANDMARKS_IDXS.items() 中的 (name, (i, j)):
# 在圖像上顯示人臉部分的名稱(chēng)
克隆 = image.copy()
cv2.putText(克隆, 名稱(chēng), (10, 30), cv2.FONT_HERSHEY_SIMPLEX,
0.7, (0, 0, 255), 2)
# 在特定的面部部分繪制圓圈
對(duì)于形狀 [i:j] 中的 (x, y):
cv2.circle(克隆, (x, y), 1, (0, 0, 255), -1)
# 提取人臉區(qū)域的ROI作為單獨(dú)的圖像
(x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]]))
投資回報(bào)率 = 圖像[y:y + h, x:x + w]
roi = imutils.resize(roi, width=250, inter=cv2.INTER_CUBIC)
# 顯示特定的面部部分
cv2.imshow("ROI", roi)
cv2.imshow("圖像", 克隆)
cv2.waitKey(0)
# 可視化所有面部地標(biāo)
對(duì)于 (x, y) 的形狀:
cv2.circle(圖像, (x, y), 1, (0, 0, 255), -1)
cv2.imshow("圖像",圖像)
cv2.waitKey(0)
評(píng)論