基于yolov5-v11和deepsort的行人入侵检测系统 GUI部分使用pyqt5制作,包括数据库、多线程、自定义组件等 计算机视觉项目**,结合了**目标检测(YOLO)**、**目标跟踪(De
区域入侵- 基于yolov5-v11和deepsort的行人入侵检测系统
,适用于大学生研究生相关项目、比赛以及界面展示。
本项目GUI部分使用pyqt5制作,包括数据库、多线程、自定义组件等知识,亦可作为学习深度学习和pyqt5时的练手项目。功能以及特色如下:
1.系统带注册登录功能
2.输入数据格式:图片、文件夹、视频以及支持摄像头的实时检测,并自动保存最终检测结果。
3.支持自定义绘制禁行区域
4.支持语音、弹窗、截图三种报警方式
5.支持交并比和置信度的动态调节
6.支持rtsp流检测
7.提供详细的项目说明以及环境配置教程,
1
1
这是一个非常实用且功能完备的计算机视觉项目,结合了目标检测(YOLO)、目标跟踪(DeepSort)以及桌面应用开发(PyQt5)。
由于完整的项目代码量较大,我将为你提供构建该系统的核心代码框架,重点解决你最关心的DeepSort跟踪、多边形区域入侵判断以及PyQt5界面交互这三个部分。
1. 核心逻辑:入侵检测与DeepSort集成
这部分代码负责处理视频帧,进行目标检测、跟踪,并判断目标是否进入禁行区域。
# core_detector.pyimporttorchimportcv2importnumpyasnpfromdeep_sort_realtime.deepsort_trackerimportDeepSort# 需安装 deep-sort-realtimefromutils.generalimportnon_max_suppression,scale_coordsfromutils.torch_utilsimportselect_deviceclassIntrusionDetector:def__init__(self,weights='yolov5s.pt',device='cpu'):self.device=select_device(device)self.model=torch.load(weights,map_location=self.device)['model'].float().fuse().eval()self.tracker=DeepSort(max_age=30)self.polygon_points=[]# 存储禁行区域的多边形点 [(x1,y1), (x2,y2)...]defset_roi(self,points):"""设置禁行区域"""self.polygon_points=pointsdefdetect_and_track(self,frame):img=frame.copy()# 1. 预处理与推理 (简化版)img=img[:,:,::-1].transpose(2,0,1)# BGR to RGB, to 3x416x416img=np.ascontiguousarray(img)img=torch.from_numpy(img).to(self.device)img=img.float()/255.0# 归一化ifimg.ndimension()==3:img=img.unsqueeze(0)# 推理pred=self.model(img)[0]pred=non_max_suppression(pred,conf_thres=0.4,iou_thres=0.5,classes=[0])# 只检测人(class 0)detections=[]im0=frame.copy()# 2. 处理检测结果fori,detinenumerate(pred):iflen(det):det[:,:4]=scale_coords(img.shape[2:],det[:,:4],im0.shape).round()for*xyxy,conf,clsindet:# 转换为 DeepSort 所需的格式detections.append(([xyxy[0].item(),xyxy[1].item(),xyxy[2].item()-xyxy[0].item(),xyxy[2].item()-xyxy[1].item()],conf.item(),'person'))# 3. 更新 DeepSort 跟踪器outputs=self.tracker.update_tracks(detections,frame=im0)intrude_count=0results=[]# 4. 遍历跟踪结果并判断入侵fortrackinoutputs:ifnottrack.is_confirmed():continuetrack_id=track.track_id ltrb=track.to_ltrb()# 左上右下坐标x1,y1,x2,y2=int(ltrb[0]),int(ltrb[1]),int(ltrb[2]),int(ltrb[3])center_x,center_y=int((x1+x2)/2),int((y1+y2)/2)# 使用中心点判断# 绘制边框cv2.rectangle(im0,(x1,y1),(x2,y2),(0,255,0),2)cv2.putText(im0,f'ID-{track_id}',(x1,y1-10),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0),2)# 判断是否在多边形内is_inside=Falseiflen(self.polygon_points)>2:# cv2.pointPolygonTest 返回 >0 表示在内部dist=cv2.pointPolygonTest(np.array(self.polygon_points,np.int32),(center_x,center_y),False)ifdist>=0:is_inside=Trueintrude_count+=1# 绘制红色框表示入侵cv2.rectangle(im0,(x1,y1),(x2,y2),(0,0,255),3)results.append({"id":track_id,"bbox":(x1,y1,x2,y2),"is_intruding":is_inside})# 5. 绘制多边形区域iflen(self.polygon_points)>2:cv2.polylines(im0,[np.array(self.polygon_points,np.int32)],True,(0,0,255),2)returnim0,results,intrude_count2. PyQt5 界面与交互 (main_window.py)
这部分负责显示视频、处理鼠标绘制多边形以及报警逻辑。
# main_window.pyimportsysimportcv2fromPyQt5.QtWidgetsimportQMainWindow,QApplication,QLabel,QMessageBox,QPushButtonfromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQTimer,Qt,pyqtSignal,QThreadfromcore_detectorimportIntrusionDetectorclassVideoThread(QThread):change_pixmap_signal=pyqtSignal(np.ndarray,int)# 发送图像和入侵人数def__init__(self):super().__init__()self.running=Trueself.detector=IntrusionDetector(weights='yolov5s.pt')self.cap=cv2.VideoCapture(0)# 打开摄像头defrun(self):whileself.running:ret,frame=self.cap.read()ifret:# 进行入侵检测processed_frame,_,count=self.detector.detect_and_track(frame)self.change_pixmap_signal.emit(processed_frame,count)else:breakdefstop(self):self.running=Falseself.cap.release()classMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("行人入侵智能检测系统")self.setGeometry(100,100,1000,600)# UI 组件self.image_label=QLabel(self)self.image_label.resize(800,600)self.alert_btn=QPushButton("报警设置",self)# 鼠标绘制变量self.drawing=Falseself.polygon_points=[]# 线程self.thread=VideoThread()self.thread.change_pixmap_signal.connect(self.update_image)self.thread.start()defupdate_image(self,cv_img,intrude_count):"""更新界面图像"""qt_img=self.convert_cv_qt(cv_img)self.image_label.setPixmap(qt_img)# 简单的弹窗报警逻辑(实际项目中应增加防抖动/定时器限制)ifintrude_count>0:self.image_label.setStyleSheet("border: 3px solid red;")else:self.image_label.setStyleSheet("border: none;")defconvert_cv_qt(self,cv_img):"""将 OpenCV 图像转换为 QPixmap"""rgb_image=cv2.cvtColor(cv_img,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)returnQPixmap.fromImage(convert_to_Qt_format)defmousePressEvent(self,event):"""鼠标点击绘制多边形"""ifevent.button()==Qt.LeftButton:x,y=event.x(),event.y()# 假设左侧是控制面板,右侧是视频区,需做坐标转换ifx>200:self.polygon_points.append((x,y))# 这里需要调用 detector.set_roi 更新区域# self.thread.detector.set_roi(self.polygon_points)defcloseEvent(self,event):self.thread.stop()event.accept()if__name__=="__main__":app=QApplication(sys.argv)window=MainWindow()window.show()sys.exit(app.exec_())3. 项目构建步骤
- 环境配置:按照图2所示,先安装 Miniconda,创建虚拟环境,然后安装 PyTorch(推荐 GPU 版本)和 PyQt5。
- 模型准备:下载预训练的
yolov5s.pt或自行训练针对行人的模型。 - DeepSort 集成:安装
deep-sort-realtime库,它能更方便地与 NumPy 数组配合使用。 - UI 设计:使用 Qt Designer 设计左侧菜单栏和右侧视频显示区域。
- 逻辑连接:将上述
core_detector.py的逻辑嵌入到 PyQt 的线程中,确保视频流流畅播放不卡顿。
这套代码框架涵盖了检测、跟踪、区域判断、UI 显示的核心流程,非常适合作为大学生或研究生的毕设/比赛项目基础。
