OpenCV-Python實戰(16)——人臉追蹤詳解
- 0. 前言
- 1. 人臉追蹤技術簡介
- 2. 使用基于 dlib DCF 的跟蹤器進行人臉跟蹤
- 2.1 完整代碼
- 3. 使用基于 dlib DCF 的跟蹤器進行物件跟蹤
- 3.2 完整代碼
- 小結
- 系列鏈接
0. 前言
人臉處理是人工智能中的一個熱門話題,人臉處理可以使用計算機視覺演算法從人臉中自動提取大量資訊,例如身份、意圖和情感;而目標跟蹤試圖估計目標在整個視頻序列中的軌跡,其中只有目標的初始位置是已知的,將這兩者進行結合將產生許多有趣的應用,由于外觀變化、遮擋、快速運動、運動模糊和比例變化等多種因素,人臉追蹤非常具有挑戰性,
1. 人臉追蹤技術簡介
基于判別相關濾波器 (discriminative correlation filter, DCF) 的視覺跟蹤器具有優異的性能和較高的計算效率,可用于實時應用程式,DCF 跟蹤器是一種非常流行的基于邊界框跟蹤的方法,
在 dlib 庫中實作了基于 DCF 的跟蹤器,可以很方便的將其用于物件跟蹤,在本文中,我們將介紹如何使用此跟蹤器進行人臉和用戶選擇物件的跟蹤,這種方法也稱為判別尺度空間跟蹤器 (Discriminative Scale Space Tracker, DSST),追蹤器僅需要輸入原始視頻和目標初始位置的邊界框,然后跟蹤器自動預測目標的軌跡,
2. 使用基于 dlib DCF 的跟蹤器進行人臉跟蹤
在進行人臉追蹤時,我們首先使用 dlib 人臉檢測器進行初始化,然后使用基于 dlib DCF 的跟蹤器 DSST 進行人臉跟蹤,呼叫以下函式初始化相關跟蹤器:
tracker = dlib.correlation_tracker()
這將使用默認值 (filter_size = 6, num_scale_levels = 5, scale_window_size = 23, regularizer_space = 0.001, nu_space = 0.025, regularizer_scale = 0.001, nu_scale = 0.025, scale_pyramid_alpha = 1.020) 初始化跟蹤器, filter_size 和 num_scale_levels 的值越大,跟蹤精度越高,但它需要算力也更大;filter_size 的推薦使用值為 5、6 和 7;num_scale_levels 的推薦使用值為 4、5 和 6,
使用 tracker.start_track() 可以開始跟蹤,在開始追蹤前,我們需要先執行人臉檢測,并將檢測到的人臉位置傳遞給這個方法:
if tracking_face is False:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 嘗試檢測人臉以初始化跟蹤器
rects = detector(gray, 0)
# 檢查是否檢測到人臉
if len(rects) > 0:
# 開始追蹤
tracker.start_track(frame, rects[0])
tracking_face = True
當檢測到人臉后,人臉跟蹤器將開始跟蹤邊界框內的內容,為了更新被跟蹤物件的位置,需要呼叫 tracker.update() 方法:
tracker.update(frame)
tracker.update() 方法更新跟蹤器并回傳衡量跟蹤器置信度的指標,此指標可用于使用人臉檢測重新初始化跟蹤器,
要獲取被跟蹤物件的位置,需要呼叫 tracker.get_position() 方法:
pos = tracker.get_position()
tracker.get_position() 方法回傳被跟蹤物件的位置,最后,繪制人臉的預測位置:
cv2.rectangle(frame, (int(pos.left()), int(pos.top())), (int(pos.right()), int(pos.bottom())), (0, 255, 0), 3)
下圖中,顯示了人臉跟蹤演算法的跟蹤效果程序:

在上圖中,可以看到演算法當前正在跟蹤檢測到的人臉,同時還可以按數字 1 以重新初始化跟蹤,
2.1 完整代碼
完整代碼如下所示,同時我們需要提供按下數字 1 時重新初始化跟蹤器的選項,
import cv2
import dlib
def draw_text_info():
# 繪制文本的位置
menu_pos_1 = (10, 20)
menu_pos_2 = (10, 40)
# 繪制選單資訊
cv2.putText(frame, "Use '1' to re-initialize tracking", menu_pos_1, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255))
if tracking_face:
cv2.putText(frame, "tracking the face", menu_pos_2, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0))
else:
cv2.putText(frame, "detecting a face to initialize tracking...", menu_pos_2, cv2.FONT_HERSHEY_SIMPLEX, 0.5,
(0, 0, 255))
# 創建視頻捕獲物件
capture = cv2.VideoCapture(0)
# 加載人臉檢測器
detector = dlib.get_frontal_face_detector()
# 初始化追蹤器
tracker = dlib.correlation_tracker()
# 當前是否在追蹤人臉
tracking_face = False
while True:
# 捕獲視頻幀
ret, frame = capture.read()
# 繪制基本資訊
draw_text_info()
if tracking_face is False:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 嘗試檢測人臉以初始化跟蹤器
rects = detector(gray, 0)
# 通過判斷是否檢測到人臉來決定是否啟動追蹤
if len(rects) > 0:
# Start tracking:
tracker.start_track(frame, rects[0])
tracking_face = True
if tracking_face is True:
# 更新跟蹤器并列印測量跟蹤器的置信度
print(tracker.update(frame))
# 獲取被跟蹤物件的位置
pos = tracker.get_position()
# 繪制被跟蹤物件的位置
cv2.rectangle(frame, (int(pos.left()), int(pos.top())), (int(pos.right()), int(pos.bottom())), (0, 255, 0), 3)
# 捕獲鍵盤事件
key = 0xFF & cv2.waitKey(1)
# 按 1 初始化追蹤器
if key == ord("1"):
tracking_face = False
# 按 q 退出
if key == ord('q'):
break
# 顯示結果
cv2.imshow("Face tracking using dlib frontal face detector and correlation filters for tracking", frame)
# 釋放所有資源
capture.release()
cv2.destroyAllWindows()
3. 使用基于 dlib DCF 的跟蹤器進行物件跟蹤
除了人臉外,基于 dlib DCF 的跟蹤器可以用于跟蹤任意物件,接下來,我們使用滑鼠選擇要跟蹤的物件,并監聽鍵盤事件,如果按 1,將開始跟蹤預定義邊界框內的物件;如果按 2,預定義的邊界框將被清空,跟蹤演算法將停止,并等待用戶選擇另一個邊界框,
例如,我們對檢測小姐姐并不感興趣,而更喜歡貓,那么我們可以首先用滑鼠繪制矩形框選擇喵咪,然后按 1 開始追蹤小貓咪,如果我們想要追蹤其他物體,可以按 2 重新繪制矩形框并進行追蹤,如下所示,我們可以看到演算法跟蹤物件并進行實時輸出:

