日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

车流量统计(3)

發布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 车流量统计(3) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

多目標追蹤

實現一個多目標跟蹤器,管理多個卡爾曼濾波器對象,主要包括以下內容:
初始化:最大檢測數,目標未被檢測的最大幀數
目標跟蹤結果的更新,即跟蹤成功和失敗的目標的更新。

def __init__(self,max_age=1,min_hit=3)#最大檢測數:目標未被檢測到的幀數,超過之后會被刪除self.max_age=max_age#目標命中的最小次數,小于該次數不返回self.min_hits=min_hits#卡爾曼跟蹤器self.trackers=[]#幀計數self.frame_count=0

目標跟蹤結果的更新
該方法實現了SORT算法,輸入時當前幀中所有物體檢測框的幾何,包括score,輸出是當前幀標的跟蹤框集合,包括目標的跟蹤框的id要求即使檢測框為空,也必須對每一幀調用此方法,返回一個列類似的數組輸出數組,最后一列是目標對象的id,返回的目標對象數量可能與檢測框不同

def update(self,dets):self.frame_count+=1#在當前幀逐個預測軌跡位置,記錄狀態異常的跟蹤器的索引#根據當前所有的卡爾曼跟蹤器(即上一幀中跟蹤器的目標個數)創建二維數組,行號為卡爾曼濾波器的標識索引,列向量為跟蹤框的位置和IDtrks=np.zeros(len(self.trackers,5))#存儲跟蹤器的預測to_del=[]#存儲要刪除的目標框ret=[]#存儲要返回的追蹤目標框#循環遍歷卡爾曼濾波跟蹤器列表for t,trk in enumerate(trks):#使用卡爾曼濾波跟蹤器t產生對應目標的跟蹤框pos=self.trackers[t].predict()[0]trk[:]=[pos[0],pos[1],pos[2],pos[3],0]if np.any(np.isnan(pos)):to_del.append(t)#trks中存儲了上一幀中跟蹤的目標并且在當前幀中的預測跟蹤框trks=np.ma.compress_rows(np.ma.masked_invalid(trks))#逆向刪除異常跟蹤器防止破壞索引for t in reversed(to_del):self.trackers.pop(t)matched, unmatched_dets, unmatched_trks = associate_detections_to_trackers(dets, trks)#將跟蹤成功的目標框更新到對應的卡爾曼濾波器中for t, trk in enumerate(self.trackers):if t not in unmatched_trks:d = matched[np.where(matched[:, 1] == t)[0], 0]trk.update(dets[d, :][0])# 為新增的目標創建新的卡爾曼濾波器對象進行跟蹤for i in unmatched_dets:trk = KalmanBoxTracker(dets[i, :])self.trackers.append(trk)# 自后向前遍歷,僅返回在當前幀出現且命中周期大于self.min_hits(除非跟蹤剛開始)的跟蹤結果;如果未命中時間大于self.max_age則刪除跟蹤器。i = len(self.trackers)for trk in reversed(self.trackers):# 返回當前邊界框的估計值d = trk.get_state()[0]# 跟蹤成功目標的box與id放入ret列表中if (trk.time_since_update < 1) and (trk.hit_streak >= self.min_hits or self.frame_count <= self.min_hits):ret.append(np.concatenate((d, [trk.id + 1])).reshape(1, -1))i -= 1if trk.time_since_update > self.max_age:self.trackers.pop(i)# 返回當前畫面中所有目標的box與id,以二維矩陣形式返回if len(ret) > 0:return np.concatenate(ret)return np.empty((0, 5))

yoloV3模型

改進:利用多尺度特征進行目標檢測,先驗框更豐富,調整了網絡結構,對象分類使用logistic代替了softmax,更適用于多標簽分類任務。

基于yoloV3的目標檢測

基于opencv的利用yolov3進行目標檢測,只是利用訓練好的模型進行目標檢測。
基于opencv的DNN模塊:
加載已訓練好的yolov3模型及其權重參數
將要處理的圖像轉換為輸入到模型的blobs
利用模型對目標進行檢測
遍歷檢測結果
應用非極大值抑制
繪制最終檢測結果,并存入到ndarray,供目標追蹤使用

#加載可以識別物體的名稱,將其存放在LABELS中,一共有80種,在這里我們使用car labelsPath='./yolo-coco/coco.names' LAEBLS=open(labelsPath).read().strip().split("\n")#設置隨機數種子,生成多種不同的顏色,當一個畫面中有多個目標時,使用不同顏色的框將其框起來 np.random.seed(42) COLORS=np.random.randint(0,255,size=(200,3),dtype='unit8') #加載已經訓練好的yolov3網絡的權重和相應的配置數據 weightsPath='./yolo-coco/yolov3.weights' configPath='./yolo-coco/yolov3.cfg' #加載好數據之后,開始利用上述數據恢復yolo神經網絡 net=cv2.dnn.readNetFromDarknet(configPath,weightsPath) ln=net.getLayerNames() #獲取輸出層在網絡中的索引位置,并以列表的形式:['yolo_82', 'yolo_94', 'yolo_106'] ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()] #讀取圖像 frame=cv2.imread('./car.jpg') #視頻的寬度和高度,即幀尺寸 (W,H)=(None,None) if W is None or H is None:(H,W)=frame.shape[:2] #根據輸入圖像構造blob,利用OPenCV進行深度網絡的計算時,一般將圖像轉換為blob形式,對圖片進行預處理 #包括縮放,減均值,通道交換等,還可以設置尺寸,一般設置為在進行網絡訓練時的圖像的大小。 blob=cv.dnn.blobFromImage(frame,1/255.0,(416,416),swapRB=True,crop=False)

利用模型對目標進行檢測

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]

未完。。。。

總結

以上是生活随笔為你收集整理的车流量统计(3)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。