基于yolov5-v11和deepsort的行人跌倒检测系统 GUI部分使用pyqt5,YOLOv5-v11 + DeepSORT + PyQt5跌倒检测识别系统
智慧巡检-基于yolov5-v11和deepsort的行人跌倒检测系统适用于大学生研究生相关项目、比赛以及界面展示本项目GUI部分使用pyqt5制作包括数据库、多线程、自定义组件等知识亦可作为学习深度学习和pyqt5时的练手项目。功能以及特色如下1.系统带注册登录功能;2.输入数据格式图片、文件夹、视频以及支持摄像头的实时检测并自动保存最终检测结果;3.支持自定义绘制禁行区域;4.支持语音、弹窗两种报警方式;5.支持交并比和置信度的动态调节;6.支持rtsp流检测;7.提供详细的项目说明以及环境配置教程即使是深度学习小白也能轻松跑通项目;1这是一套非常完整的行人跌倒检测系统设计方案。YOLOv5-v11 DeepSORT PyQt5这是一个典型的计算机视觉GUI应用的全栈项目。构建这个系统其拆分为核心算法逻辑、PyQt5界面架构和功能模块实现三个部分并提供详细的代码框架。以上文字及代码仅供参考第一部分项目文件结构建议按照以下结构组织代码以便于管理和维护FallDetectionSystem/ ├── main.py # 程序入口 ├── ui_main.py # PyQt5 编译后的界面文件 ├── login.ui # Qt Designer设计的登录界面 ├── main_window.ui # Qt Designer设计的主界面 ├── utils/ │ ├── detector.py # YOLO DeepSORT 核心检测逻辑 │ ├── database.py # 用户注册登录数据库操作 │ └── alarm.py # 语音播报和弹窗逻辑 ├── models/ │ ├── falldetect8.pt # YOLOv8 跌倒检测模型 │ └── deepsort_weights/ # DeepSORT 权重 └── resources/ └── icons.qrc # 图标资源第二部分核心算法逻辑 (YOLO DeepSORT)这部分是系统的“大脑”负责视频流的读取、目标检测YOLO和轨迹追踪DeepSORT。utils/detector.pyimportcv2importtorchimportnumpyasnpfromdeep_sort_realtime.deepsort_trackerimportDeepSortclassFallDetector:def__init__(self,model_pathmodels/falldetect8.pt):# 1. 加载YOLO模型self.modeltorch.hub.load(ultralytics/yolov5,custom,pathmodel_path)# 2. 初始化DeepSORT追踪器self.trackerDeepSort(max_age30)# 3. 状态记录self.fall_status{}# 记录每个ID的状态 {id: is_falling}defdetect_and_track(self,frame): 输入: 原始视频帧 输出: 绘制了框和轨迹的帧, 统计信息 # --- YOLO 检测 ---# model 推理resultsself.model(frame)# 解析结果 (假设类别0是person/standing, 类别1是fall/down)detections[]for*xyxy,conf,clsinresults.xyxy[0].cpu().numpy():x1,y1,x2,y2map(int,xyxy)conffloat(conf)clsint(cls)# 只处理人ifclsin[0,1]:# DeepSORT 需要 (left, top, width, height)detections.append(([x1,y1,x2-x1,y2-y1],conf,str(cls)))# --- DeepSORT 追踪 ---tracksself.tracker.update_tracks(detections,frameframe)fall_count0# --- 绘制与逻辑判断 ---fortrackintracks:ifnottrack.is_confirmed():continuetrack_idtrack.track_id ltrbtrack.to_ltrb()# left, top, right, bottomx1,y1,x2,y2map(int,ltrb)# 获取类别 (这里简化处理实际需结合YOLO的分类结果)# 假设我们直接从YOLO结果里拿到了类别信息这里演示绘图# 实际项目中需要将YOLO的cls传给DeepSORT或者在这里做匹配# 模拟跌倒逻辑 (实际应基于YOLO分类结果)# 这里假设 track.get_det_class() 返回类别is_fallFalse# 绘制边界框color(0,255,0)# 绿色正常labelfID:{track_id}Standingifis_fall:color(0,0,255)# 红色跌倒labelfID:{track_id}FALLINGfall_count1self.fall_status[track_id]Trueelse:self.fall_status[track_id]Falsecv2.rectangle(frame,(x1,y1),(x2,y2),color,2)cv2.putText(frame,label,(x1,y1-10),cv2.FONT_HERSHEY_SIMPLEX,0.9,color,2)returnframe,fall_count第三部分PyQt5 界面与多线程为了防止界面卡顿视频处理必须放在子线程中运行。main.pyimportsysimportcv2fromPyQt5.QtWidgetsimportQApplication,QMainWindow,QMessageBox,QFileDialogfromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQThread,pyqtSignal,Qtfromutils.detectorimportFallDetector# --- 工作线程 ---classVideoThread(QThread):change_pixmap_signalpyqtSignal(QImage)alarm_signalpyqtSignal(str)# 发送报警信号def__init__(self):super().__init__()self.runningTrueself.detectorFallDetector()self.source0# 默认摄像头defrun(self):capcv2.VideoCapture(self.source)whileself.running:ret,framecap.read()ifret:# 检测处理processed_frame,fall_countself.detector.detect_and_track(frame)# 格式转换 OpenCV(BGR) - Qt(RGB)rgb_imagecv2.cvtColor(processed_frame,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.change_pixmap_signal.emit(p)# 报警逻辑iffall_count0:self.alarm_signal.emit(检测到有人跌倒)else:breakcap.release()defstop(self):self.runningFalseself.wait()# --- 主窗口 ---classMainWindow(QMainWindow):def__init__(self):super().__init__()# 这里应该加载你的 .ui 文件# self.ui Ui_MainWindow()# self.ui.setupUi(self)self.setWindowTitle(基于深度学习的行人跌倒检测系统)self.setGeometry(100,100,1000,600)# 初始化线程self.threadVideoThread()self.thread.change_pixmap_signal.connect(self.update_image)self.thread.alarm_signal.connect(self.show_alarm)# 模拟界面按钮连接 (需替换为实际控件名)# self.ui.start_btn.clicked.connect(self.start_video)# self.ui.stop_btn.clicked.connect(self.stop_video)self.thread.start()# 启动时自动开始defupdate_image(self,image):# 更新Label显示视频# self.ui.video_label.setPixmap(QPixmap.fromImage(image))passdefshow_alarm(self,msg):# 弹窗报警 (实际项目中建议加防抖不要每一帧都弹)# QMessageBox.warning(self, 警告, msg)print(f报警:{msg})defcloseEvent(self,event):self.thread.stop()event.accept()if__name____main__:appQApplication(sys.argv)windowMainWindow()window.show()sys.exit(app.exec_())第四部分特色功能实现思路1. 数据库 (注册/登录)使用sqlite3是最轻量级的选择。表结构:CREATE TABLE users (id INTEGER PRIMARY KEY, username TEXT UNIQUE, password TEXT)逻辑: 在main.py启动前先弹出一个LoginDialog查询数据库验证密码。2. 绘制禁行区域 (ROI)原理: 在mousePressEvent中获取鼠标点击的坐标保存在一个列表中。检测: 在detector.py中计算目标中心点cx, cy是否在多边形区域内使用cv2.pointPolygonTest。如果在禁行区且检测到跌倒则触发高级报警。3. 动态调节参数 (NMS/Confidence)在 PyQt 中使用QSlider或QDoubleSpinBox。通过信号槽将值传递给FallDetector类。代码示例self.detector.model.conf self.ui.conf_slider.value()4. 语音报警使用PyQt5.QtMultimedia或pyttsx3。fromPyQt5.QtMultimediaimportQSound QSound.play(alarm.wav)运行指南环境安装:pipinstalltorch torchvision opencv-python PyQt5 ultralytics deep_sort_realtime模型准备: 将训练好的falldetect8.pt放入models文件夹。启动: 运行python main.py。这个框架涵盖了你描述的所有核心功能你可以在此基础上完善 UI 细节和具体的业务逻辑。