基本設(shè)計(jì)思路
基于YOLOv8對象檢測/實(shí)例分割模型,實(shí)現(xiàn)一個(gè)基于檢測的對象跟蹤算法,YOLOv8支持兩種主流的對象跟蹤算法ByteTrack與Botsort。通過自定義數(shù)據(jù)訓(xùn)練YOLOv8對象檢測器可以實(shí)現(xiàn)不同類別的對象的跟蹤。同時(shí)基于檢測與跟蹤模型的輸出,實(shí)現(xiàn)了對象計(jì)數(shù)、指定類別跟蹤、區(qū)域流量統(tǒng)計(jì)、指定ID跟蹤、單對象與多對象跟蹤等操作。
應(yīng)用開發(fā)層面,需要三個(gè)主要的交互與顯示界面,一個(gè)是針對YOLOv8檢測與跟蹤模型的模型參數(shù)設(shè)置;第二個(gè)是針對YOLOv8檢測與跟蹤結(jié)果的顯示過濾與輸出過濾的后處理;第三個(gè)是針對后處理數(shù)據(jù)的顯示包括流量出入、是否需要語音報(bào)警等應(yīng)用層面的數(shù)據(jù)展示。
整個(gè)程序開發(fā)實(shí)現(xiàn)了跟蹤線程與界面線程分別獨(dú)立工作,支持?jǐn)?shù)據(jù)交互,實(shí)時(shí)顯示運(yùn)行結(jié)果與流量統(tǒng)計(jì)信息展示。最終完成的界面設(shè)計(jì)如下:

運(yùn)行截圖
實(shí)時(shí)車輛流量統(tǒng)計(jì)

基于對象ID的單對象跟蹤:

人流量出入統(tǒng)計(jì)

代碼
啟動(dòng)跟蹤開始交通流量統(tǒng)計(jì)線程的代碼如下:
defon_yolov8_track(self):
image_file=self.image_file_edit.text()
label_file=self.label_file_path.text()
model_file=self.weight_file_path.text()
iflen(image_file)==0orlen(label_file)==0orlen(model_file)==0:
QtWidgets.QMessageBox.warning(self,"警告","參數(shù)文件未選擇...")
return
self.traffic_delta_label.setText("流量凈值:0")
self.traffic_jam_label.setText("總流量:0")
self.input_traffic_label.setText("進(jìn)流量:0")
self.output_traffic_label.setText("出流量:0")
settings=DLInferSettings()
settings.weight_file_path=self.weight_file_path.text()
settings.label_map_file_path=self.label_file_path.text()
settings.score_threshold=self.conf_spinbox.value()
settings.input_image=image_file
settings.track_vehicle=self.vehicle_chkbox.isChecked()
settings.track_person=self.person_chkbox.isChecked()
settings.track_by_category_index=self.category_combox.currentIndex()
settings.track_id=self.track_by_id_spin_box.value()
settings.target_deploy=1
ifself.hline_rbtn.isChecked():
settings.track_line_type=0
ifself.vline_rbtn.isChecked():
settings.track_line_type=1
ifself.diagonal_rbtn.isChecked():
settings.track_line_type=2
self.work_thread=InferenceThread(settings)
self.work_thread.fire_stats_signal.connect(self.on_update_result_image)
self.work_thread.finished.connect(self.work_thread.deleteLater)
self.work_thread.start()
self.startBtn.setStyleSheet("background-color:gray;color:white")
self.startBtn.setEnabled(False)
self.stopBtn.setStyleSheet("background-color:cyan;color:black")
self.stopBtn.setEnabled(True)
使用槽函數(shù)更新界面,實(shí)現(xiàn)實(shí)時(shí)分析結(jié)果顯示的代碼如下:
defon_update_result_image(self,outs):
image=outs.get("result")
done=outs.get("done")
num_in=outs.get("num_in")
num_out=outs.get("num_out")
ifimageisnotNone:
dst=cv.cvtColor(image,cv.COLOR_BGR2RGB)
height,width,channel=dst.shape
bytesPerLine=3*width
img=QtGui.QImage(dst.data,width,height,bytesPerLine,QtGui.QImage.Format_RGB888)
pixmap=QtGui.QPixmap(img)
pix=pixmap.scaled(QtCore.QSize(1280,720),QtCore.Qt.KeepAspectRatio)
self.label.setPixmap(pix)
self.show_text("OpenCV開發(fā)者聯(lián)盟-跟蹤演示")
self.traffic_delta_label.setText("流量凈值:%d"%(num_in-num_out))
self.traffic_jam_label.setText("總流量:%d"%(num_in+num_out))
self.input_traffic_label.setText("進(jìn)流量:%d"%num_in)
self.output_traffic_label.setText("出流量:%d"%num_out)
ifdoneisnotNone:
self.stopBtn.setStyleSheet("background-color:gray;color:white")
self.stopBtn.setEnabled(False)
self.startBtn.setStyleSheet("background-color:cyan;color:black")
self.startBtn.setEnabled(True)
審核編輯:劉清
-
檢測器
+關(guān)注
關(guān)注
1文章
913瀏覽量
49507 -
過濾器
+關(guān)注
關(guān)注
1文章
441瀏覽量
20760
原文標(biāo)題:PyQT5案例開發(fā)
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
在全志H616核桃派開發(fā)板上進(jìn)行PyQt5的代碼編寫和運(yùn)行
在全志H616核桃派開發(fā)板上部署PyQt5的信號與槽詳解
使用PyQt5自動(dòng)初始化OpenVINO?環(huán)境出現(xiàn)報(bào)錯(cuò)怎么解決?
【Firefly RK3399試用體驗(yàn)】第二篇:PyQt5大戰(zhàn)點(diǎn)燈
利用PyQt5編輯軟件界面的簡單步驟
如何使用Python配合PyQT5模塊來開發(fā)圖形化應(yīng)用程序
魯班貓0 ubuntu20 解決python3.10安裝pyqt5
Python PyQt5工具在Windows平臺上的安裝方法
PyQt5的中文教程電子書免費(fèi)下載
PyQT5+OpenCV開發(fā)的應(yīng)用如何打包發(fā)布?
2023年P(guān)ython GUI桌面應(yīng)用開發(fā)該選哪個(gè)庫
請問PyQT5是如何構(gòu)建YOLOv8界面應(yīng)用程序的
使用pycharm開發(fā)上位機(jī)配置pyqt5的環(huán)境
PYQT5自動(dòng)化上位機(jī)開發(fā)記錄
基于PyQT5與ONNXRUNTIME實(shí)現(xiàn)風(fēng)格遷移應(yīng)用

PyQT5案例開發(fā)
評論