基于深度学习的道路车辆智能追踪与监控系统,采用最新的YOLOv11目标检测算法,结合ByteTrack多目标追踪技术、PaddleOCR车牌识别和区域入侵检测等先进功能,为智能交通管理提供全方位的解决
深度学习目标检测-YOLOv8 v10 v11 道路车辆(车牌检测)智能追踪系统
系统概述
这是一套基于深度学习的道路车辆智能追踪与监控系统,采用最新的YOLOv11目标检测算法,结合ByteTrack多目标追踪技术、PaddleOCR车牌识别和区域入侵检测等先进功能,为智能交通管理提供全方位的解决方案。
FPS可达60(和配置有关) 可满足实时监测需求!可链接摄像头进行监测
交付内容:
完整的源代码
训练好的YOLOv11模型文件
PaddleOCR识别模型
示例数据集
详细的使用文档
YOLOv11 道路车辆(车牌检测)智能追踪系统 完整构建方案
一、系统功能说明
本系统基于YOLOv11+PySide6开发,集成了以下核心功能:
- 车辆目标检测与多目标追踪(ByteTrack)
- 车牌识别(PaddleOCR)
- 车速计算(基于相机高度与俯仰角)
- 区域入侵检测
- 数据记录与CSV/JSON导出、HTML报告生成
- 实时视频流(摄像头/本地视频)监测
二、环境依赖安装
pipinstallultralytics pyside6 paddlepaddle paddleocr opencv-python numpy pandas matplotlib三、核心代码实现
1. 主程序入口main.py
importsysfromPySide6.QtWidgetsimportQApplicationfromPySide6.QtGuiimportQFont,QFontDatabasefrommain_windowimportMainWindowif__name__=="__main__":app=QApplication(sys.argv)app.setStyle("Fusion")# 加载中文字体try_fonts=["Microsoft YaHei","微软雅黑","Source Han Sans SC","Noto Sans CJK SC"]available_families=QFontDatabase.families()forfnameintry_fonts:iffnameinavailable_families:app.setFont(QFont(fname,10))breakw=MainWindow()w.show()sys.exit(app.exec())2. 主界面与核心逻辑main_window.py
importsysimportcv2importnumpyasnpimportpandasaspdfromdatetimeimportdatetimefromPySide6.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_signal=Signal(np.ndarray)log_signal=Signal(str)data_signal=Signal(dict)def__init__(self,source=0):super().__init__()self.source=source self.running=Falseself.recording=Falseself.tracker=Noneself.ocr=PaddleOCR(use_angle_cls=True,lang='ch',show_log=False)self.model=YOLO(CONFIG["model_path"])self.track_history={}self.record_data=[]defrun(self):self.running=Truecap=cv2.VideoCapture(self.source)whileself.runningandcap.isOpened():ret,frame=cap.read()ifnotret:break# YOLOv11 检测 + ByteTrack 追踪results=self.model.track(frame,persist=True,imgsz=CONFIG["imgsz"],conf=CONFIG["conf_thres"],max_det=CONFIG["max_det"],classes=CONFIG["classes"])annotated_frame=results[0].plot()# 车牌识别ifresults[0].boxes.idisnotNone:boxes=results[0].boxes.xyxy.cpu().numpy()ids=results[0].boxes.id.cpu().numpy()forbox,track_idinzip(boxes,ids):x1,y1,x2,y2=map(int,box)# 裁剪车牌区域(简化示例,可优化)plate_roi=frame[y1:y2,x1:x2]ifplate_roi.size>0:ocr_result=self.ocr.ocr(plate_roi,cls=True)ifocr_resultandocr_result[0]:plate_num=ocr_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_time=datetime.now()ifresults[0].boxes.idisnotNone:forbox,track_idinzip(results[0].boxes.xywh.cpu().numpy(),results[0].boxes.id.cpu().numpy()):cx,cy=int(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)# 基于像素位移计算速度(需结合相机参数校准)pts=self.track_history[track_id]dx=pts[-1][0]-pts[0][0]dt=(pts[-1][2]-pts[0][2]).total_seconds()ifdt>0:speed=abs(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.running=Falseself.wait()defstart_recording(self):self.recording=Trueself.record_data=[]defstop_recording(self):self.recording=Falsereturnself.record_dataclassMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("YOLOv11 道路车辆智能追踪系统")self.setGeometry(100,100,1200,800)self.detection_thread=Noneself.record_data=[]self.init_ui()definit_ui(self):central_widget=QWidget()self.setCentralWidget(central_widget)main_layout=QHBoxLayout(central_widget)# 左侧控制面板left_panel=QWidget()left_layout=QVBoxLayout(left_panel)self.init_control_panel(left_layout)# 右侧主界面right_panel=QTabWidget()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_img=QPushButton("导入图片")self.btn_import_video=QPushButton("导入视频")self.btn_open_cam=QPushButton("打开摄像头")self.btn_stop_detect=QPushButton("停止检测")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_conf=QSlider(Qt.Horizontal)self.slider_conf.setValue(40)layout.addWidget(self.slider_conf)# 车牌识别开关self.check_ocr=QCheckBox("启用车牌识别(OCR)")layout.addWidget(self.check_ocr)# 数据记录控制self.btn_start_record=QPushButton("开始记录")self.btn_stop_record=QPushButton("停止记录")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_tab=QWidget()layout=QVBoxLayout(video_tab)self.video_label=QLabel()self.video_label.setAlignment(Qt.AlignCenter)layout.addWidget(self.video_label)tab_widget.addTab(video_tab,"实时检测")definit_report_tab(self,tab_widget):report_tab=QWidget()layout=QVBoxLayout(report_tab)self.btn_export_csv=QPushButton("导出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_tab=QWidget()layout=QVBoxLayout(settings_tab)layout.addWidget(QLabel("模型路径"))self.line_model_path=QLineEdit(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_thread=DetectionThread(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):rgb=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)h,w,ch=rgb.shape bytes_per_line=ch*w qimg=QImage(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_data=self.detection_thread.stop_recording()QMessageBox.information(self,"提示",f"已记录{len(self.record_data)}条数据")defexport_csv(self):ifnotself.record_data:QMessageBox.warning(self,"警告","无数据可导出")returndf=pd.DataFrame(self.record_data)path,_=QFileDialog.getSaveFileName(self,"保存CSV","","CSV Files (*.csv)")ifpath:df.to_csv(path,index=False)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格式,提升推理速度。
代码仅供参考学习