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