基本设计思路
基于YOLOv8对象检测/实例分割模型,实现一个基于检测的对象跟踪算法,YOLOv8支持两种主流的对象跟踪算法ByteTrack与Botsort。通过自定义数据训练YOLOv8对象检测器可以实现不同类别的对象的跟踪。同时基于检测与跟踪模型的输出,实现了对象计数、指定类别跟踪、区域流量统计、指定ID跟踪、单对象与多对象跟踪等操作。
应用开发层面,需要三个主要的交互与显示界面,一个是针对YOLOv8检测与跟踪模型的模型参数设置;第二个是针对YOLOv8检测与跟踪结果的显示过滤与输出过滤的后处理;第三个是针对后处理数据的显示包括流量出入、是否需要语音报警等应用层面的数据展示。
整个程序开发实现了跟踪线程与界面线程分别独立工作,支持数据交互,实时显示运行结果与流量统计信息展示。最终完成的界面设计如下:

运行截图
实时车辆流量统计

基于对象ID的单对象跟踪:

人流量出入统计

代码
启动跟踪开始交通流量统计线程的代码如下:
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,"警告","参数文件未选择...")
return
self.traffic_delta_label.setText("流量净值:0")
self.traffic_jam_label.setText("总流量:0")
self.input_traffic_label.setText("进流量: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)
使用槽函数更新界面,实现实时分析结果显示的代码如下:
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开发者联盟-跟踪演示")
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("进流量:%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)
审核编辑:刘清
-
检测器
+关注
关注
1文章
924浏览量
49650 -
过滤器
+关注
关注
1文章
442浏览量
20833
原文标题:PyQT5案例开发
文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
在全志H616核桃派开发板上进行PyQt5的代码编写和运行
在全志H616核桃派开发板上部署PyQt5的信号与槽详解
使用PyQt5自动初始化OpenVINO™环境出现报错怎么解决?
【Firefly RK3399试用体验】第二篇:PyQt5大战点灯
利用PyQt5编辑软件界面的简单步骤
如何使用Python配合PyQT5模块来开发图形化应用程序
鲁班猫0 ubuntu20 解决python3.10安装pyqt5
Python PyQt5工具在Windows平台上的安装方法
PyQt5的中文教程电子书免费下载
PyQT5+OpenCV开发的应用如何打包发布?
2023年Python GUI桌面应用开发该选哪个库
请问PyQT5是如何构建YOLOv8界面应用程序的
使用pycharm开发上位机配置pyqt5的环境
PYQT5自动化上位机开发记录
基于PyQT5与ONNXRUNTIME实现风格迁移应用

PyQT5案例开发
评论