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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

车流量统计(3)

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

多目標(biāo)追蹤

實(shí)現(xiàn)一個(gè)多目標(biāo)跟蹤器,管理多個(gè)卡爾曼濾波器對(duì)象,主要包括以下內(nèi)容:
初始化:最大檢測(cè)數(shù),目標(biāo)未被檢測(cè)的最大幀數(shù)
目標(biāo)跟蹤結(jié)果的更新,即跟蹤成功和失敗的目標(biāo)的更新。

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

目標(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è)框不同

def update(self,dets):self.frame_count+=1#在當(dāng)前幀逐個(gè)預(yù)測(cè)軌跡位置,記錄狀態(tài)異常的跟蹤器的索引#根據(jù)當(dāng)前所有的卡爾曼跟蹤器(即上一幀中跟蹤器的目標(biāo)個(gè)數(shù))創(chuàng)建二維數(shù)組,行號(hào)為卡爾曼濾波器的標(biāo)識(shí)索引,列向量為跟蹤框的位置和IDtrks=np.zeros(len(self.trackers,5))#存儲(chǔ)跟蹤器的預(yù)測(cè)to_del=[]#存儲(chǔ)要?jiǎng)h除的目標(biāo)框ret=[]#存儲(chǔ)要返回的追蹤目標(biāo)框#循環(huán)遍歷卡爾曼濾波跟蹤器列表for t,trk in enumerate(trks):#使用卡爾曼濾波跟蹤器t產(chǎn)生對(duì)應(yīng)目標(biāo)的跟蹤框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中存儲(chǔ)了上一幀中跟蹤的目標(biāo)并且在當(dāng)前幀中的預(yù)測(cè)跟蹤框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)#將跟蹤成功的目標(biāo)框更新到對(duì)應(yīng)的卡爾曼濾波器中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])# 為新增的目標(biāo)創(chuàng)建新的卡爾曼濾波器對(duì)象進(jìn)行跟蹤for i in unmatched_dets:trk = KalmanBoxTracker(dets[i, :])self.trackers.append(trk)# 自后向前遍歷,僅返回在當(dāng)前幀出現(xiàn)且命中周期大于self.min_hits(除非跟蹤剛開始)的跟蹤結(jié)果;如果未命中時(shí)間大于self.max_age則刪除跟蹤器。i = len(self.trackers)for trk in reversed(self.trackers):# 返回當(dāng)前邊界框的估計(jì)值d = trk.get_state()[0]# 跟蹤成功目標(biāo)的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)# 返回當(dāng)前畫面中所有目標(biāo)的box與id,以二維矩陣形式返回if len(ret) > 0:return np.concatenate(ret)return np.empty((0, 5))

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)追蹤使用

#加載可以識(shí)別物體的名稱,將其存放在LABELS中,一共有80種,在這里我們使用car labelsPath='./yolo-coco/coco.names' LAEBLS=open(labelsPath).read().strip().split("\n")#設(shè)置隨機(jī)數(shù)種子,生成多種不同的顏色,當(dāng)一個(gè)畫面中有多個(gè)目標(biāo)時(shí),使用不同顏色的框?qū)⑵淇蚱饋?/span> np.random.seed(42) COLORS=np.random.randint(0,255,size=(200,3),dtype='unit8') #加載已經(jīng)訓(xùn)練好的yolov3網(wǎng)絡(luò)的權(quán)重和相應(yīng)的配置數(shù)據(jù) weightsPath='./yolo-coco/yolov3.weights' configPath='./yolo-coco/yolov3.cfg' #加載好數(shù)據(jù)之后,開始利用上述數(shù)據(jù)恢復(fù)yolo神經(jīng)網(wǎng)絡(luò) net=cv2.dnn.readNetFromDarknet(configPath,weightsPath) ln=net.getLayerNames() #獲取輸出層在網(wǎng)絡(luò)中的索引位置,并以列表的形式:['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] #根據(jù)輸入圖像構(gòu)造blob,利用OPenCV進(jìn)行深度網(wǎng)絡(luò)的計(jì)算時(shí),一般將圖像轉(zhuǎn)換為blob形式,對(duì)圖片進(jìn)行預(yù)處理 #包括縮放,減均值,通道交換等,還可以設(shè)置尺寸,一般設(shè)置為在進(jìn)行網(wǎng)絡(luò)訓(xùn)練時(shí)的圖像的大小。 blob=cv.dnn.blobFromImage(frame,1/255.0,(416,416),swapRB=True,crop=False)

利用模型對(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é)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。