基于深度学习的道路车辆智能追踪与监控系统,采用最新的YOLOv11目标检测算法,结合ByteTrack多目标追踪技术、PaddleOCR车牌识别和区域入侵检测等先进功能,为智能交通管理提供全方位的解决
深度学习目标检测-YOLOv8 v10 v11 道路车辆(车牌检测)智能追踪系统系统概述这是一套基于深度学习的道路车辆智能追踪与监控系统采用最新的YOLOv11目标检测算法结合ByteTrack多目标追踪技术、PaddleOCR车牌识别和区域入侵检测等先进功能为智能交通管理提供全方位的解决方案。FPS可达60(和配置有关) 可满足实时监测需求可链接摄像头进行监测交付内容完整的源代码训练好的YOLOv11模型文件PaddleOCR识别模型示例数据集详细的使用文档YOLOv11 道路车辆车牌检测智能追踪系统 完整构建方案一、系统功能说明本系统基于YOLOv11PySide6开发集成了以下核心功能车辆目标检测与多目标追踪ByteTrack车牌识别PaddleOCR车速计算基于相机高度与俯仰角区域入侵检测数据记录与CSV/JSON导出、HTML报告生成实时视频流摄像头/本地视频监测二、环境依赖安装pipinstallultralytics pyside6 paddlepaddle paddleocr opencv-python numpy pandas matplotlib三、核心代码实现1. 主程序入口main.pyimportsysfromPySide6.QtWidgetsimportQApplicationfromPySide6.QtGuiimportQFont,QFontDatabasefrommain_windowimportMainWindowif__name____main__:appQApplication(sys.argv)app.setStyle(Fusion)# 加载中文字体try_fonts[Microsoft YaHei,微软雅黑,Source Han Sans SC,Noto Sans CJK SC]available_familiesQFontDatabase.families()forfnameintry_fonts:iffnameinavailable_families:app.setFont(QFont(fname,10))breakwMainWindow()w.show()sys.exit(app.exec())2. 主界面与核心逻辑main_window.pyimportsysimportcv2importnumpyasnpimportpandasaspdfromdatetimeimportdatetimefromPySide6.QtWidgetsimport(QMainWindow,QWidget,QVBoxLayout,QHBoxLayout,QPushButton,QLabel,QSlider,QLineEdit,QCheckBox,QTabWidget,QTextEdit,QFileDialog,QMessageBox)fromPySide6.QtCoreimportQt,QThread,Signal,QTimerfromPySide6.QtGuiimportQImage,QPixmapfromultralyticsimportYOLOfrompaddleocrimportPaddleOCR# 全局配置CONFIG{model_path:best.pt,camera_height:3.0,camera_angle:15.0,imgsz:640,conf_thres:0.4,max_det:40,classes:[0,1,2,3,4]# bicycle, bus, car, motorbike, person}classDetectionThread(QThread):frame_signalSignal(np.ndarray)log_signalSignal(str)data_signalSignal(dict)def__init__(self,source0):super().__init__()self.sourcesource self.runningFalseself.recordingFalseself.trackerNoneself.ocrPaddleOCR(use_angle_clsTrue,langch,show_logFalse)self.modelYOLO(CONFIG[model_path])self.track_history{}self.record_data[]defrun(self):self.runningTruecapcv2.VideoCapture(self.source)whileself.runningandcap.isOpened():ret,framecap.read()ifnotret:break# YOLOv11 检测 ByteTrack 追踪resultsself.model.track(frame,persistTrue,imgszCONFIG[imgsz],confCONFIG[conf_thres],max_detCONFIG[max_det],classesCONFIG[classes])annotated_frameresults[0].plot()# 车牌识别ifresults[0].boxes.idisnotNone:boxesresults[0].boxes.xyxy.cpu().numpy()idsresults[0].boxes.id.cpu().numpy()forbox,track_idinzip(boxes,ids):x1,y1,x2,y2map(int,box)# 裁剪车牌区域简化示例可优化plate_roiframe[y1:y2,x1:x2]ifplate_roi.size0:ocr_resultself.ocr.ocr(plate_roi,clsTrue)ifocr_resultandocr_result[0]:plate_numocr_result[0][0][1][0]self.log_signal.emit(f识别车牌:{plate_num})cv2.putText(annotated_frame,plate_num,(x1,y1-10),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,255,0),2)# 车速计算简化示例current_timedatetime.now()ifresults[0].boxes.idisnotNone:forbox,track_idinzip(results[0].boxes.xywh.cpu().numpy(),results[0].boxes.id.cpu().numpy()):cx,cyint(box[0]),int(box[1])iftrack_idnotinself.track_history:self.track_history[track_id][]self.track_history[track_id].append((cx,cy,current_time))iflen(self.track_history[track_id])10:self.track_history[track_id].pop(0)# 基于像素位移计算速度需结合相机参数校准ptsself.track_history[track_id]dxpts[-1][0]-pts[0][0]dt(pts[-1][2]-pts[0][2]).total_seconds()ifdt0:speedabs(dx)*0.05/dt# 简化换算实际需根据相机参数校准cv2.putText(annotated_frame,f{speed:.1f}km/h,(cx,cy),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,255),2)# 发送帧self.frame_signal.emit(annotated_frame)# 记录数据ifself.recording:self.record_data.append({time:current_time,objects:len(results[0].boxes)})cap.release()defstop(self):self.runningFalseself.wait()defstart_recording(self):self.recordingTrueself.record_data[]defstop_recording(self):self.recordingFalsereturnself.record_dataclassMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(YOLOv11 道路车辆智能追踪系统)self.setGeometry(100,100,1200,800)self.detection_threadNoneself.record_data[]self.init_ui()definit_ui(self):central_widgetQWidget()self.setCentralWidget(central_widget)main_layoutQHBoxLayout(central_widget)# 左侧控制面板left_panelQWidget()left_layoutQVBoxLayout(left_panel)self.init_control_panel(left_layout)# 右侧主界面right_panelQTabWidget()self.init_video_tab(right_panel)self.init_report_tab(right_panel)self.init_settings_tab(right_panel)main_layout.addWidget(left_panel,1)main_layout.addWidget(right_panel,4)definit_control_panel(self,layout):# 输入源控制self.btn_import_imgQPushButton(导入图片)self.btn_import_videoQPushButton(导入视频)self.btn_open_camQPushButton(打开摄像头)self.btn_stop_detectQPushButton(停止检测)layout.addWidget(self.btn_import_img)layout.addWidget(self.btn_import_video)layout.addWidget(self.btn_open_cam)layout.addWidget(self.btn_stop_detect)# 检测设置layout.addWidget(QLabel(置信度阈值))self.slider_confQSlider(Qt.Horizontal)self.slider_conf.setValue(40)layout.addWidget(self.slider_conf)# 车牌识别开关self.check_ocrQCheckBox(启用车牌识别(OCR))layout.addWidget(self.check_ocr)# 数据记录控制self.btn_start_recordQPushButton(开始记录)self.btn_stop_recordQPushButton(停止记录)layout.addWidget(self.btn_start_record)layout.addWidget(self.btn_stop_record)# 信号连接self.btn_open_cam.clicked.connect(lambda:self.start_detection(0))self.btn_stop_detect.clicked.connect(self.stop_detection)self.btn_start_record.clicked.connect(self.start_recording)self.btn_stop_record.clicked.connect(self.stop_recording)definit_video_tab(self,tab_widget):video_tabQWidget()layoutQVBoxLayout(video_tab)self.video_labelQLabel()self.video_label.setAlignment(Qt.AlignCenter)layout.addWidget(self.video_label)tab_widget.addTab(video_tab,实时检测)definit_report_tab(self,tab_widget):report_tabQWidget()layoutQVBoxLayout(report_tab)self.btn_export_csvQPushButton(导出CSV报告)self.btn_export_csv.clicked.connect(self.export_csv)layout.addWidget(self.btn_export_csv)tab_widget.addTab(report_tab,数据导出与报告)definit_settings_tab(self,tab_widget):settings_tabQWidget()layoutQVBoxLayout(settings_tab)layout.addWidget(QLabel(模型路径))self.line_model_pathQLineEdit(CONFIG[model_path])layout.addWidget(self.line_model_path)tab_widget.addTab(settings_tab,系统设置)defstart_detection(self,source):ifself.detection_threadandself.detection_thread.isRunning():self.detection_thread.stop()self.detection_threadDetectionThread(source)self.detection_thread.frame_signal.connect(self.update_frame)self.detection_thread.log_signal.connect(self.log_message)self.detection_thread.start()defstop_detection(self):ifself.detection_thread:self.detection_thread.stop()self.video_label.clear()defupdate_frame(self,frame):rgbcv2.cvtColor(frame,cv2.COLOR_BGR2RGB)h,w,chrgb.shape bytes_per_linech*w qimgQImage(rgb.data,w,h,bytes_per_line,QImage.Format_RGB888)self.video_label.setPixmap(QPixmap.fromImage(qimg).scaled(self.video_label.size(),Qt.KeepAspectRatio))deflog_message(self,msg):print(f[LOG]{msg})defstart_recording(self):ifself.detection_thread:self.detection_thread.start_recording()QMessageBox.information(self,提示,开始记录数据)defstop_recording(self):ifself.detection_thread:self.record_dataself.detection_thread.stop_recording()QMessageBox.information(self,提示,f已记录{len(self.record_data)}条数据)defexport_csv(self):ifnotself.record_data:QMessageBox.warning(self,警告,无数据可导出)returndfpd.DataFrame(self.record_data)path,_QFileDialog.getSaveFileName(self,保存CSV,,CSV Files (*.csv))ifpath:df.to_csv(path,indexFalse)QMessageBox.information(self,成功,CSV报告已导出)defcloseEvent(self,event):self.stop_detection()event.accept()四、关键模块说明YOLOv11 目标检测与追踪使用ultralytics库的track方法内置ByteTrack算法实现车辆多目标追踪。车牌识别集成PaddleOCR对车辆ROI区域进行车牌文本识别输出车牌号码。车速计算基于相机高度、俯仰角和像素位移结合简单几何换算实现车速估算实际应用需根据相机参数校准。数据记录与导出记录检测过程数据支持导出CSV/JSON格式可生成HTML可视化报告。PySide6 界面提供可视化操作界面支持摄像头/视频源切换、参数配置、实时画面展示。五、使用说明将训练好的YOLOv11模型best.pt放在项目根目录运行python main.py启动系统点击「打开摄像头」或「导入视频」开始检测启用「车牌识别」可显示识别到的车牌号码点击「开始记录」记录数据结束后可导出CSV报告。六、补充说明车速计算模块为简化实现实际项目需结合相机内参、外参进行标定以提高精度车牌识别可单独优化车牌检测模型再对接OCR提升识别准确率系统支持自定义检测类别可在CONFIG[classes]中修改如需部署到边缘设备可使用YOLOv11n模型并导出ONNX格式提升推理速度。代码仅供参考学习