Python+Opencv實(shí)戰(zhàn)之人臉追蹤詳解
前言
人臉處理是人工智能中的一個(gè)熱門話題,人臉處理可以使用計(jì)算機(jī)視覺算法從人臉中自動(dòng)提取大量信息,例如身份、意圖和情感;而目標(biāo)跟蹤試圖估計(jì)目標(biāo)在整個(gè)視頻序列中的軌跡,其中只有目標(biāo)的初始位置是已知的,將這兩者進(jìn)行結(jié)合將產(chǎn)生許多有趣的應(yīng)用。由于外觀變化、遮擋、快速運(yùn)動(dòng)、運(yùn)動(dòng)模糊和比例變化等多種因素,人臉追蹤非常具有挑戰(zhàn)性。
人臉追蹤技術(shù)簡(jiǎn)介
基于判別相關(guān)濾波器 (discriminative correlation filter, DCF) 的視覺跟蹤器具有優(yōu)異的性能和較高的計(jì)算效率,可用于實(shí)時(shí)應(yīng)用程序。DCF 跟蹤器是一種非常流行的基于邊界框跟蹤的方法。
在 dlib 庫(kù)中實(shí)現(xiàn)了基于 DCF 的跟蹤器,可以很方便的將其用于對(duì)象跟蹤。在本文中,我們將介紹如何使用此跟蹤器進(jìn)行人臉和用戶選擇對(duì)象的跟蹤,這種方法也稱為判別尺度空間跟蹤器 (Discriminative Scale Space Tracker, DSST),追蹤器僅需要輸入原始視頻和目標(biāo)初始位置的邊界框,然后跟蹤器自動(dòng)預(yù)測(cè)目標(biāo)的軌跡。
使用基于 dlib DCF 的跟蹤器進(jìn)行人臉跟蹤
在進(jìn)行人臉追蹤時(shí),我們首先使用 dlib 人臉檢測(cè)器進(jìn)行初始化,然后使用基于 dlib DCF 的跟蹤器 DSST 進(jìn)行人臉跟蹤。調(diào)用以下函數(shù)初始化相關(guān)跟蹤器:
tracker = dlib.correlation_tracker()
這將使用默認(rèn)值 (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() 可以開始跟蹤。在開始追蹤前,我們需要先執(zhí)行人臉檢測(cè),并將檢測(cè)到的人臉位置傳遞給這個(gè)方法:
if tracking_face is False:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 嘗試檢測(cè)人臉以初始化跟蹤器
rects = detector(gray, 0)
# 檢查是否檢測(cè)到人臉
if len(rects) > 0:
# 開始追蹤
tracker.start_track(frame, rects[0])
tracking_face = True
當(dāng)檢測(cè)到人臉后,人臉跟蹤器將開始跟蹤邊界框內(nèi)的內(nèi)容。為了更新被跟蹤對(duì)象的位置,需要調(diào)用 tracker.update() 方法:
tracker.update(frame)
tracker.update() 方法更新跟蹤器并返回衡量跟蹤器置信度的指標(biāo),此指標(biāo)可用于使用人臉檢測(cè)重新初始化跟蹤器。
要獲取被跟蹤對(duì)象的位置,需要調(diào)用 tracker.get_position() 方法:
pos = tracker.get_position()
tracker.get_position() 方法返回被跟蹤對(duì)象的位置。最后,繪制人臉的預(yù)測(cè)位置:
cv2.rectangle(frame, (int(pos.left()), int(pos.top())), (int(pos.right()), int(pos.bottom())), (0, 255, 0), 3)
下圖中,顯示了人臉跟蹤算法的跟蹤效果過程:

在上圖中,可以看到算法當(dāng)前正在跟蹤檢測(cè)到的人臉,同時(shí)還可以按數(shù)字 1 以重新初始化跟蹤。
完整代碼
完整代碼如下所示,同時(shí)我們需要提供按下數(shù)字 1 時(shí)重新初始化跟蹤器的選項(xiàng)。
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))
# 創(chuàng)建視頻捕獲對(duì)象
capture = cv2.VideoCapture(0)
# 加載人臉檢測(cè)器
detector = dlib.get_frontal_face_detector()
# 初始化追蹤器
tracker = dlib.correlation_tracker()
# 當(dāng)前是否在追蹤人臉
tracking_face = False
while True:
# 捕獲視頻幀
ret, frame = capture.read()
# 繪制基本信息
draw_text_info()
if tracking_face is False:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 嘗試檢測(cè)人臉以初始化跟蹤器
rects = detector(gray, 0)
# 通過判斷是否檢測(cè)到人臉來決定是否啟動(dòng)追蹤
if len(rects) > 0:
# Start tracking:
tracker.start_track(frame, rects[0])
tracking_face = True
if tracking_face is True:
# 更新跟蹤器并打印測(cè)量跟蹤器的置信度
print(tracker.update(frame))
# 獲取被跟蹤對(duì)象的位置
pos = tracker.get_position()
# 繪制被跟蹤對(duì)象的位置
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
# 顯示結(jié)果
cv2.imshow("Face tracking using dlib frontal face detector and correlation filters for tracking", frame)
# 釋放所有資源
capture.release()
cv2.destroyAllWindows()
使用基于 dlib DCF 的跟蹤器進(jìn)行對(duì)象跟蹤
除了人臉外,基于 dlib DCF 的跟蹤器可以用于跟蹤任意對(duì)象。接下來,我們使用鼠標(biāo)選擇要跟蹤的對(duì)象,并監(jiān)聽鍵盤事件,如果按 1,將開始跟蹤預(yù)定義邊界框內(nèi)的對(duì)象;如果按 2,預(yù)定義的邊界框?qū)⒈磺蹇?,跟蹤算法將停止,并等待用戶選擇另一個(gè)邊界框。
例如,我們對(duì)檢測(cè)小姐姐并不感興趣,而更喜歡貓,那么我們可以首先用鼠標(biāo)繪制矩形框選擇喵咪,然后按 1 開始追蹤小貓咪,如果我們想要追蹤其他物體,可以按 2 重新繪制矩形框并進(jìn)行追蹤。如下所示,我們可以看到算法跟蹤對(duì)象并進(jìn)行實(shí)時(shí)輸出:

