如今,“圖像分類”、“目標(biāo)檢測(cè)”、“語(yǔ)義分割”、“實(shí)例分割”和“目標(biāo)追蹤”等5大領(lǐng)域是計(jì)算機(jī)視覺(jué)的熱門(mén)應(yīng)用。其中“圖像分類”與“目標(biāo)檢測(cè)”是最基礎(chǔ)的應(yīng)用,在此基礎(chǔ)上,派生出了“語(yǔ)義分割”、“實(shí)例分割”和“目標(biāo)跟蹤”等相對(duì)高級(jí)的應(yīng)用。
一、基于目標(biāo)檢測(cè)的追蹤概述
基于目標(biāo)檢測(cè)的目標(biāo)追蹤方法(Tracking By Detecting,簡(jiǎn)稱TBD)一般使用目標(biāo)檢測(cè)模型(如YOLO),在每個(gè)視頻幀上進(jìn)行目標(biāo)檢測(cè),然后將檢測(cè)出來(lái)的目標(biāo)進(jìn)行關(guān)聯(lián),找到每個(gè)目標(biāo)的運(yùn)行軌跡。如圖1所示,先使用目標(biāo)檢測(cè)模型檢測(cè)出7個(gè)目標(biāo),然后通過(guò)算法,將和進(jìn)行關(guān)聯(lián),從而追蹤到這兩個(gè)足球的運(yùn)行軌跡。
圖1基于目標(biāo)檢測(cè)的目標(biāo)追蹤方法
TBD方法完整的流程如圖2所示,該方法共有5個(gè)步驟,其中最關(guān)鍵的是“目標(biāo)檢測(cè)”和“目標(biāo)關(guān)聯(lián)”兩個(gè)步驟,“目標(biāo)檢測(cè)”需要一個(gè)訓(xùn)練好的目標(biāo)檢測(cè)模型,用來(lái)發(fā)現(xiàn)圖像中的各個(gè)目標(biāo),“目標(biāo)關(guān)聯(lián)”需要一個(gè)關(guān)聯(lián)算法,用來(lái)進(jìn)行目標(biāo)的配對(duì)。
(1)目標(biāo)檢測(cè),檢測(cè)出要追蹤目標(biāo)的位置坐標(biāo)、目標(biāo)分類等信息,初始化每個(gè)目標(biāo)的軌跡。
(2)目標(biāo)關(guān)聯(lián),使用算法,給當(dāng)前幀中的目標(biāo)和前一幀的目標(biāo)進(jìn)行配對(duì)。
(3)關(guān)聯(lián)成功,在上一幀中找到了當(dāng)前幀中檢測(cè)到的目標(biāo),配對(duì)成功,記錄目標(biāo)的軌跡。
(4)新出現(xiàn)目標(biāo),在上一幀中沒(méi)有找到當(dāng)前幀中檢測(cè)到的目標(biāo),初始化新目標(biāo)的軌跡。
(5)目標(biāo)消失,在當(dāng)前幀中沒(méi)有找到上一幀中檢測(cè)出來(lái)的目標(biāo),刪除該目標(biāo)的軌跡。
圖2 基于目標(biāo)檢測(cè)的目標(biāo)追蹤方法(TBD)流程圖
在基于目標(biāo)檢測(cè)的目標(biāo)追蹤方法中,為了實(shí)現(xiàn)目標(biāo)的關(guān)聯(lián),容易想到的方法是“通過(guò)目標(biāo)識(shí)別進(jìn)行目標(biāo)關(guān)聯(lián)”:對(duì)每一幀圖像進(jìn)行目標(biāo)檢測(cè),然后對(duì)每一個(gè)目標(biāo)提取特征,通過(guò)特征識(shí)別出每一個(gè)目標(biāo),從而實(shí)現(xiàn)目標(biāo)關(guān)聯(lián)。
但是,“通過(guò)目標(biāo)識(shí)別進(jìn)行目標(biāo)關(guān)聯(lián)”需要在每一幀圖像中,提取出每一個(gè)目標(biāo)的特征,這需要大量的計(jì)算資源,同時(shí)還需要穩(wěn)定的特征提取器,在實(shí)際場(chǎng)景中很難做到,因此,通常采用其他方法進(jìn)行目標(biāo)的關(guān)聯(lián),如常用的質(zhì)心法。
二、使用質(zhì)心法進(jìn)行目標(biāo)關(guān)聯(lián)
質(zhì)心法是一種基于目標(biāo)檢測(cè)的目標(biāo)追蹤方法,只在目標(biāo)首次出現(xiàn)的時(shí)候,對(duì)目標(biāo)進(jìn)行識(shí)別,在后續(xù)的視頻幀中,通過(guò)歐氏距離將檢測(cè)到的目標(biāo)進(jìn)行關(guān)聯(lián),如圖3所示。
(1)目標(biāo)檢測(cè),使用深度學(xué)習(xí)模型,對(duì)視頻幀進(jìn)行目標(biāo)檢測(cè)。
(2)計(jì)算質(zhì)心坐標(biāo),使用目標(biāo)預(yù)測(cè)框的中心點(diǎn)作為質(zhì)心坐標(biāo)。
(3)計(jì)算質(zhì)心距離,計(jì)算視頻的上一幀和當(dāng)前幀中目標(biāo)之間的歐式距離。
(4)目標(biāo)關(guān)聯(lián),距離相近的為同一目標(biāo),如A和C是同一目標(biāo),B是新出現(xiàn)目標(biāo)。
(5)目標(biāo)更新,更新已知目標(biāo)的坐標(biāo),生成新目標(biāo)ID,如果有目標(biāo)消失,則注銷(xiāo)消失目標(biāo)ID。
圖3 使用質(zhì)心法實(shí)現(xiàn)目標(biāo)關(guān)聯(lián)
三、質(zhì)心法使用示例
質(zhì)心法是目標(biāo)關(guān)聯(lián)算法,在進(jìn)行目標(biāo)追蹤時(shí),還需要配合目標(biāo)檢測(cè)模型使用,下面代碼使用YOLO模型進(jìn)行目標(biāo)檢測(cè)(已經(jīng)在coco數(shù)據(jù)集上訓(xùn)練好的YOLO模型),使用質(zhì)心法進(jìn)行目標(biāo)關(guān)聯(lián),實(shí)現(xiàn)目標(biāo)的追蹤。
在以下代碼中,詳細(xì)介紹了兩幀圖像中的目標(biāo)(足球)的追蹤過(guò)程,在本書(shū)配套的源代碼中,還演示了對(duì)視頻中的目標(biāo)進(jìn)行追蹤的方法。
(1)導(dǎo)入庫(kù)用到的庫(kù)(在配套代碼目錄下的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模型的檢測(cè)操作
5 from matplotlib import pyplot as plt
6 plt.rcParams['font.sans-serif']=['SimHei'] #在統(tǒng)計(jì)圖上顯示中文
(2)初始化YOLO模型(模型的初始化方法請(qǐng)查看yolo_detect.py文件中的Init_Yolo函數(shù))。
1 model,labels = Init_Yolo('./models/yolov3-tiny.cfg',
2 './models/yolov3-tiny.weights',
3'./models/coco.names')
(3)讀取兩幀圖像,并轉(zhuǎn)換為RGB格式,其中frame_1是上一幀圖像,frame_2是當(dāng)前幀圖像。
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)檢測(cè)兩幀圖像中的足球目標(biāo)(調(diào)用yolo_detect.py文件中的Detect函數(shù))。
1 #使用YOLO檢測(cè)兩幀圖像中的目標(biāo)
2 b1 = Detect(model,labels,frame_1)
3 b2 = Detect(model,labels,frame_2)
4 #只保留足球的檢測(cè)結(jié)果
5 filter=np.where(b1[:,-1]=='sports ball')
6 bbox1 = b1[filter]
7 filter=np.where(b2[:,-1]=='sports ball')
b2[filter] =
(5)計(jì)算質(zhì)心坐標(biāo),根據(jù)第4步檢測(cè)結(jié)果bbox1和bbox2,計(jì)算目標(biāo)的質(zhì)心(即綁定框的中心)。
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("第一幀目標(biāo)A",A,"第二幀目標(biāo)B",B,"第二幀目標(biāo)C",C)
使用第4和第5步代碼,在第一幀圖像中檢測(cè)到目標(biāo)A,在第二幀圖像中檢測(cè)到目標(biāo)B和C,并分別計(jì)算這3個(gè)目標(biāo)的質(zhì)心。如圖4所示,圖中白色邊框?yàn)闄z測(cè)到的目標(biāo)邊界框,中間的綠點(diǎn)為目標(biāo)的質(zhì)心(即邊界框的中心)。
圖4 檢測(cè)到的目標(biāo)與質(zhì)心
(6)計(jì)算第一幀中的目標(biāo)和后一幀中目標(biāo)的歐氏距離,根據(jù)最近距離,確定AB是同一目標(biāo)。
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是同一目標(biāo)")
(7)顯示追蹤的結(jié)果,將兩幀圖像合并到一起,用連線表示目標(biāo)的運(yùn)行軌跡,如圖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('目標(biāo)運(yùn)行軌跡')
9plt.imshow(all_img)
圖5目標(biāo)的運(yùn)行軌跡
-
模型
+關(guān)注
關(guān)注
1文章
3283瀏覽量
49001 -
圖像分類
+關(guān)注
關(guān)注
0文章
92瀏覽量
11944 -
目標(biāo)檢測(cè)
+關(guān)注
關(guān)注
0文章
210瀏覽量
15643
原文標(biāo)題:如何使用質(zhì)心法進(jìn)行目標(biāo)追蹤--文末送書(shū)
文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論