3.2 完整代碼
完整代碼如下所示:
import cv2
import dlib
def draw_text_info():
# 繪制文本的位置
menu_pos_1 = (10, 20)
menu_pos_2 = (10, 40)
menu_pos_3 = (10, 60)
# 選單項
info_1 = "Use left click of the mouse to select the object to track"
info_2 = "Use '1' to start tracking, '2' to reset tracking and 'q' to exit"
# 繪制選單資訊
cv2.putText(frame, "Use '1' to re-initialize tracking", menu_pos_1, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255))
cv2.putText(frame, info_2, menu_pos_2, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255))
if tracking_state:
cv2.putText(frame, "tracking", menu_pos_3, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0))
else:
cv2.putText(frame, "not tracking", menu_pos_3, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255))
# 用于保存要跟蹤的物件坐標的結構
points = []
def mouse_event_handler(event, x, y, flags, param):
# 對全域變數的參考
global points
# 添加要跟蹤的物件的左上角坐標
if event == cv2.EVENT_LBUTTONDOWN:
points = [(x, y)]
# 添加要跟蹤的物件的右下角坐標:
elif event == cv2.EVENT_LBUTTONUP:
points.append((x, y))
# 創建視頻捕獲物件
capture = cv2.VideoCapture(0)
# 視窗名
window_name = "Object tracking using dlib correlation filter algorithm"
# 創建視窗
cv2.namedWindow(window_name)
# 系結滑鼠事件
cv2.setMouseCallback(window_name, mouse_event_handler)
# 初始化跟蹤器
tracker = dlib.correlation_tracker()
tracking_state = False
while True:
# 捕獲視頻幀
ret, frame = capture.read()
# 繪制選單項
draw_text_info()
# 設定并繪制一個矩形,跟蹤矩形框內的物件
if len(points) == 2:
cv2.rectangle(frame, points[0], points[1], (0, 0, 255), 3)
dlib_rectangle = dlib.rectangle(points[0][0], points[0][1], points[1][0], points[1][1])
if tracking_face is True:
# 更新跟蹤器并列印測量跟蹤器的置信度
print(tracker.update(frame))
# 獲取被跟蹤物件的位置
pos = tracker.get_position()
# 繪制被跟蹤物件的位置
cv2.rectangle(frame, (int(pos.left()), int(pos.top())), (int(pos.right()), int(pos.bottom())), (0, 255, 0), 3)
# 捕獲鍵盤事件
key = 0xFF & cv2.waitKey(1)
# 按下 1 鍵,開始追蹤
if key == ord("1"):
if len(points) == 2:
# Start tracking:
tracker.start_track(frame, dlib_rectangle)
tracking_state = True
points = []
# 按下 2 鍵,停止跟蹤
if key == ord("2"):
points = []
tracking_state = False
# 按下 q 鍵,回傳
if key == ord('q'):
break
# 展示結果影像
cv2.imshow(window_name, frame)
# 釋放資源
capture.release()
cv2.destroyAllWindows()
小結
dlib 庫實作了基于 DCF 的跟蹤器,非常適合用于進行人臉追蹤,使用 dlib.correlation_tracker() 函式初始化跟蹤器,tracker.start_track() 函式用于開始追蹤物件,tracker.update() 函式更新追蹤器并且回傳追蹤器置信度,若要獲取被跟蹤物件的位置需要使用 tracker.get_position() 函式,
系列鏈接
OpenCV-Python實戰(1)——OpenCV簡介與影像處理基礎
OpenCV-Python實戰(2)——影像與視頻檔案的處理
OpenCV-Python實戰(3)——OpenCV中繪制圖形與文本
OpenCV-Python實戰(4)——OpenCV常見影像處理技術
OpenCV-Python實戰(5)——OpenCV影像運算
OpenCV-Python實戰(6)——OpenCV中的色彩空間和色彩映射
OpenCV-Python實戰(7)——直方圖詳解
OpenCV-Python實戰(8)——直方圖均衡化
OpenCV-Python實戰(9)——OpenCV用于影像分割的閾值技術
OpenCV-Python實戰(10)——OpenCV輪廓檢測
OpenCV-Python實戰(11)——OpenCV輪廓檢測相關應用
OpenCV-Python實戰(12)——一文詳解AR增強現實
OpenCV-Python實戰(13)——OpenCV與機器學習的碰撞
OpenCV-Python實戰(14)——人臉檢測詳解
OpenCV-Python實戰(15)——面部特征點檢測詳解
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/349612.html
標籤:其他
上一篇:自學軟體測驗,一段心路歷程,這個世界根本沒有速成的方法
下一篇:【資料結構】二叉樹的定義以及性質
