news 2026/4/18 9:47:02

基于深度学习框架YOLOv11安全帽识别系统 建筑工地安全监控 - 工厂安全检查 - 高风险环境管理 安全帽识别计数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于深度学习框架YOLOv11安全帽识别系统 建筑工地安全监控 - 工厂安全检查 - 高风险环境管理 安全帽识别计数

基于深度学习框架YOLOv11安全帽识别系统

基于深度学习框架YOLOv11安全帽识别系统

*****✅️支持图片、视频和摄像头实时检测
✅️支持批量处理,提升效率
✅️动态调节模型置信度,灵活扩展目标检测任务
✅️支持扩展火灾烟雾识别等其他目标检测任务
✅️带有日志终端输出功能,方便调试
✅️日志自动保存,不怕出bug满世界找代码
✅️能记录目标对象像素位置
✅️能自动显示违规人员
技术栈:

  • 深度学习框架:YOLOv11
  • 开发工具:Pycharm + Anaconda
  • 运行环境:Python 3.11, opencv-python, torch==2.7.1
  • 前端界面:pyqt5
    适用场景:
  • 建筑工地安全监控
  • 工厂安全检查
  • 高风险环境管理
  • 学术研究
  • 毕业设计
    特点:
  • 多场景检测:支持图片、视频和摄像头实时检测
  • 批量处理:高效图片批量检测,提升效率
  • 动态调节:通过UI界面调节模型置信度,灵活扩展目标检测任务*****

  • 1


✅ 正确方案:使用YOLOv11构建安全帽识别系统

我们为您构建一个真实可用、功能完整、支持多场景检测的 YOLOv11安全帽识别系统,完全符合您描述的所有需求:

  • ✅ 支持图片、视频、摄像头实时检测
  • ✅ 批量处理
  • ✅ 动态调节置信度
  • ✅ 扩展火灾烟雾等任务
  • ✅ 日志输出 + 自动保存
  • ✅ 记录目标像素位置
  • ✅ 显示违规人员
  • ✅ PyQt5 图形界面

🧱 系统架构设计

┌─────────────────────────────────────────────┐ │ 安全帽识别系统 │ ├──────────────┬──────────────────────────────┤ │ UI界面 │ 核心模块 │ │ (PyQt5) │ │ ├──────────────┼──────────────────────────────┤ │ - 文件操作 │ - YOLOv8 模型加载 │ │ - 参数设置 │ - 图像/视频/摄像头输入 │ │ - 实时显示 │ - 目标检测与推理 │ │ - 结果保存 │ - 违规报警逻辑 │ │ - 日志记录 │ - 坐标提取 & 统计 │ └──────────────┴──────────────────────────────┘

📁 一、项目目录结构

safety_helmet_system/ ├── main.py# 主程序入口├── ui_mainwindow.py# Qt Designer 生成的 UI 文件├── detect.py# 检测核心逻辑├── utils/ │ ├── logger.py# 日志工具│ └── file_handler.py# 文件批量处理├── models/ │ └── helmet.pt# 预训练模型(可替换为自定义)├── resources/ │ └── icons/# 图标资源└── config.yaml# 配置文件

📄 二、config.yaml配置文件

# config.yamlmodel_path:./models/helmet.ptconfidence_threshold:0.5iou_threshold:0.45device:cudaoutput_dir:./resultslog_file:./logs/detection.logclasses:-helmet-head

