资讯详情

基于YOLOv5的安全帽检测系统设计:从数据集标注到Web部署全流程

📅 2026/10/18 13:45:21 | 华诺云谱 👁 阅读
基于YOLOv5的安全帽检测系统设计:从数据集标注到Web部署全流程
1. 毕设选题为什么选安全帽检测不只是为了毕业每年到了毕业设计季总有人来问我选什么题目。我的回答一直很简单如果你想用最少的精力做出一个既能顺利答辩、又能写进简历、还能真正跑起来的深度学习项目安全帽佩戴检测是性价比极高的选择。先说这个题目解决了什么问题。建筑工地、工厂车间、电力检修现场安全帽是保命的东西。但现实中总有工人嫌闷热、嫌麻烦摘了帽子干活。靠人工盯监控几十路画面根本看不过来靠保安巡逻总有无死角。所以用计算机视觉自动识别画面里的人有没有戴安全帽是安监领域一个真实、刚需、可落地的需求。每年各省市公布的安全生产事故通报里高处坠落、物体打击占了很大比例其中相当一部分跟未佩戴安全帽直接相关。这就是这个题目能立项的根本原因——它不是实验室里自嗨的玩具而是有真实应用场景的工程问题。再说为什么适合做毕设。从技术栈上看这个题目覆盖了目标检测的完整链路数据采集与标注、模型选型与训练、推理部署与界面开发。从工作量上看它比图像分类难一档、又比语义分割简单一档难度刚好卡在本科生跳一跳够得着的位置。从答辩角度看它有清晰的需求背景、完整的技术闭环、可演示的界面效果老师问什么都有的讲。从后续价值看这个项目可以直接写进简历换到任何工业视觉检测场景安全帽、反光衣、车辆、火焰思路完全通用。如果你正打算选这个题或者已经选了但不知道接下来怎么推进这篇文章是我把整个项目从零到一做完之后沉淀下来的全部经验选题思路、数据怎么搞、模型怎么选、训练踩过哪些坑、Web端怎么搭、论文怎么写、答辩怎么讲一次讲透。2. 整体方案设计先想清楚再动手能少走一半弯路2.1 技术选型背后的逻辑不是我选他是任务在选安全帽检测本质上是一个目标检测Object Detection任务核心是让模型在图像中找出一类目标——人以及另一类目标——帽子。但这里有个关键细节很多初学者第一次做会搞错你到底要检测几个类别最常见的两种方案方案A检测两个类person人和hat安全帽然后自己做逻辑判断——如果某个人的框里没有匹配的帽子框就判定为未佩戴。方案B训练三类检测器person、hat、no_hat未佩戴的人头直接把未佩戴作为一个独立类别交给模型学习。我最终选的是方案B。原因很简单方案A里人框和帽子框如何匹配这个后处理逻辑非常难写。工人密集时人挤人帽子框可能落在别人的人框里侧身站的时候帽子框只覆盖半个头帽子戴在手上、揣在兜里也会被检测成帽子——这些都会导致误报。而方案B直接把什么人头、什么状态的语义交给模型学推理时拿到no_hat就直接报警简单粗暴、不容易出幺蛾子。实测下来方案B的准确率比方案A高不少尤其人多的场景优势明显。模型选型上我对比了三条路线模型优点缺点适合场景Faster R-CNN精度高经典两阶段论文好写速度慢训练吃显存对实时性没要求、追求论文正统性YOLOv5速度快生态成熟教程多精度需调优版本迭代快绝大多数毕设场景首选EfficientDet精度/速度平衡好配置复杂资料相对少追求极致mAP的选手我选了YOLOv5理由非常务实。第一YOLO系列是工业落地的事实标准面试官认识它第二GitHub上开源权重、教程、预训练模型一应俱全中文资料尤其多遇到问题五分钟就能搜到答案第三它自带的数据增强、多尺度训练、自动锚框计算能省去大量手工调参的体力活对时间有限的毕设党来说太友好了。Faster R-CNN虽然理论更经典但训练一轮几小时迭代一次实验的成本高到让人崩溃除非你导师要求必须用两阶段模型来展示理论深度否则我不推荐。2.2 项目整体架构一条完整的工程链路这个项目虽然叫安全帽检测但要交付的东西不只是一个模型文件。我最终的交付物包括四个部分数据集整理并标注好的安全帽图片集训练集/验证集按比例划分训练代码与权重基于YOLOv5的训练脚本、训练日志、最优权重文件检测服务后端用Flask封装一个HTTP接口接收图片、返回检测结果Web前端界面一个可以上传图片/调摄像头/查看实时画面的浏览器页面为什么非要搭一个前端界面因为毕设答辩时老师不会看你的loss曲线他要看演示。命令行黑框框敲一行python detect.py --source xx.jpg然后弹出一张画了框的图这只能证明你跑通了官方demo。但如果你打开浏览器上传一张工地现场照片页面显示检测到3人其中1人未佩戴安全帽旁边还有报警记录列表——这给老师的直观冲击完全不是一个量级。架构上我用了最简单的三层浏览器 - Flask后端 - YOLOv5推理引擎。不搞微服务、不搞消息队列、不搞Redis缓存。毕设项目的核心目标是能跑、能讲、能演示架构简单不是缺点是优点——你才有精力把每一层做扎实。当然单机Flask扛不住高并发但这是毕设不是双十一。3. 数据集准备这是整个项目真正的重头戏3.1 数据从哪来开源数据集打底真实场景补充很多人一上来就问模型怎么训练但实际做下来你会发现数据集的质量决定了模型的天花板后面所有的调参只是在逼近这个天花板。安全帽检测领域有几份公开数据集可以直接用比如由某研究机构发布的Safety Helmet Wearing Dataset里面包含几万张工地场景的标注图片类别通常就是hat、person、no_hat等。我建议以公开数据集为底子但千万别只用公开集——因为公开集的场景比较单一基本都是固定机位的监控视角背景也集中在工地你拿它训练出来的模型换个场景比如化工厂、仓库效果会明显下降。我的做法是公开数据打底 自采数据补充。自采数据的路子有两条从视频平台搜索工地监控安全帽检查等关键词截取视频帧。注意这些视频不一定都能商用但作为毕业设计的学习研究用途问题不大论文里写明数据来源即可。用手机在真实工地、工厂门口拍摄如果条件允许的话。我拍的时候注意了不同时间段的光线正午强光、傍晚逆光、阴天散射光都要有因为模型对光照变化非常敏感训练集里全是晴天的图模型遇到阴天就懵。最终我的数据集规模是大约6000张图其中公开数据集4500张、自采补充1500张。类别分布上hat的样本数最多person次之no_hat最少。这个不平衡其实符合现实——大多数人还是自觉戴帽子的但no_hat样本少会导致模型没怎么见过不戴帽子的人头召回率偏低。所以我后面专门做了数据增强来补这块。3.2 标注细节决定命运四类常见错误千万别犯标注是整个过程中最枯燥、也最影响结果的环节。我用的标注工具是LabelImg开源免费、操作简单、直接导出YOLO格式的txt文件。这里有几个踩坑经验价值极高坑一类别顺序混淆。LabelImg里如果你先标了hat、再标person那么YOLO的类别编号就按这个顺序来。如果中间你删过一个类别编号会错位。训练前务必检查每个txt文件里的第一个数字是不是正确的类别id否则模型学到的是错乱的信息。我在第一次训练后mAP低得离谱排查半天发现是某一个批次的标注文件类别编号整体错了。坑二遮挡和截断物体的标注边界。工地监控里人经常被脚手架、卡车挡住一半。这种样本要不要标答案是只要人能看出来是什么就要标。人的身体被挡住一半但头部完整可见照样要框出来。因为真实场景中遮挡是常态如果你只在干净图上训练模型到了真实环境直接废。但反过来一个只露出半张脸、连你自己都犹豫这算人还是不算的极小目标该舍弃就舍弃标注一致性比数量重要得多。坑三安全帽的戴和拿不要手工硬分类。有人戴帽、有人拿帽、有人把帽挂腰上。方案B的思路里戴帽的人头归hat没戴帽的人头归no_hat但拿在手里的帽子应该标什么我的做法是如果你能明确看出帽子在头上标hat并把人头一起框进去帽子拿手上、挂身上在画面里够大够清晰就单独标一个hat这时候它确实是一个可检测的帽子目标但如果很小很模糊干脆跳过不标。不要人为地去给模型设计拿着的帽子要忽略不看这种规则模型学不会的。坑四图片分辨率差异。监控截图分辨率可能高达1920x1080手机拍的可能是4032x3024而YOLOv5训练时默认会把图resize到640x640。大分辨率图里的安全帽可能只有30x20像素resize之后细节丢失严重。我的处理是在标注时就对超大图做了滑窗裁剪把一张1080p的图切成左上、右上、左下、右下四块分别标注等于变相增加了样本量小目标的检测效果立竿见影。3.3 数据增强花最小代价让模型泛化能力翻倍YOLOv5自带了一整套数据增强策略包括马赛克增强Mosaic、随机翻转、HSV色域变换、随机缩放等。Mosaic这个增强非常凶猛把4张图拼成一张相当于每次训练迭代能看到4张图的上下文信息小目标检测能力大幅提升。但默认增强参数并不一定适合你的场景。我具体调整了几个地方工地场景经常是灰蒙蒙的对比度低所以我把HSV增强的饱和度扰动范围调大了让模型见过更多褪色的图避免对鲜艳颜色过拟合。关闭了随机擦除Random Erase吗没有反而把擦除概率调高了。因为现实中安全帽经常被脚手架遮住一部分让模型学会只看一半帽子也能认出来这个能力在真实场景太重要了。垂直翻转flipud我关掉了。工地监控摄像头都是水平安装的从来没有倒立的画面垂直翻转只会让模型学习无效的视角。4. 模型训练全流程从环境搭建到权重出炉4.1 环境配置用现成轮子别从零造YOLOv5的官方仓库提供了非常完整的训练、验证、导出脚本我建议直接基于官方仓库做二次开发而不是自己写网络结构。这不是偷懒是工程常识——官方代码经过大量用户验证bug少、文档全你有精力应该花在数据、调参和工程化上而不是重新实现一个SPP或FPN。环境版本方面给我最深刻的教训是版本对齐。我最开始用PyTorch 2.0 CUDA 11.8 某老版本YOLOv5某天踩到一个算子兼容性报错网上搜了一圈发现是版本太新导致某个依赖变化。后来我干脆按官方README里标注的依赖版本重新建了一个虚拟环境一次通过。说直白一点YOLOv5各版本的依赖是严格搭配的不要自行混合搭配最新版组件。训练硬件方面如果你有NVIDIA显卡建议8GB显存以上本地训练没问题。没有的话用云端GPU实例按小时付费一个完整的训练跑下来也就几十块钱比本地折腾驱动省心得多。4.2 训练参数设置每个参数我都踩过坑我最终的训练命令长这样python train.py --data helmet.yaml --weights yolov5s.pt \ --batch-size 16 --epochs 100 --img 640 \ --device 0 --workers 4 --cos-lr逐项解释一下这些参数不是随便填的--weights yolov5s.pt预训练权重这一点非常重要。如果从头训练--weights 模型收敛极慢100个epoch可能mAP只有50但如果加载在COCO上预训练好的权重模型已经看过海量通用物体迁移到安全帽这种特定任务上只需要微调60个epoch就能到不错的水平。你甚至可以换个更大一点的backbone试试yolov5m精度会再提一点代价是速度下降。--batch-size 16这个受显存限制。8GB显存搭配640分辨率图batch设为16是YOLOv5s的安全线。如果显存不够报OOM调小到8或4但注意batch太小会导致BatchNorm统计不准确模型训练不稳定。我实测batch2时loss曲线像心跳一样剧烈震荡。--epochs 100官方默认是300但毕设场景100完全够。我的经验是60个epoch后mAP基本稳定后面是平台期。当然你要在论文里展示随着训练轮数增加mAP上升的曲线100个epoch能画出好看的收敛图。--img 640YOLOv5训练时用的输入分辨率。用640是精度和速度的平衡点。试过1280分辨率mAP确实涨了2到3个点但训练时间翻倍、推理速度腰斩对于毕设来说性价比不高。--cos-lr使用余弦退火学习率调度。这个改动让收敛更平滑mAP最后比固定学习率高出1个点左右属于零成本白捡的优化。训练过程中我还做了一件事开启训练可视化。YOLOv5会生成TensorBoard日志和结果图每次epoch结束后的验证集mAP、Precision、Recall以及PR曲线、混淆矩阵都会自动输出。这些图表请务必保留论文里需要它们撑场面。4.3 模型选型s还是m还是lYOLOv5有n/s/m/l/x五个规模参数从几百万到几千万不等。毕设怎么选我的测试数据同样是6000张图训练100个epochYOLOv5smAP 50约0.79单张推理35ms模型14MBYOLOv5mmAP 50约0.83单张推理55ms模型40MBYOLOv5lmAP 50约0.85单张推理90ms模型90MB对于毕设来说我最终选了YOLOv5s做主要方案用YOLOv5m做了对比实验。理由s跑得最快、最轻量部署到无GPU的机器上做CPU推理也够用m的精度提升其实有限但可以作为论文里模型选择与优化章节的对照组。l的精度提升可观但推理速度对演示场景来说太拖沓用不用看个人选择。5. 推理与部署让模型从能跑到好用5.1 模型导出与优化ONNX这一步很重要训练完成后得到的权重是PyTorch格式.pt。直接拿来部署当然可以但我建议导出为ONNX格式这是部署层面的最佳实践。原因有二第一ONNX是个开放格式以后想换推理框架比如ONNX Runtime、TensorRT都不用重新训练第二在CPU环境下ONNX Runtime比PyTorch原生推理快不少而且不用装那个巨大无比的PyTorch包。导出命令很简单python export.py --weights runs/train/exp/weights/best.pt --include onnx导出后建议用onnxsimplifier做一次图优化能砍掉一些冗余算子文件变小、推理变快。我用ONNX Runtime在纯CPU机器上测试单张640x640图片推理时间大约120~150ms做实时视频流检测略显吃力但做单帧上传检测完全够用。5.2 后端接口封装Flask十行代码搞定我用Flask写了一个极简的HTTP服务。核心逻辑就三步接收前端上传的图片 - 跑ONNX推理 - 把检测结果类别、坐标、置信度转成JSON返回。这里有个我很看重的细节返回的JSON里对每个person框要做一个有没有帽子的二次判断。前面提到我用了方案B直接检测no_hat类但实际推理时我仍然检测三个类然后在业务层做一次匹配如果人框附近有hat框且IOU超过一个阈值就判定安全如果人框附近有no_hat框判定危险。这样做的好处是前端可以区分显示绿色安全和红色报警演示效果更丰富。业务层判定的逻辑大致是遍历所有person框对每个person框检查所有hat框和no_hat框的中心点是否落在person框内我用中心点判断而不是IOU因为帽子框通常比人框小得多IOU阈值不好设。def check_safety(person_box, hat_boxes, nohat_boxes): px1, py1, px2, py2 person_box pcx, pcy (px1 px2) / 2, (py1 py2) / 2 for hx1, hy1, hx2, hy2 in hat_boxes: if hx1 pcx hx2 and hy1 pcy hy2: return True for nx1, ny1, nx2, ny2 in nohat_boxes: if nx1 pcx nx2 and ny1 pcy ny2: return False return None # 无法判定5.3 Web前端再加一个摄像头实时检测前端界面用HTML JavaScript实现界面很简单一个上传按钮、一个视频展示区、一个结果列表。上传图片后前端把图片POST到后端拿到JSON结果后用Canvas在图片上画框戴帽子的画绿色框没戴的画红色框。光是上传图片我觉得演示效果还不够所以加了一个摄像头实时检测模式。实现方式是浏览器调getUserMedia获取摄像头流每300毫秒截一帧送到后端检测再把结果画回来。这个功能在答辩现场效果炸裂——没有任何评委能拒绝对着摄像头摇一摇屏幕上实时标记出你有没有戴帽子的互动演示。这里有个前端性能优化的小细节不要每帧都调用后端因为300ms一帧已经比推理速度快了帧数再多纯粹浪费。另外视频流模式下我刻意做了降采样把视频帧压缩到480p再送检推理速度提升一倍以上精度损失肉眼几乎不可见。6. 论文写作与答辩准备怎么让80分的项目讲出100分的效果6.1 论文章节结构与写作策略很多同学技术做得很好论文却写得很痛苦。我的经验是*论文的骨架从你选题那一天就该定下来而不是最后半个月硬憋。我的章节结构供参考第1章绪论课题背景与意义安全生产形势、国内外研究现状目标检测发展综述第2章相关技术CNN基础、YOLO系列原理讲解第3章系统设计数据集构建、模型选型、系统架构第4章系统实现训练过程、参数配置、界面展示第5章实验与分析评价指标mAP、Precision、Recall、对比实验YOLOv5s vs m vs l、消融实验不同数据增强的影响第6章总结与展望写作上最关键的技巧是实验结果先写理论章节后写。因为理论部分可以看图说话——你把YOLO的架构图一放照着论文的结构解释每个模块写作难度低很多。而实验部分必须基于真实数据这个是编不出来的。另外导师最反感什么反感参考文献是随便从知网搬运的、跟正文对不上的论文。我用的方法是每引用一篇文献在正文中必须有一句话明确说明它的贡献某学者提出了XX方法该方法解决了XX问题而不是末尾堆一堆文献列表假装读过。6.2 答辩演示的四个关键节奏千万、千万不要在答辩时现场跑训练训练过程跑两小时老师能等吗我见过有人在答辩现场打开Jupyter Notebook打算跑训练脚本结果等待期间冷场了十分钟场面极其尴尬。演示顺序应该是先展示Web界面上传图片检测的效果30秒内出结果稳再展示摄像头实时检测互动性好吸引注意力展示训练过程的图表loss曲线、PR曲线、mAP曲线最后放一段现场检测的视频片段如果有的话没有就用带标注的图片集每一步都要提前准备好备选素材。我曾经在某次预讲时摄像头检测突然不亮浏览器权限问题幸好提前录了一段demo视频直接用播放器放全程无冷场。这条经验值大半个学分。专家提问环节会被问到什么最常见的问题有你用的YOLOv5和Faster R-CNN有什么区别背熟两阶段与单阶段的区别你的模型在什么场景下会误检或漏检想好2个真实失败案例说出原因和改进思路——这个诚实回答比硬吹效果好得多有没有考虑部署到边缘设备回答可以用TensorRT或OpenVINO做加速量化到INT8这是一条拓展思路你的数据集是怎么来的标注规范是什么数据集来源、标注工具、标注原则要能流利说出7. 踩坑实录这十个问题我恨不得提前知道整个项目做下来我记录了一批最典型的问题和对应的解决方案。整理成速查表希望后人少走弯路1. 训练时loss出现NaN或无穷大。原因通常是学习率太大或者某些批次数据有问题如全黑图。解决调小学习率检查数据集中有没有空白损坏图片。2. 检测结果框全是一团糊无法区分类别。大概率是标注文件的类别id和yaml配置的类别顺序对不上。检查data/helmet.yaml里的names列表顺序。3. mAP很高但实测视频效果差。数据集和测试场景差异太大。改进向原始数据集补充你实际部署场景的图片。4. 摄像头推理延迟高。原因有两个一是模型太大换YOLOv5s二是传输原图太大前端压缩到480p再送检。5. 训练到一半CUDA out of memory。降batch-size同时降低--workers数量。另外关闭其他占显存的程序。6. 检测结果在图片边缘不画框。YOLO输出的坐标做了归一化0~1前端画框计算像素坐标时要乘对应的图像宽高。7. 界面显示成功但检测结果为空。先在后端单独打印检测结果确认是后端返回空还是前端解析失败。可以用Postman直接调接口测。8. 某些正午强光下的安全帽检不出来。光照导致颜色失真。在数据增强里加大HSV色彩扰动专门补几张强光场景的图。9. 人很密集时漏检严重。调低检测置信度阈值--conf-thres 默认0.25可以降到0.15同时检查NMS的IOU阈值。密集场景建议把NMS的IOU阈值从0.45调到0.3减少重叠框的误删。10. 论文里需要统计指标但训练过程没保存日志。YOLOv5默认会把每次epoch的mAP、loss都存到runs/train/exp*/results.csv里。没保存的补救方案重新用val.py跑一次验证也能得到最终指标。8. 最后说几句掏心窝的话如果让我重新做一遍这个毕设我会把更多时间花在数据集打磨上。技术上YOLOv5就是那个工具箱真正拉开差距的是你喂给它的数据长什么样。我第一次训练完mAP就到了0.7觉得我行了结果去复议数据才发现一堆标注错误和类别混淆把数据修干净之后mAP直接跳到0.79。模型能给你多少上限数据就决定了你能摸到多高。另外记录的习惯很重要。从第一天开始把每次实验的数据集版本、参数配置、结果指标记到一个简单的表格里。论文写作和答辩时你会发现这些记录比任何灵感都值钱——老师们总是喜欢那些能清楚说出第几次实验改了哪个参数、涨了多少个点的学生。最后再分享一个小技巧。如果答辩时间允许在结尾放一个项目后续展望页简单说说你会怎么把这个系统做进一个边缘计算盒子、或者跟工地门禁联动。这页不需要太多字但能给评委留下你还能做得更深的印象。毕设的分数不会只看你完成了什么也会看你展示了多大的潜力空间。希望这篇经验分享能帮你少踩几个坑顺顺利利搞定这份毕设。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