智慧巡检-基于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.py
importcv2importtorchimportnumpyasnpfromdeep_sort_realtime.deepsort_trackerimportDeepSortclassFallDetector:def__init__(self,model_path='models/falldetect8.pt'):# 1. 加载YOLO模型self.model=torch.hub.load('ultralytics/yolov5','custom',path=model_path)# 2. 初始化DeepSORT追踪器self.tracker=DeepSort(max_age=30)# 3. 状态记录self.fall_status={}# 记录每个ID的状态 {id: is_falling}defdetect_and_track(self,frame):""" 输入: 原始视频帧 输出: 绘制了框和轨迹的帧, 统计信息 """# --- YOLO 检测 ---# model 推理results=self.model(frame)# 解析结果 (假设类别0是person/standing, 类别1是fall/down)detections=[]for*xyxy,conf,clsinresults.xyxy[0].cpu().numpy():x1,y1,x2,y2=map(int,xyxy)conf=float(conf)cls=int(cls)# 只处理人ifclsin[0,1]:# DeepSORT 需要 (left, top, width, height)detections.append(([x1,y1,x2-x1,y2-y1],conf,str(cls)))# --- DeepSORT 追踪 ---tracks=self.tracker.update_tracks(detections,frame=frame)fall_count=0# --- 绘制与逻辑判断 ---fortrackintracks:ifnottrack.is_confirmed():continuetrack_id=track.track_id ltrb=track.to_ltrb()# left, top, right, bottomx1,y1,x2,y2=map(int,ltrb)# 获取类别 (这里简化处理,实际需结合YOLO的分类结果)# 假设我们直接从YOLO结果里拿到了类别信息,这里演示绘图# 实际项目中需要将YOLO的cls传给DeepSORT或者在这里做匹配# 模拟跌倒逻辑 (实际应基于YOLO分类结果)# 这里假设 track.get_det_class() 返回类别is_fall=False# 绘制边界框color=(0,255,0)# 绿色:正常label=f'ID:{track_id}Standing'ifis_fall:color=(0,0,255)# 红色:跌倒label=f'ID:{track_id}FALLING'fall_count+=1self.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.py
importsysimportcv2fromPyQt5.QtWidgetsimportQApplication,QMainWindow,QMessageBox,QFileDialogfromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQThread,pyqtSignal,Qtfromutils.detectorimportFallDetector# --- 工作线程 ---classVideoThread(QThread):change_pixmap_signal=pyqtSignal(QImage)alarm_signal=pyqtSignal(str)# 发送报警信号def__init__(self):super().__init__()self.running=Trueself.detector=FallDetector()self.source=0# 默认摄像头defrun(self):cap=cv2.VideoCapture(self.source)whileself.running:ret,frame=cap.read()ifret:# 检测处理processed_frame,fall_count=self.detector.detect_and_track(frame)# 格式转换 OpenCV(BGR) -> Qt(RGB)rgb_image=cv2.cvtColor(processed_frame,cv2.COLOR_BGR2RGB)h,w,ch=rgb_image.shape bytes_per_line=ch*w convert_to_Qt_format=QImage(rgb_image.data,w,h,bytes_per_line,QImage.Format_RGB888)p=convert_to_Qt_format.scaled(640,480,Qt.KeepAspectRatio)self.change_pixmap_signal.emit(p)# 报警逻辑iffall_count>0:self.alarm_signal.emit("检测到有人跌倒!")else:breakcap.release()defstop(self):self.running=Falseself.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.thread=VideoThread()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__':app=QApplication(sys.argv)window=MainWindow()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 细节和具体的业务逻辑。