深度学习基于 YOLOv8 + DeepSORT(用于追踪ID) + PyQt5区域入侵检测系统 基于YOLOv8的行人车辆目标区域入侵检测系统 毕业设计或工程原型架构
智慧巡检-基于YOLOv8的行人车辆目标区域入侵检测系统附全部源码完整标注的数据集训练好的模型及训练结果项目运行教程内含 3000 张VOC2007数据集包括 [‘aeroplane’, ‘bicycle’, ‘bus’, ‘car’, ‘motorbike’, ‘person’, ‘train’]7 类VOC2007数据集不是街景实拍项目介绍软件PycharmAnaconda或者VSCodeAnaconda环境python3.9 opencv-python PyQt5 ultralytics torch1.9等文件①完整程序文件.py等②UI界面源文件、图标.ui、.qrc、.py等③数据集图片项目运行教程.jpg、.txt等功能支持图片、视频及摄像头进行检测支持选择模型界面可实时显示目标位置、目标总数、置信度等信息支持批量检测在界面直接查看所有检测结果支持检测结果保存支持自定义检测区域报警设置包括目标类别选择、声音报警开关、目标图像记录保存、滞留时间阈值。①选择单张图片或者图片文件夹进行识别②选择视频文件进行识别③调用本地摄像头进行识别④自定义置信度IOU阈值⑤选择显示标签和原图⑥选择检测模型⑦查看批量检测每一张检测结果⑧自定义检测区域报警设置包括目标类别选择、声音报警开关、目标图像记录保存、滞留时间阈值1亮点在于**“区域入侵检测”和“滞留时间报警”**基于YOLOv8 DeepSORT用于追踪ID PyQt5的完整系统代码。系统架构设计功能我们需要以下模块核心检测YOLOv8 负责识别 7 类目标。目标追踪DeepSORT 负责给每个目标分配唯一的 ID从而计算“滞留时间”。GUI 界面PyQt5 实现截图中的布局视频区、参数区、日志区。逻辑控制多边形区域判定判断目标中心点是否在自定义区域内。滞留计时器记录目标在区域内的帧数/时间。1. 环境依赖你需要安装以下库pipinstallPyQt5 opencv-python ultralytics numpy torch pandas matplotlib# 追踪算法通常需要pipinstallnumba2. 核心代码实现由于完整的工业代码非常庞大高度集成的核心版本关键逻辑项目结构建议IntrusionSystem/ ├── main.py # 主程序入口 ├── tracker.py # 追踪逻辑 (简化版DeepSORT逻辑) ├── ui_main.py # UI界面代码 └── weights/ └── best.pt # 训练好的YOLOv8模型ui_main.py(界面构建)界面代码fromPyQt5.QtWidgetsimportQMainWindow,QWidget,QVBoxLayout,QHBoxLayout,QLabel,QPushButton,QTableWidget,QTableWidgetItem,QHeaderView,QGroupBox,QFormLayout,QComboBox,QCheckBox,QDoubleSpinBox,QFileDialog,QMessageBoxfromPyQt5.QtGuiimportQPixmap,QImage,QIcon,QFontfromPyQt5.QtCoreimportQt,QTimer,QThread,pyqtSignalclassUi_MainWindow(object):defsetupUi(self,MainWindow):MainWindow.setObjectName(MainWindow)MainWindow.resize(1200,800)MainWindow.setWindowTitle(基于深度学习的行人车辆目标区域入侵检测系统)# 主窗口部件self.centralwidgetQWidget(MainWindow)self.horizontalLayoutQHBoxLayout(self.centralwidget)# --- 左侧视频显示区域 ---self.video_groupQGroupBox(视频流显示)self.video_layoutQVBoxLayout(self.video_group)self.video_labelQLabel()self.video_label.setAlignment(Qt.AlignCenter)self.video_label.setText(等待视频输入...)self.video_label.setStyleSheet(background-color: #000000; color: #FFFFFF;)self.video_layout.addWidget(self.video_label)# --- 右侧控制面板 ---self.control_layoutQVBoxLayout()# 参数设置self.param_groupQGroupBox(检测参数设置)self.form_layoutQFormLayout(self.param_group)self.btn_modelQPushButton(选择模型)self.conf_spinQDoubleSpinBox()self.conf_spin.setRange(0,1)self.conf_spin.setValue(0.25)self.iou_spinQDoubleSpinBox()self.iou_spin.setRange(0,1)self.iou_spin.setValue(0.45)self.form_layout.addRow(置信度阈值:,self.conf_spin)self.form_layout.addRow(IOU阈值:,self.iou_spin)self.form_layout.addRow(self.btn_model)# 报警设置self.alarm_groupQGroupBox(报警设置)self.alarm_layoutQVBoxLayout(self.alarm_group)self.btn_draw_roiQPushButton(绘制入侵区域)self.alarm_layout.addWidget(self.btn_draw_roi)# 检测结果信息self.result_groupQGroupBox(检测结果)self.result_layoutQFormLayout(self.result_group)self.lbl_timeQLabel(0.00s)self.lbl_countQLabel(0)self.result_layout.addRow(用时:,self.lbl_time)self.result_layout.addRow(目标数目:,self.lbl_count)# 操作按钮self.op_groupQGroupBox(操作)self.op_layoutQVBoxLayout(self.op_group)self.btn_imgQPushButton(打开图片)self.btn_videoQPushButton(打开视频)self.btn_camQPushButton(打开摄像头)self.btn_saveQPushButton(保存结果)self.op_layout.addWidget(self.btn_img)self.op_layout.addWidget(self.btn_video)self.op_layout.addWidget(self.btn_cam)self.op_layout.addWidget(self.btn_save)# --- 底部数据表格 ---self.table_groupQGroupBox(检测结果与位置信息)self.table_layoutQVBoxLayout(self.table_group)self.tableQTableWidget()self.table.setColumnCount(6)self.table.setHorizontalHeaderLabels([序号,目标ID,类别,置信度,X,Y])self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)self.table_layout.addWidget(self.table)# --- 组装布局 ---self.control_layout.addWidget(self.param_group)self.control_layout.addWidget(self.alarm_group)self.control_layout.addWidget(self.result_group)self.control_layout.addWidget(self.op_group)self.horizontalLayout.addWidget(self.video_group,3)# 左侧占3份self.horizontalLayout.addLayout(self.control_layout,1)# 右侧占1份self.horizontalLayout.addWidget(self.table_group,1)# 底部表格占1份 (实际布局需调整这里为了简化演示)MainWindow.setCentralWidget(self.centralwidget)main.py(核心逻辑)这里包含了YOLOv8 检测、简单的追踪逻辑和区域入侵判定。importsysimportcv2importtorchimportnumpyasnpimportpandasaspdfromPyQt5.QtCoreimport*fromPyQt5.QtGuiimport*fromui_mainimportUi_MainWindowfromultralyticsimportYOLO# 简单的追踪器类 (实际项目建议用DeepSORT)classSimpleTracker:def__init__(self):self.tracks{}self.count0defupdate(self,detections):# detections: list of [x1, y1, x2, y2, conf, cls]new_tracks{}fordetindetections:x1,y1,x2,y2,conf,clsdet cx,cy(x1x2)/2,(y1y2)/2matchedFalse# 简单的IOU匹配或距离匹配fortid,trackinself.tracks.items():tx,tytrack[center]distnp.sqrt((cx-tx)**2(cy-ty)**2)ifdist50:# 距离阈值new_tracks[tid]{center:(cx,cy),cls:cls,timer:track[timer]1ifself.is_in_roi((cx,cy))else0}matchedTruebreakifnotmatched:self.count1new_tracks[self.count]{center:(cx,cy),cls:cls,timer:0}self.tracksnew_tracksreturnself.tracksdefis_in_roi(self,point):# 这里需要传入ROI点简化起见返回TruereturnTrueclassWorker(QThread):change_pixmap_signalpyqtSignal(np.ndarray)update_table_signalpyqtSignal(list)def__init__(self):super().__init__()self.runningTrueself.source0# 0 for camself.modelYOLO(weights/best.pt)# 加载你的模型self.trackerSimpleTracker()self.roi_points[]# 多边形区域点self.conf_thres0.25defrun(self):capcv2.VideoCapture(self.source)whileself.running:ret,framecap.read()ifret:# YOLOv8 推理resultsself.model(frame,confself.conf_thres,verboseFalse)[0]# 解析结果detections[]data_list[]forboxinresults.boxes:x1,y1,x2,y2map(int,box.xyxy[0].tolist())confbox.conf[0].item()clsint(box.cls[0].item())labelresults.names[cls]detections.append([x1,y1,x2,y2,conf,cls])# 绘制框cv2.rectangle(frame,(x1,y1),(x2,y2),(0,255,0),2)cv2.putText(frame,f{label}{conf:.2f},(x1,y1-10),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0),2)# 添加到表格数据data_list.append([len(data_list)1,ID:?,label,f{conf:.2f},x1,y1])# 更新追踪 (这里只是模拟ID)tracksself.tracker.update(detections)# 绘制ROI (如果定义了)iflen(self.roi_points)2:cv2.polylines(frame,[np.array(self.roi_points)],True,(0,0,255),2)# 发送信号self.change_pixmap_signal.emit(frame)self.update_table_signal.emit(data_list)else:breakcap.release()defstop(self):self.runningFalseself.wait()classMainWindow(QMainWindow,Ui_MainWindow):def__init__(self):super().__init__()self.setupUi(self)self.threadWorker()# 连接信号槽self.btn_cam.clicked.connect(self.start_camera)self.btn_video.clicked.connect(self.open_video)self.thread.change_pixmap_signal.connect(self.update_image)self.thread.update_table_signal.connect(self.update_table)# 参数联动self.conf_spin.valueChanged.connect(lambdav:setattr(self.thread,conf_thres,v))defstart_camera(self):self.thread.source0self.thread.start()defopen_video(self):fnameQFileDialog.getOpenFileName(self,Open file,.,Video files (*.mp4 *.avi))iffname[0]:self.thread.sourcefname[0]self.thread.start()defupdate_image(self,cv_img):Converts OpenCV image to Qt image and displays itrgb_imagecv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB)h,w,chrgb_image.shape bytes_per_linech*w convert_to_Qt_formatQImage(rgb_image.data,w,h,bytes_per_line,QImage.Format_RGB888)pconvert_to_Qt_format.scaled(640,480,Qt.KeepAspectRatio)self.video_label.setPixmap(QPixmap.fromImage(p))defupdate_table(self,data):self.table.setRowCount(0)forrow_number,row_datainenumerate(data):self.table.insertRow(row_number)forcolumn_number,column_datainenumerate(row_data):self.table.setItem(row_number,column_number,QTableWidgetItem(str(column_data)))if__name____main__:appQApplication(sys.argv)windowMainWindow()window.show()sys.exit(app.exec_())3. 关键功能实现细节入侵检测逻辑在Worker类的run方法中你需要添加多边形判定逻辑defis_point_in_roi(point,roi_points):# point: (x, y), roi_points: [(x1,y1), (x2,y2), ...]# 使用 OpenCV 的 pointPolygonTestdistcv2.pointPolygonTest(np.array(roi_points,np.int32),point,False)returndist0滞留时间报警在SimpleTracker类中如果一个目标的 ID 在 ROI 区域内的帧数超过阈值例如 30 帧 1秒则触发报警iftrack[timer]30:# 假设30帧为阈值cv2.putText(frame,ALARM: STAYING TOO LONG,(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),3)# 播放声音# winsound.Beep(1000, 500)4. 项目运行教程准备模型将你训练好的best.pt放入weights文件夹。准备数据集使用的是 VOC2007 格式。虽然 YOLOv8 原生支持 YOLO 格式txt但 Ultralytics 库也支持直接读取 VOC 格式进行训练或者你可以写一个简单的脚本将 XML 转为 TXT。运行界面执行python main.py。操作点击“打开视频”加载你的测试视频。点击“绘制入侵区域”需在代码中实现鼠标回调事件来获取点击坐标。观察表格中是否实时刷新目标 ID 和位置。UI 布局和功能逻辑是一个标准的。