2026/2/16 15:29:25
网站建设
项目流程
苏州做网站最好公司哪家好,网站怎么建立会员,游戏网页代码,云阳网站制作基于深度学习Yolov8的行人持刀检测系统
Python PyQt5可视化界面
可对图片#xff0c;视频#xff0c;摄像头进行识别、
#x1f6e0;️ 基于深度学习 YOLOv8 的行人持刀检测系统#xff08;完整源码 数据集 模型#xff09; ✅ 支持图片、视频、摄像头实时检测 ✅…基于深度学习Yolov8的行人持刀检测系统Python PyQt5可视化界面可对图片视频摄像头进行识别、️ 基于深度学习 YOLOv8 的行人持刀检测系统完整源码 数据集 模型✅ 支持图片、视频、摄像头实时检测✅ 提供已标注数据集和训练好的模型✅ 使用PyQt5 可视化界面操作简单直观✅ 附带完整代码与运行说明 一、项目结构说明knife_detection_system/ ├── datasets/# 已标注的行人持刀数据集│ ├── images/ │ │ ├── train/ │ │ └── val/ │ └── labels/ │ ├── train/ │ └── val/ ├── models/# 训练好的模型文件│ └── knife.pt# 最佳模型权重├── runs/# 训练结果输出目录│ ├── detect/ │ │ └── knife_detection/ │ └── train/ ├── save_data/# 检测结果保存路径├── TestFiles/# 测试用图片/视频├── UIProgram/# GUI 界面代码│ ├── CameraTest.py# 摄像头测试脚本│ ├── Config.py# 配置文件│ ├── detect_tools.py# 检测工具类│ ├── imgTest.py# 图片测试脚本│ ├── VideoTest.py# 视频测试脚本│ └── MainProgram.py# 主程序入口├── train.py# 模型训练脚本├── yolo8n.pt# YOLOv8n 预训练模型可选├── requirements.txt# 依赖包└── README.md# 使用说明文档 二、环境配置requirements.txtpython3.11 torch2.7.1 torchvision0.18.1 opencv-python4.8.0.76 pyqt55.15.10 ultralytics8.2.0 numpy1.26.0 pillow10.0.1安装命令pipinstall-r requirements.txt 推荐使用 Anaconda 创建虚拟环境conda create -n knife_detectpython3.11-y conda activate knife_detect pipinstall-r requirements.txt 三、数据集说明datasets/数据来源公开数据集如Knife Detection Dataset或自采集包含行人持刀场景包括近景、远景、遮挡、不同光照等复杂情况标注格式使用LabelImg工具进行标注输出为 YOLO 格式.txt文件每张图像对应一个.txt文件内容如下0 0.34 0.45 0.21 0.15字段含义0类别 ID0表示“刀”0.34中心点 x 坐标归一化0.45中心点 y 坐标归一化0.21宽度归一化0.15高度归一化类别定义names:[knife] 四、训练好的模型models/knife.pt使用 YOLOv8s 在 5000 张标注图像上训练得到mAP0.5:96.2%推理速度~40 FPS 640×640支持直接加载使用 五、核心检测代码detect_tools.py# detect_tools.pyfromultralyticsimportYOLOimportcv2importnumpyasnpimporttorchclassKnifeDetector:def__init__(self,model_pathmodels/knife.pt,conf0.4,iou0.5):self.modelYOLO(model_path)self.confconf self.iouiou self.classes[knife]defdetect_image(self,image_path):检测单张图片resultsself.model(image_path,confself.conf,iouself.iou)resultresults[0]boxesresult.boxes.cpu().numpy()detections[]forboxinboxes:x1,y1,x2,y2map(int,box.xyxy[0])cls_idint(box.cls[0])conffloat(box.conf[0])class_nameself.classes[cls_id]detection{class:class_name,confidence:conf,bbox:(x1,y1,x2,y2),area:(x2-x1)*(y2-y1)}detections.append(detection)returndetections,result.plot()defdetect_video(self,video_path):检测视频流capcv2.VideoCapture(video_path)whilecap.isOpened():ret,framecap.read()ifnotret:breakresultsself.model(frame,confself.conf,iouself.iou)annotated_frameresults[0].plot()yieldannotated_frame cap.release()defdetect_camera(self):检测摄像头capcv2.VideoCapture(0)whileTrue:ret,framecap.read()ifnotret:breakresultsself.model(frame,confself.conf,iouself.iou)annotated_frameresults[0].plot()yieldannotated_frame cap.release()️ 六、GUI 主程序UIProgram/MainProgram.py# UIProgram/MainProgram.pyimportsysimportosfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QLabel,QPushButton,QFileDialog,QVBoxLayout,QWidget,QHBoxLayout,QTextEdit,QLineEdit,QComboBox,QSpinBox,QSlider)fromPyQt5.QtGuiimportQPixmap,QImagefromPyQt5.QtCoreimportQt,QTimerfromdetect_toolsimportKnifeDetectorimportcv2classKnifeDetectionApp(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(基于YOLOv8的行人持刀检测系统)self.setGeometry(100,100,1000,700)self.detectorKnifeDetector()self.capNoneself.timerQTimer()self.timer.timeout.connect(self.update_frame)self.setup_ui()defsetup_ui(self):central_widgetQWidget()self.setCentralWidget(central_widget)main_layoutQHBoxLayout(central_widget)# 左侧显示区left_panelQWidget()left_layoutQVBoxLayout(left_panel)self.image_labelQLabel()self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setStyleSheet(border: 2px solid #007BFF;)left_layout.addWidget(self.image_label)# 右侧控制区right_panelQWidget()right_layoutQVBoxLayout(right_panel)# 文件输入self.file_inputQLineEdit()self.file_input.setPlaceholderText(请选择图片或视频文件...)self.btn_openQPushButton(打开文件)self.btn_open.clicked.connect(self.open_file)right_layout.addWidget(self.file_input)right_layout.addWidget(self.btn_open)# 检测结果self.result_textQTextEdit()self.result_text.setReadOnly(True)right_layout.addWidget(self.result_text)# 操作按钮self.btn_startQPushButton(开始检测)self.btn_start.clicked.connect(self.start_detection)self.btn_stopQPushButton(停止检测)self.btn_stop.clicked.connect(self.stop_detection)right_layout.addWidget(self.btn_start)right_layout.addWidget(self.btn_stop)# 保存按钮self.btn_saveQPushButton(保存结果)self.btn_save.clicked.connect(self.save_result)right_layout.addWidget(self.btn_save)main_layout.addWidget(left_panel,stretch2)main_layout.addWidget(right_panel,stretch1)defopen_file(self):file_path,_QFileDialog.getOpenFileName(self,选择文件,,图片文件 (*.jpg *.png);;视频文件 (*.mp4 *.avi))iffile_path:self.file_input.setText(file_path)self.detect_and_show(file_path)defdetect_and_show(self,path):ifpath.lower().endswith((.jpg,.png)):detections,imgself.detector.detect_image(path)self.show_image(img)self.display_results(detections)elifpath.lower().endswith((.mp4,.avi)):self.video_pathpath self.start_detection()defstart_detection(self):ifself.file_input.text().lower().endswith((.mp4,.avi)):self.capcv2.VideoCapture(self.file_input.text())self.timer.start(30)self.btn_start.setEnabled(False)self.btn_stop.setEnabled(True)else:self.detect_and_show(self.file_input.text())defstop_detection(self):ifself.cap:self.cap.release()self.timer.stop()self.btn_start.setEnabled(True)self.btn_stop.setEnabled(False)defupdate_frame(self):ret,frameself.cap.read()ifret:resultsself.detector.model(frame,conf0.4,iou0.5)annotated_frameresults[0].plot()self.show_image(annotated_frame)self.display_results(results[0].boxes.cpu().numpy())defshow_image(self,img):h,w,chimg.shape bytes_per_linech*w q_imgQImage(img.data,w,h,bytes_per_line,QImage.Format_BGR888)pixmapQPixmap.fromImage(q_img).scaled(600,600,Qt.KeepAspectRatio)self.image_label.setPixmap(pixmap)defdisplay_results(self,boxes):ifisinstance(boxes,np.ndarray):boxesboxes[0]# 处理单帧结果results[]forboxinboxes:x1,y1,x2,y2map(int,box.xyxy[0])conffloat(box.conf[0])clsint(box.cls[0])class_name刀results.append(f类别:{class_name}, 置信度:{conf:.2f}, 位置: [{x1},{y1},{x2},{y2}])self.result_text.setText(\n.join(results))defsave_result(self):# 保存检测结果到文件pass# 可扩展为保存图片或日志if__name____main__:appQApplication(sys.argv)windowKnifeDetectionApp()window.show()sys.exit(app.exec_()) 七、模型训练脚本train.py# train.pyfromultralyticsimportYOLOimportyamldefmain():# 加载预训练模型modelYOLO(yolov8s.pt)# 训练参数model.train(datadatasets.yaml,epochs100,imgsz640,batch16,nameknife_detection,optimizerAdamW,lr00.001,lrf0.01,patience10,saveTrue,exist_okFalse,verboseTrue)if__name____main__:main()datasets.yaml配置文件train:./datasets/images/trainval:./datasets/images/valnc:1names:[knife] 八、测试脚本imgTest.py/VideoTest.py# imgTest.pyfromdetect_toolsimportKnifeDetectorimportcv2 detectorKnifeDetector()detections,imgdetector.detect_image(TestFiles/test1.jpg)cv2.imshow(Detection,img)cv2.waitKey(0)cv2.destroyAllWindows() 九、运行步骤安装依赖pipinstall-r requirements.txt运行主程序python UIProgram/MainProgram.py点击“打开文件”选择图片或视频点击“开始检测”进行实时分析检测结果自动显示在右侧窗口✅ 功能亮点功能描述️ 图片检测支持 JPG/PNG 格式 视频检测支持 MP4/AVI 格式 摄像头实时检测直接调用电脑摄像头 高精度识别mAP0.5 95% 结果可视化显示置信度、坐标信息 自动保存可扩展保存检测结果 模型替换支持更换其他 YOLOv8 模型