Python+Opencv實戰之人臉追蹤詳解
前言
人臉處理是人工智能中的一個熱門話題,人臉處理可以使用計算機視覺算法從人臉中自動提取大量信息,例如身份、意圖和情感;而目標跟蹤試圖估計目標在整個視頻序列中的軌跡,其中隻有目標的初始位置是已知的,將這兩者進行結合將產生許多有趣的應用。由於外觀變化、遮擋、快速運動、運動模糊和比例變化等多種因素,人臉追蹤非常具有挑戰性。
人臉追蹤技術簡介
基於判別相關濾波器 (discriminative correlation filter, DCF
) 的視覺跟蹤器具有優異的性能和較高的計算效率,可用於實時應用程序。DCF
跟蹤器是一種非常流行的基於邊界框跟蹤的方法。
在 dlib
庫中實現瞭基於 DCF
的跟蹤器,可以很方便的將其用於對象跟蹤。在本文中,我們將介紹如何使用此跟蹤器進行人臉和用戶選擇對象的跟蹤,這種方法也稱為判別尺度空間跟蹤器 (Discriminative Scale Space Tracker, DSST
),追蹤器僅需要輸入原始視頻和目標初始位置的邊界框,然後跟蹤器自動預測目標的軌跡。
使用基於 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 以重新初始化跟蹤。
完整代碼
完整代碼如下所示,同時我們需要提供按下數字 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()
使用基於 dlib DCF 的跟蹤器進行對象跟蹤
除瞭人臉外,基於 dlib DCF
的跟蹤器可以用於跟蹤任意對象。接下來,我們使用鼠標選擇要跟蹤的對象,並監聽鍵盤事件,如果按 1,將開始跟蹤預定義邊界框內的對象;如果按 2,預定義的邊界框將被清空,跟蹤算法將停止,並等待用戶選擇另一個邊界框。
例如,我們對檢測小姐姐並不感興趣,而更喜歡貓,那麼我們可以首先用鼠標繪制矩形框選擇喵咪,然後按 1 開始追蹤小貓咪,如果我們想要追蹤其他物體,可以按 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()
函數。
以上就是Python+Opencv實戰之人臉追蹤詳解的詳細內容,更多關於Python Opencv 人臉追蹤的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 基於Python OpenCV和 dlib實現眨眼檢測
- 超詳細註釋之OpenCV dlib實現人臉采集
- opencv+mediapipe實現人臉檢測及攝像頭實時示例
- 基於OpenCV目標跟蹤實現人員計數器
- python利用opencv實現顏色檢測