完整代碼
完整代碼如下所示:
import cv2
import dlib
def draw_text_info():
# 繪制文本的位置
menu_pos_1 = (10, 20)
menu_pos_2 = (10, 40)
menu_pos_3 = (10, 60)
# 菜單項(xiàng)
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))
# 用于保存要跟蹤的對(duì)象坐標(biāo)的結(jié)構(gòu)
points = []
def mouse_event_handler(event, x, y, flags, param):
# 對(duì)全局變量的引用
global points
# 添加要跟蹤的對(duì)象的左上角坐標(biāo)
if event == cv2.EVENT_LBUTTONDOWN:
points = [(x, y)]
# 添加要跟蹤的對(duì)象的右下角坐標(biāo):
elif event == cv2.EVENT_LBUTTONUP:
points.append((x, y))
# 創(chuàng)建視頻捕獲對(duì)象
capture = cv2.VideoCapture(0)
# 窗口名
window_name = "Object tracking using dlib correlation filter algorithm"
# 創(chuàng)建窗口
cv2.namedWindow(window_name)
# 綁定鼠標(biāo)事件
cv2.setMouseCallback(window_name, mouse_event_handler)
# 初始化跟蹤器
tracker = dlib.correlation_tracker()
tracking_state = False
while True:
# 捕獲視頻幀
ret, frame = capture.read()
# 繪制菜單項(xiàng)
draw_text_info()
# 設(shè)置并繪制一個(gè)矩形,跟蹤矩形框內(nèi)的對(duì)象
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:
# 更新跟蹤器并打印測(cè)量跟蹤器的置信度
print(tracker.update(frame))
# 獲取被跟蹤對(duì)象的位置
pos = tracker.get_position()
# 繪制被跟蹤對(duì)象的位置
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
# 展示結(jié)果圖像
cv2.imshow(window_name, frame)
# 釋放資源
capture.release()
cv2.destroyAllWindows()
小結(jié)
dlib 庫(kù)實(shí)現(xiàn)了基于 DCF 的跟蹤器,非常適合用于進(jìn)行人臉追蹤,使用 dlib.correlation_tracker() 函數(shù)初始化跟蹤器,tracker.start_track() 函數(shù)用于開始追蹤對(duì)象,tracker.update() 函數(shù)更新追蹤器并且返回追蹤器置信度,若要獲取被跟蹤對(duì)象的位置需要使用 tracker.get_position() 函數(shù)。
?以上就是Python+Opencv實(shí)戰(zhàn)之人臉追蹤詳解的詳細(xì)內(nèi)容,更多關(guān)于Python Opencv 人臉追蹤的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在PyTorch中實(shí)現(xiàn)可解釋的神經(jīng)網(wǎng)絡(luò)模型的方法詳解
這篇文章主要為大家介紹在PyTorch如何中實(shí)現(xiàn)可解釋的神經(jīng)網(wǎng)絡(luò)模型,并為您提供使用簡(jiǎn)單的 PyTorch 接口實(shí)現(xiàn)最先進(jìn)的基于概念的模型的工具,需要的朋友可以參考下2023-06-06
PyCharm:method may be static問題及解決
這篇文章主要介紹了PyCharm:method may be static問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Python面向?qū)ο蟪绦蛟O(shè)計(jì)之私有屬性及私有方法示例
這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O(shè)計(jì)之私有屬性及私有方法,結(jié)合實(shí)例形式分析了Python私有屬性及私有方法的相關(guān)使用方法及操作注意事項(xiàng),需要的朋友可以參考下2019-04-04
langchain使用自定義example?selector示例解析
這篇文章主要為大家介紹了langchain使用自定義example?selector示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
使用Python自動(dòng)化自定義字體混淆信息的方法實(shí)例
今天小編就為大家分享一篇關(guān)于使用Python自動(dòng)化自定義字體混淆信息的方法實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02
Python3.9 beta2版本發(fā)布了,看看這7個(gè)新的PEP都是什么
這篇文章主要介紹了Python3.9 beta2版本發(fā)布了,看看這7個(gè)新的PEP都是什么,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2020-06-06
python自動(dòng)提取文本中的時(shí)間(包含中文日期)
這篇文章主要介紹了python自動(dòng)提取文本中的時(shí)間(包含中文日期),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

