如今,“圖像分類”、“目標檢測”、“語義分割”、“實例分割”和“目標追蹤”等5大領域是計算機視覺的熱門應用。其中“圖像分類”與“目標檢測”是最基礎的應用,在此基礎上,派生出了“語義分割”、“實例分割”和“目標跟蹤”等相對高級的應用。
一、基于目標檢測的追蹤概述
基于目標檢測的目標追蹤方法(Tracking By Detecting,簡稱TBD)一般使用目標檢測模型(如YOLO),在每個視頻幀上進行目標檢測,然后將檢測出來的目標進行關聯,找到每個目標的運行軌跡。如圖1所示,先使用目標檢測模型檢測出7個目標,然后通過算法,將和進行關聯,從而追蹤到這兩個足球的運行軌跡。
圖1基于目標檢測的目標追蹤方法
TBD方法完整的流程如圖2所示,該方法共有5個步驟,其中最關鍵的是“目標檢測”和“目標關聯”兩個步驟,“目標檢測”需要一個訓練好的目標檢測模型,用來發現圖像中的各個目標,“目標關聯”需要一個關聯算法,用來進行目標的配對。
(1)目標檢測,檢測出要追蹤目標的位置坐標、目標分類等信息,初始化每個目標的軌跡。
(2)目標關聯,使用算法,給當前幀中的目標和前一幀的目標進行配對。
(3)關聯成功,在上一幀中找到了當前幀中檢測到的目標,配對成功,記錄目標的軌跡。
(4)新出現目標,在上一幀中沒有找到當前幀中檢測到的目標,初始化新目標的軌跡。
(5)目標消失,在當前幀中沒有找到上一幀中檢測出來的目標,刪除該目標的軌跡。
圖2 基于目標檢測的目標追蹤方法(TBD)流程圖
在基于目標檢測的目標追蹤方法中,為了實現目標的關聯,容易想到的方法是“通過目標識別進行目標關聯”:對每一幀圖像進行目標檢測,然后對每一個目標提取特征,通過特征識別出每一個目標,從而實現目標關聯。
但是,“通過目標識別進行目標關聯”需要在每一幀圖像中,提取出每一個目標的特征,這需要大量的計算資源,同時還需要穩定的特征提取器,在實際場景中很難做到,因此,通常采用其他方法進行目標的關聯,如常用的質心法。
二、使用質心法進行目標關聯
質心法是一種基于目標檢測的目標追蹤方法,只在目標首次出現的時候,對目標進行識別,在后續的視頻幀中,通過歐氏距離將檢測到的目標進行關聯,如圖3所示。
(1)目標檢測,使用深度學習模型,對視頻幀進行目標檢測。
(2)計算質心坐標,使用目標預測框的中心點作為質心坐標。
(3)計算質心距離,計算視頻的上一幀和當前幀中目標之間的歐式距離。
(4)目標關聯,距離相近的為同一目標,如A和C是同一目標,B是新出現目標。
(5)目標更新,更新已知目標的坐標,生成新目標ID,如果有目標消失,則注銷消失目標ID。
圖3 使用質心法實現目標關聯
三、質心法使用示例
質心法是目標關聯算法,在進行目標追蹤時,還需要配合目標檢測模型使用,下面代碼使用YOLO模型進行目標檢測(已經在coco數據集上訓練好的YOLO模型),使用質心法進行目標關聯,實現目標的追蹤。
在以下代碼中,詳細介紹了兩幀圖像中的目標(足球)的追蹤過程,在本書配套的源代碼中,還演示了對視頻中的目標進行追蹤的方法。
(1)導入庫用到的庫(在配套代碼目錄下的yolo_detect.py文件里,封裝了YOLO模型的使用)
1 import cv2,math
2 import numpy as np
3 import IPython.display as display
4 from yolo_detect import Init_Yolo,Detect,Draw #封裝YOLO模型的檢測操作
5 from matplotlib import pyplot as plt
6 plt.rcParams['font.sans-serif']=['SimHei'] #在統計圖上顯示中文
(2)初始化YOLO模型(模型的初始化方法請查看yolo_detect.py文件中的Init_Yolo函數)。
1 model,labels = Init_Yolo('./models/yolov3-tiny.cfg',
2 './models/yolov3-tiny.weights',
3'./models/coco.names')
(3)讀取兩幀圖像,并轉換為RGB格式,其中frame_1是上一幀圖像,frame_2是當前幀圖像。
1 frame_1 = cv2.imread('./images/ball_1.png')
2 frame_1 = cv2.cvtColor(frame_1, cv2.COLOR_BGR2RGB)
3 frame_2 = cv2.imread('./images/ball_2.png')
cv2.cvtColor(frame_2,cv2.COLOR_BGR2RGB) =
(4)檢測兩幀圖像中的足球目標(調用yolo_detect.py文件中的Detect函數)。
1 #使用YOLO檢測兩幀圖像中的目標
2 b1 = Detect(model,labels,frame_1)
3 b2 = Detect(model,labels,frame_2)
4 #只保留足球的檢測結果
5 filter=np.where(b1[:,-1]=='sports ball')
6 bbox1 = b1[filter]
7 filter=np.where(b2[:,-1]=='sports ball')
b2[filter] =
(5)計算質心坐標,根據第4步檢測結果bbox1和bbox2,計算目標的質心(即綁定框的中心)。
1 A = (int(bbox1[0][0])+int(bbox1[0][2])/2,int(bbox1[0][1])+int(bbox1[0][3])/2)
2 B = (int(bbox2[0][0])+int(bbox2[0][2])/2,int(bbox2[0][1])+int(bbox2[0][3])/2)
3 C = (int(bbox2[1][0])+int(bbox2[1][2])/2,int(bbox2[1][1])+int(bbox2[1][3])/2)
4print("第一幀目標A",A,"第二幀目標B",B,"第二幀目標C",C)
使用第4和第5步代碼,在第一幀圖像中檢測到目標A,在第二幀圖像中檢測到目標B和C,并分別計算這3個目標的質心。如圖4所示,圖中白色邊框為檢測到的目標邊界框,中間的綠點為目標的質心(即邊界框的中心)。
圖4 檢測到的目標與質心
(6)計算第一幀中的目標和后一幀中目標的歐氏距離,根據最近距離,確定AB是同一目標。
1 AB = math.sqrt(math.pow((A[0]-B[0]),2)+math.pow((A[1]-B[1]),2))
2 AC = math.sqrt(math.pow((A[0]-C[0]),2)+math.pow((A[1]-C[1]),2))
3print("AB距離",AB,"AC距離",AC,"AB是同一目標")
(7)顯示追蹤的結果,將兩幀圖像合并到一起,用連線表示目標的運行軌跡,如圖5所示。
1 mask1 = Draw(frame_1,bbox1)
2 mask2 = Draw(frame_2,bbox2)
3 all_img = np.hstack((mask1, mask2))
4
5 H,W = mask1.shape[:2]
6 cv2.line(all_img,(int(A[0]),int(A[1])),(W+int(C[0]),int(C[1])),(0,255,255),2)
7
8 plt.title('目標運行軌跡')
9plt.imshow(all_img)
圖5目標的運行軌跡
-
模型
+關注
關注
1文章
3178瀏覽量
48729 -
圖像分類
+關注
關注
0文章
90瀏覽量
11907 -
目標檢測
+關注
關注
0文章
205瀏覽量
15590
原文標題:如何使用質心法進行目標追蹤--文末送書
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論