车流量统计(3)
多目標(biāo)追蹤
實(shí)現(xiàn)一個(gè)多目標(biāo)跟蹤器,管理多個(gè)卡爾曼濾波器對(duì)象,主要包括以下內(nèi)容:
初始化:最大檢測(cè)數(shù),目標(biāo)未被檢測(cè)的最大幀數(shù)
目標(biāo)跟蹤結(jié)果的更新,即跟蹤成功和失敗的目標(biāo)的更新。
目標(biāo)跟蹤結(jié)果的更新
該方法實(shí)現(xiàn)了SORT算法,輸入時(shí)當(dāng)前幀中所有物體檢測(cè)框的幾何,包括score,輸出是當(dāng)前幀標(biāo)的跟蹤框集合,包括目標(biāo)的跟蹤框的id要求即使檢測(cè)框?yàn)榭?#xff0c;也必須對(duì)每一幀調(diào)用此方法,返回一個(gè)列類似的數(shù)組輸出數(shù)組,最后一列是目標(biāo)對(duì)象的id,返回的目標(biāo)對(duì)象數(shù)量可能與檢測(cè)框不同
yoloV3模型
改進(jìn):利用多尺度特征進(jìn)行目標(biāo)檢測(cè),先驗(yàn)框更豐富,調(diào)整了網(wǎng)絡(luò)結(jié)構(gòu),對(duì)象分類使用logistic代替了softmax,更適用于多標(biāo)簽分類任務(wù)。
基于yoloV3的目標(biāo)檢測(cè)
基于opencv的利用yolov3進(jìn)行目標(biāo)檢測(cè),只是利用訓(xùn)練好的模型進(jìn)行目標(biāo)檢測(cè)。
基于opencv的DNN模塊:
加載已訓(xùn)練好的yolov3模型及其權(quán)重參數(shù)
將要處理的圖像轉(zhuǎn)換為輸入到模型的blobs
利用模型對(duì)目標(biāo)進(jìn)行檢測(cè)
遍歷檢測(cè)結(jié)果
應(yīng)用非極大值抑制
繪制最終檢測(cè)結(jié)果,并存入到ndarray,供目標(biāo)追蹤使用
利用模型對(duì)目標(biāo)進(jìn)行檢測(cè)
net.setInput(blob) start=time.time() layerOutputs=net.forward(ln)遍歷檢測(cè)結(jié)果,獲得檢測(cè)框
boxes=[] #用于存放識(shí)別物體的框的信息 confidences=[] #表示識(shí)別目標(biāo)時(shí)某種物體的可信度 classIDs=[] #表示識(shí)別的目標(biāo)歸屬哪一類 for output in layerOutputs:#遍歷某個(gè)輸出層中的每個(gè)目標(biāo)for detection in output:scores=detection[5:] #當(dāng)前目標(biāo)屬于某一類別的概率classID=np.argmax(scores)#目標(biāo)的類別confidence=scores[clssID] #得到目標(biāo)屬于該類別的置信度#只保留置信度大于0.3的邊界框,若圖片質(zhì)量較差,可以將置信度調(diào)低一些if confidence>0.3:#將邊界框的坐標(biāo)還原至原圖片匹配,YOLO返回的是邊界框的中心坐標(biāo)以及邊界框的寬度和高度box=detection[0:4]*np.array([W,H,W,H])(centerX,centerY,width,height)=box.astype('int')x = int(centerX - (width / 2))y = int(centerY - (height / 2))boxes.append([x, y, int(width), int(height)])confidences.append(float(confidence))classIDs.append(classID)非極大值抑制
idx=cv2.dnn.NMSBoxes(boxes,confidence,0.5,0.3)最終檢測(cè)結(jié)果,繪制并存入ndarray,供目標(biāo)追蹤使用
dets=[] if len(idx)>0:for i in idx.flatten():if LABELS[classIDs[i]] == "car":(x, y) = (boxes[i][0], boxes[i][1]) (w, h) = (boxes[i][2], boxes[i][3]) cv2.rectangle(frame, (x, y), (x+w, y+h), (0,255,0), 2) dets.append([x, y, x + w, y + h, confidences[i]]) np.set_printoptions(formatter={'float': lambda x: "{0:0.3f}".format(x)}) dets = np.asarray(dets) plt.imshow(frame[:,:,::-1])SORT目標(biāo)跟蹤
dets=np.asarray(dets) #yolo檢測(cè)到的檢測(cè)框 tracker = Sort() memory = {} tracks=tracker.update(dets) #跟蹤框 boxes=[] #置信度 indexIDs=[] #前一幀跟蹤結(jié)果 previous=memory.copy() for track in tracks:boxes.append([track[0],track[1],track[2],track[3]])indexIDs.append(int(tracks[4]))memory[indexIDs[-1]]=boxes[-1]未完。。。。
總結(jié)
- 上一篇: 前端学习(1658):前端系列实战课程之
- 下一篇: “睡服”面试官系列第十八篇之genera