注意
前往末尾下載完整範例程式碼。或透過 Binder 在您的瀏覽器中執行此範例
使用級聯分類器進行人臉偵測#
這個電腦視覺範例展示如何使用基於機器學習的物件偵測框架來偵測影像中的人臉。
首先,您需要一個 xml 檔案,可以從中讀取已訓練的資料。這個框架適用於使用多區塊局部二值模式特徵(請參閱 MB-LBP)和具有注意力級聯的溫和 Adaboost 訓練的檔案。因此,偵測框架也適用於來自 OpenCV 的 xml 檔案。您可以在那裡找到經過訓練以偵測貓臉、側面臉孔和其他事物的檔案。但是,如果您想偵測正面臉孔,scikit-image 中已包含相關檔案。
接下來,您必須為 detect_multi_scale
函數指定參數。在這裡您可以找到每個參數的含義。
第一個是 scale_ratio
。為了找到所有人臉,該演算法會在多個尺度上進行搜尋。這是透過變更搜尋視窗的大小來完成的。最小視窗大小是訓練時使用的視窗大小。此大小在具有已訓練參數的 xml 檔案中指定。scale_ratio
參數指定每個步驟中搜尋視窗增大的比率。如果您增加此參數,則搜尋時間會減少,而準確度會降低。因此,某些尺度上的人臉可能無法偵測到。
step_ratio
指定用於在影像的每個尺度上搜尋人臉的滑動視窗的步長。如果此參數等於 1,則會搜尋所有可能的位置。如果參數大於 1,例如 2,則視窗將移動 2 個像素,並且不會在所有可能的位置搜尋人臉。透過增加此參數,我們可以減少演算法的工作時間,但準確度也會降低。
min_size
是尺度搜尋期間的最小搜尋視窗大小。max_size
指定視窗的最大大小。如果您知道要搜尋的影像上的人臉大小,則應盡可能精確地指定這些參數,因為您可以避免進行昂貴的計算,並可能減少誤報的數量。您可以透過增加 min_size
參數來節省大量時間,因為大多數時間都花費在最小尺度上的搜尋。
min_neighbor_number
和 intersection_score_threshold
參數是用來群集同一個人臉的過多偵測並過濾掉誤報。真人臉通常在它們周圍有很多偵測,而誤報通常只有單一偵測。首先,演算法搜尋叢集:如果兩個矩形偵測之間的交集分數大於 intersection_score_threshold
,則將它們放置在同一個叢集中。交集分數是使用方程式(交集區域)/(小矩形比率)計算的。選擇所述的交集標準而不是交集超過聯集,以避免小矩形在大的矩形內部時交集分數較小的情況。然後,使用 min_neighbor_number
參數對每個叢集進行閾值處理,這會保留其中偵測次數相同或更大的叢集。
您也應該考慮到誤報是不可避免的,如果您想要一個真正精確的偵測器,則必須使用 OpenCV 訓練級聯工具自行訓練它。

from skimage import data
from skimage.feature import Cascade
import matplotlib.pyplot as plt
from matplotlib import patches
# Load the trained file from the module root.
trained_file = data.lbp_frontal_face_cascade_filename()
# Initialize the detector cascade.
detector = Cascade(trained_file)
img = data.astronaut()
detected = detector.detect_multi_scale(
img=img, scale_factor=1.2, step_ratio=1, min_size=(60, 60), max_size=(123, 123)
)
fig, ax = plt.subplots()
ax.imshow(img, cmap='gray')
for patch in detected:
ax.axes.add_patch(
patches.Rectangle(
(patch['c'], patch['r']),
patch['width'],
patch['height'],
fill=False,
color='r',
linewidth=2,
)
)
plt.show()
腳本的總執行時間: (0 分鐘 0.481 秒)