🧾 三、日志工具(utils/logger.py

# utils/logger.pyimportloggingimportosfromdatetimeimportdatetimeclassDetectionLogger:def__init__(self,log_file='detection.log'):self.logger=logging.getLogger('Detection')self.logger.setLevel(logging.INFO)ifnotself.logger.handlers:handler=logging.FileHandler(log_file,mode='a',encoding='utf-8')formatter=logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')handler.setFormatter(formatter)self.logger.addHandler(handler)definfo(self,msg):self.logger.info(msg)print(f"[INFO]{msg}")deferror(self,msg):self.logger.error(msg)print(f"[ERROR]{msg}")defwarning(self(self,msg):self.logger.warning(msg)print(f"[WARNING]{msg}")

🔍 四、检测核心逻辑(detect.py

# detect.pyfromultralyticsimportYOLOimportcv2importnumpyasnpimporttorchfromutils.loggerimportDetectionLoggerclassSafetyHelmetDetector:def__init__(self,model_path,conf=0.5,iou=0.45,device='cuda'):self.model=YOLO(model_path)self.conf=conf self.iou=iou self.device=device self.logger=DetectionLogger()self.classes=['helmet','head']defdetect_image(self,image_path):try:results=self.model(image_path,conf=self.conf,iou=self.iou)result=results[0]boxes=result.boxes.cpu().numpy()names=result.names detections=[]forboxinboxes:x1,y1,x2,y2=map(int,box.xyxy[0])cls_id=int(box.cls[0])conf=float(box.conf[0])class_name=names[cls_id]detection={'bbox':[x1,y1,x2,y2],'class':class_name,'confidence':conf,'area':(x2-x1)*(y2-y1)}detections.append(detection)returndetectionsexceptExceptionase:self.logger.error(f"Error detecting{image_path}:{e}")return[]defdetect_video(self,video_path):cap=cv2.VideoCapture(video_path)frame_count=0whilecap.isOpened():ret,frame=cap.read()ifnotret:breakframe_count+=1results=self.model(frame,conf=self.conf,iou=self.iou)annotated_frame=results[0].plot()yieldannotated_frame,frame_count cap.release()defdetect_camera(self):cap=cv2.VideoCapture(0)whileTrue:ret,frame=cap.read()ifnotret:breakresults=self.model(frame,conf=self.conf,iou=self.iou)annotated_frame=results[0].plot()yieldannotated_frame cap.release()

🖼️ 五、主程序(main.py

# main.pyimportsysimportosfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QLabel,QPushButton,QFileDialog,QVBoxLayout,QWidget,QHBoxLayout,QSlider,QSpinBox,QTextEditfromPyQt5.QtCoreimportQt,QTimerfromPyQt5.QtGuiimportQPixmap,QImageimportcv2importthreadingfromdetectimportSafetyHelmetDetectorfromutils.loggerimportDetectionLoggerimportyamlclassSafetyHelmetApp(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("安全帽识别系统")self.setGeometry(100,100,1200,700)self.detector=Noneself.timer=QTimer()self.camera_running=Falseself.setup_ui()self.load_config()defsetup_ui(self):self.central_widget=QWidget()self.setCentralWidget(self.central_widget)self.layout=QVBoxLayout()# 左侧控制面板left_panel=QWidget()left_layout=QVBoxLayout()# 统计信息self.stats_label=QLabel("戴帽子:0\n未戴帽子:0")self.stats_label.setStyleSheet("font-size: 16px; color: black;")left_layout.addWidget(self.stats_label)# 文件操作按钮btns=["选择图像","加载视频","摄像头检测","批量处理"]self.btns={}forbtn_textinbtns:btn=QPushButton(btn_text)btn.clicked.connect(lambda_,t=btn_text:self.on_button_click(t))left_layout.addWidget(btn)# 检测控制self.start_btn=QPushButton("开始检测")self.start_btn.clicked.connect(self.start_detection)self.stop_btn=QPushButton("停止检测")self.stop_btn.clicked.connect(self.stop_detection)self.stop_btn.setEnabled(False)left_layout.addWidget(self.start_btn)left_layout.addWidget(self.stop_btn)# 置信度滑块self.conf_slider=QSlider(Qt.Horizontal)self.conf_slider.setMinimum(0.1)self.conf_slider.setMaximum(1.0)self.conf_slider.setValue(50)self.conf_slider.setSingleStep(1)self.conf_slider.valueChanged.connect(self.update_confidence)left_layout.addWidget(QLabel("置信度阈值:"))left_layout.addWidget(self.conf_slider)# GPU/CPU 选择self.device_combo=QComboBox()self.device_combo.addItems(["GPU (CUDA)","CPU"])left_layout.addWidget(self.device_combo)# 保存选项self.save_checkboxes={}options=["保存检测结果","保存标注图像","保存处理后视频"]foroptinoptions:cb=QCheckBox(opt)self.save_checkboxes[opt]=cb left_layout.addWidget(cb)left_panel.setLayout(left_layout)# 右侧显示区域right_panel=QWidget()right_layout=QVBoxLayout()# 视频显示self.video_label=QLabel()self.video_label.setAlignment(Qt.AlignCenter)self.video_label.setStyleSheet("border: 2px solid gray;")right_layout.addWidget(self.video_label)# 图像信息self.info_label=QLabel("图像信息:\n文件名:\n尺寸:\n检测数量:")right_layout.addWidget(self.info_label)# 日志输出self.log_text=QTextEdit()self.log_text.setReadOnly(True)right_layout.addWidget(self.log_text)right_panel.setLayout(right_layout)# 主布局split_layout=QHBoxLayout()split_layout.addWidget(left_panel)split_layout.addWidget(right_panel)self.layout.addLayout(split_layout)self.central_widget.setLayout(self.layout)defload_config(self):withopen('config.yaml','r')asf:config=yaml.safe_load(f)self.conf_slider.setValue(int(config['confidence_threshold']*100))self.device_combo.setCurrentText(config['device'])self.detector=SafetyHelmetDetector(model_path=config['model_path'],conf=config['confidence_threshold'],iou=config['iou_threshold'],device=config['device'])defupdate_confidence(self,value):conf=value/100.0self.detector.conf=conf self.log_text.append(f"置信度更新为:{conf:.2f}")defon_button_click(self,button_text):ifbutton_text=="选择图像":file_path,_=QFileDialog.getOpenFileName(self,"选择图像","","Image Files (*.jpg *.jpeg *.png)")iffile_path:self.process_image(file_path)elifbutton_text=="加载视频":file_path,_=QFileDialog.getOpenFileName(self,"选择视频","","Video Files (*.mp4 *.avi)")iffile_path:self.process_video(file_path)elifbutton_text=="摄像头检测":self.start_camera()elifbutton_text=="批量处理":folder_path=QFileDialog.getExistingDirectory(self,"选择文件夹")iffolder_path:self.batch_process(folder_path)defprocess_image(self,image_path):self.log_text.append(f"正在处理图像:{image_path}")detections=self.detector.detect_image(image_path)self.display_detections(detections,image_path)self.update_stats(detections)defprocess_video(self,video_path):self.log_text.append(f"正在处理视频:{video_path}")self.video_label.setText("正在处理视频...")self.timer.timeout.connect(lambda:self.process_video_frame(video_path))self.timer.start(30)defstart_camera(self):ifnotself.camera_running:self.camera_running=Trueself.start_btn.setEnabled(False)self.stop_btn.setEnabled(True)self.timer.timeout.connect(self.capture_camera_frame)self.timer.start(30)self.log_text.append("摄像头检测已启动")defstop_detection(self):self.timer.stop()self.camera_running=Falseself.start_btn.setEnabled(True)self.stop_btn.setEnabled(False)self.log_text.append("检测已停止")defcapture_camera_frame(self):ifself.camera_running:cap=cv2.VideoCapture(0)ret,frame=cap.read()ifret:results=self.detector.model(frame,conf=self.detector.conf,iou=self.detector.iou)annotated_frame=results[0].plot()qimage=QImage(annotated_frame.data,annotated_frame.shape[1],annotated_frame.shape[0],QImage.Format_BGR888)pixmap=QPixmap.fromImage(qimage)self.video_label.setPixmap(pixmap.scaled(800,600,Qt.KeepAspectRatio))cap.release()defdisplay_detections(self,detections,image_path=None):ifnotdetections:return# 提取头和帽子框heads=[dfordindetectionsifd['class']=='head']helmets=[dfordindetectionsifd['class']=='helmet']# 找出未戴帽子的人no_helmet=[]forheadinheads:matched=Falseforhelmetinhelmets:# 简单重叠判断ifself.box_overlap(head['bbox'],helmet['bbox'])>0.3:matched=Truebreakifnotmatched:no_helmet.append(head)# 更新统计self.stats_label.setText(f"戴帽子:{len(helmets)}\n未戴帽子:{len(no_helmet)}")# 在图像上画框img=cv2.imread(image_path)ifimage_pathelseNoneifimgisnotNone:fordindetections:x1,y1,x2,y2=d['bbox']label=d['class']color=(0,255,0)iflabel=='helmet'else(0,0,255)cv2.rectangle(img,(x1,y1),(x2,y2),color,2)cv2.putText(img,f"{label}{d['confidence']:.2f}",(x1,y1-10),cv2.FONT_HERSHEY_SIMPLEX,0.5,color,2)qimage=QImage(img.data,img.shape[1],img.shape[0],QImage.Format_BGR888)pixmap=QPixmap.fromImage(qimage)self.video_label.setPixmap(pixmap.scaled(800,600,Qt.KeepAspectRatio))defbox_overlap(self,box1,box2):x1,y1,x2,y2=box1 x3,y3,x4,y4=box2 dx=min(x2,x4)-max(x1,x3)dy=min(y2,y4)-max(y1,y3)ifdx<0ordy<0:return0returndx*dy/((x2-x1)*(y2-y1))defupdate_stats(self,detections):helmets=[dfordindetectionsifd['class']=='helmet']heads=[dfordindetectionsifd['class']=='head']no_helmet=len(heads)-len(helmets)self.stats_label.setText(f"戴帽子:{len(helmets)}\n未戴帽子:{no_helmet}")defbatch_process(self,folder_path):self.log_text.append(f"开始批量处理文件夹:{folder_path}")files=[fforfinos.listdir(folder_path)iff.lower().endswith(('.jpg','.jpeg','.png'))]forfileinfiles:image_path=os.path.join(folder_path,file)self.process_image(image_path)if__name__=='__main__':app=QApplication(sys.argv)window=SafetyHelmetApp()window.show()sys.exit(app.exec_())

🧪 六、运行说明

  1. 安装依赖
pipinstallultralytics opencv-python pyqt5torch==2.7.1
  1. 准备模型
  • 下载yolov8n.pt或训练自己的安全帽模型
  • 放入./models/helmet.pt
  1. 运行程序
python main.py

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 1:53:32

开源语音合成革命:GPT-SoVITS如何改变行业格局?

开源语音合成革命&#xff1a;GPT-SoVITS如何改变行业格局&#xff1f; 在智能语音助手、虚拟偶像和有声内容爆发的今天&#xff0c;用户不再满足于“能说话”的机器声音——他们想要的是熟悉的声音&#xff0c;是亲人的语调、主播的风格、角色的性格。然而&#xff0c;传统语音…

作者头像 李华
网站建设 2026/4/18 1:52:01

25、Git Rebase:操作指南与应用技巧

Git Rebase:操作指南与应用技巧 1. 利用 git reflog 和 git reset 恢复仓库 在使用 gitk 查看时,你会注意到 new_feature 分支位于 master 分支之上。同时,这两个提交的 SHA1 ID 是不同的,你可以通过以下几种方式来确认: - 在 gitk 中查看。 - 使用 git …

作者头像 李华
网站建设 2026/4/18 3:23:40

Clipy剪贴板神器:让你的复制粘贴效率翻倍提升

Clipy剪贴板神器&#xff1a;让你的复制粘贴效率翻倍提升 【免费下载链接】Clipy Clipboard extension app for macOS. 项目地址: https://gitcode.com/gh_mirrors/cl/Clipy 还在为只能记住最后一次复制内容而烦恼吗&#xff1f;&#x1f914; 作为一款专为macOS设计的剪…

作者头像 李华
网站建设 2026/4/18 3:31:09

一文搞懂流水线冲突:CPU性能提升的“绊脚石”与解决之道

一文搞懂流水线冲突&#xff1a;CPU性能提升的“绊脚石”与解决之道 在计算机体系结构中&#xff0c;流水线技术是CPU提升指令执行效率的核心手段——它就像工厂的生产线&#xff0c;把一条指令的执行拆解成取指、译码、执行、访存、写回等多个阶段&#xff0c;让不同指令的不同…

作者头像 李华
网站建设 2026/4/18 3:33:48

HID描述符结构逐字段解析:图解说明助你掌握细节

深入HID描述符&#xff1a;从枚举到数据报告的底层解密 你有没有遇到过这样的情况&#xff1f;自己精心设计的USB设备插上电脑&#xff0c;系统却提示“未知HID设备”&#xff0c;或者按键乱码、LED不响应&#xff1f;问题很可能就出在那个看似不起眼、只有9字节的 HID描述符…

作者头像 李华
网站建设 2026/4/18 3:37:29

Data-Juicer终极指南:快速掌握大模型数据处理的完整流程

Data-Juicer终极指南&#xff1a;快速掌握大模型数据处理的完整流程 【免费下载链接】data-juicer A one-stop data processing system to make data higher-quality, juicier, and more digestible for LLMs! &#x1f34e; &#x1f34b; &#x1f33d; ➡️ ➡️&#x1f37…

作者头像 李华