车流量统计(3)
多目標追蹤
實現一個多目標跟蹤器,管理多個卡爾曼濾波器對象,主要包括以下內容:
初始化:最大檢測數,目標未被檢測的最大幀數
目標跟蹤結果的更新,即跟蹤成功和失敗的目標的更新。
目標跟蹤結果的更新
該方法實現了SORT算法,輸入時當前幀中所有物體檢測框的幾何,包括score,輸出是當前幀標的跟蹤框集合,包括目標的跟蹤框的id要求即使檢測框為空,也必須對每一幀調用此方法,返回一個列類似的數組輸出數組,最后一列是目標對象的id,返回的目標對象數量可能與檢測框不同
yoloV3模型
改進:利用多尺度特征進行目標檢測,先驗框更豐富,調整了網絡結構,對象分類使用logistic代替了softmax,更適用于多標簽分類任務。
基于yoloV3的目標檢測
基于opencv的利用yolov3進行目標檢測,只是利用訓練好的模型進行目標檢測。
基于opencv的DNN模塊:
加載已訓練好的yolov3模型及其權重參數
將要處理的圖像轉換為輸入到模型的blobs
利用模型對目標進行檢測
遍歷檢測結果
應用非極大值抑制
繪制最終檢測結果,并存入到ndarray,供目標追蹤使用
利用模型對目標進行檢測
net.setInput(blob) start=time.time() layerOutputs=net.forward(ln)遍歷檢測結果,獲得檢測框
boxes=[] #用于存放識別物體的框的信息 confidences=[] #表示識別目標時某種物體的可信度 classIDs=[] #表示識別的目標歸屬哪一類 for output in layerOutputs:#遍歷某個輸出層中的每個目標for detection in output:scores=detection[5:] #當前目標屬于某一類別的概率classID=np.argmax(scores)#目標的類別confidence=scores[clssID] #得到目標屬于該類別的置信度#只保留置信度大于0.3的邊界框,若圖片質量較差,可以將置信度調低一些if confidence>0.3:#將邊界框的坐標還原至原圖片匹配,YOLO返回的是邊界框的中心坐標以及邊界框的寬度和高度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)最終檢測結果,繪制并存入ndarray,供目標追蹤使用
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目標跟蹤
dets=np.asarray(dets) #yolo檢測到的檢測框 tracker = Sort() memory = {} tracks=tracker.update(dets) #跟蹤框 boxes=[] #置信度 indexIDs=[] #前一幀跟蹤結果 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]未完。。。。
總結
- 上一篇: 前端学习(1658):前端系列实战课程之
- 下一篇: 前端学习(1715):前端系列javas