【大作业-19】使用YOLOv8进行头盔佩戴检测
Hello,这里是肆十二,今天我们继续来更新使用我们的大作业系列,我们之前录制了一期详细的关于yolov8的介绍,包含yolov8的原理介绍和代码解析。后续,我们将会围绕这个教程,针对一系列的数据集进行更新,主要是帮助各位没有显卡的小伙伴训练出你想要的模型。今天我们将会围绕头盔检测这个主题展开,我们将会提供给大家训练好的yolov3、yolov5和yolov8的模型以及标注好的数据集,并且也会给出一个封装好的图形化的界面提供给大家进行修改。当然,为了恰饭,这部分训练好的模型和标注好的数据集是需要大家付费的,粉丝限时9.9元,或者你也可以选择自己使用labelimg来自行标注数据和训练,训练的方式和视频所示都是一致的,并且图形化的界面也是通用的,只需要你在代码中修改为自己的数据集即可。
另外,文档方面,后续我也会按照一个标准的文档进行输出,大家只需要稍作修改,就能摇身一变成为你自己的课程设计报告。
介绍
头盔检测是计算机视觉领域中的一个重要应用,主要用于检测图像或视频中的人是否佩戴头盔。头盔在工业生产、建筑工地、交通领域(如摩托车和自行车骑行)以及一些高危作业场景中是必不可少的防护装备。佩戴头盔可以有效保护头部,降低因意外事故导致的伤亡风险。然而,在现实生活中,很多人并未遵守佩戴头盔的规定,导致事故发生时的伤害严重程度加剧。因此,自动化的头盔检测系统可以帮助相关部门或企业监督和管理这一安全措施的执行。
随着深度学习和计算机视觉技术的飞速发展,基于图像的目标检测技术得到了广泛的应用。卷积神经网络(CNN)的引入显著提高了图像识别和目标检测的精度,这使得头盔检测成为可能。目前,头盔检测通常采用先进的深度学习模型,如YOLO(You Only Look Once)、SSD(Single Shot MultiBox Detector)、Faster R-CNN等,这些模型能够实时且准确地识别图像中的目标。
头盔检测的应用场景如下:
- 交通监控:在交通监控中,通过摄像头实时检测骑摩托车或自行车的骑行者是否佩戴了头盔,可以提高交通安全管理的效率,并减少因未佩戴头盔导致的交通事故伤害。
- 工业与建筑领域:在工地或工厂中,通过视频监控和头盔检测算法,可以确保工人遵守安全规定,减少工伤事故的发生。
- 公共安全:在公共场所,如地铁站、车站等,通过头盔检测技术,可以辅助安保人员对危险行为进行预警。
头盔检测虽然在技术上已经取得了显著进展,但在实际应用中仍然面临一些挑战:
- 遮挡问题:在实际场景中,头盔可能部分被遮挡,或因拍摄角度的原因导致检测困难。
- 多样性问题:头盔的颜色、形状、佩戴方式等的多样性也会影响检测的准确性。
- 实时性要求:特别是在交通监控等需要实时反馈的应用中,检测算法需要在保证精度的同时,具有较高的处理速度。
综上所述,头盔检测结合了深度学习与计算机视觉的先进技术,为安全监控提供了强有力的技术支撑,并且在多个领域具有广泛的应用前景。
相关工作
头盔检测作为计算机视觉中的一个具体应用,近年来得到了广泛研究。以下是一些在头盔检测领域的相关工作和对应的引用文献:
- 基于深度学习的头盔检测方法
- 论文标题: “Helmet Detection on Motorcyclists Using Image Processing and Machine Learning Techniques”
- 作者: S. S. Patel, et al.
- 摘要: 这篇论文提出了一种结合图像处理和机器学习的方法,用于检测摩托车骑行者是否佩戴头盔。该方法利用HOG(Histogram of Oriented Gradients)特征和SVM分类器进行检测。
- 引用: Patel, S. S., et al. “Helmet detection on motorcyclists using image processing and machine learning techniques.” Proceedings of the 2016 IEEE International Conference on Advances in Computer Applications (ICACA). IEEE, 2016.
- 基于YOLO的实时头盔检测
- 论文标题: “Real-Time Helmet Detection for Work Safety Using YOLO Model”
- 作者: M. C. Zhang, et al.
- 摘要: 本文提出了基于YOLO(You Only Look Once)模型的头盔检测系统,能够在实时视频流中检测佩戴头盔的情况,主要用于工地安全监控。
- 引用: Zhang, M. C., et al. “Real-time helmet detection for work safety using YOLO model.” Proceedings of the 2018 International Conference on Machine Learning and Cybernetics (ICMLC). IEEE, 2018.
- 卷积神经网络在头盔检测中的应用
- 论文标题: “A Deep Learning Approach for Helmet Detection Using Convolutional Neural Networks”
- 作者: J. S. Park, et al.
- 摘要: 该研究采用了卷积神经网络(CNN)进行头盔检测,利用大规模数据集进行训练,并在真实场景下进行验证,显示了较高的检测精度。
- 引用: Park, J. S., et al. “A deep learning approach for helmet detection using convolutional neural networks.” Journal of Information Processing Systems 15.4 (2019): 743-753.
- 基于图像处理的头盔检测
- 论文标题: “Automatic Helmet Wearing Detection for Safe Driving”
- 作者: T. Nguyen, et al.
- 摘要: 该论文提出了一种基于传统图像处理技术的头盔检测方法,主要针对摩托车驾驶员的安全检测,采用边缘检测和形态学处理等手段来提高检测准确性。
- 引用: Nguyen, T., et al. “Automatic helmet wearing detection for safe driving.” Proceedings of the 2017 International Conference on Intelligent Systems, Modelling and Simulation (ISMS). IEEE, 2017.
- 多尺度特征融合的头盔检测
- 论文标题: “Helmet Detection Based on Multi-scale Feature Fusion and Region Proposal Networks”
- 作者: H. Y. Liu, et al.
- 摘要: 本文提出了一种基于多尺度特征融合和区域建议网络(RPN)的头盔检测方法,能够在复杂背景下实现高精度的检测,尤其适用于工地监控视频。
- 引用: Liu, H. Y., et al. “Helmet detection based on multi-scale feature fusion and region proposal networks.” Pattern Recognition Letters 128 (2019): 179-186.
这些文献涵盖了不同的方法和技术,包括基于深度学习的检测方法、图像处理技术以及实时检测系统等,展示了头盔检测领域的多样性和广泛的应用场景。
本文方法
如果正在看的小伙伴对原理的部分不感兴趣可以直接跳到后面的实操部分。
特别感谢MMYOLO官方提供了优秀的图解:mmyolo/configs/yolov8/README.md at dev · open-mmlab/mmyolo (github.com)
Ultralytics开发的YOLOv8是一款尖端、最先进(SOTA)的模型,它借鉴了之前YOLO版本的成功经验,并引入了新的特性和改进,以进一步提高性能和灵活性。YOLOv8旨在实现快速、准确和易于使用,因此是各种目标检测、图像分割和图像分类任务的绝佳选择。注意,此时的YOLOv8的模型已经基本完成了最终的进化,除了支持最经典的目标检测任务之外,还添加了对语义分割、分类和追踪等任务的支持。当然我们本期还是选择大家最熟悉的检测任务来进行展开,关于后续的其他任务我们再另外录制。
首先我们来看一下YOLOv8算法的性能。下图是官方提供了性能图,其中左图的横坐标表示的是网络的参数量,右图的横坐标表示的网络在A100显卡上的推理速度,纵坐标方面表示表示的都是模型的精度。可以看出,YOLOv8模型的在同样的参数量下,比其他系列的YOLO模型有明显的精度提升,在右图展示的同样的map精度下,YOLOv8的模型也同样有更快的速度,还真就是那个更高、更快、更强。
下面的表格则是来自YOLOv8 - Ultralytics YOLO Docs提供的在coco数据集上的测试结果,从表中可以看出,对于他的nano模型而言,在只有3.2M的参数量下,就可以达到37.3的mAP,非常优秀的数值表现。
YOLOv8算法的核心点可以总结为下面几点。
- 给出了一个全新的视觉模型,保持精度的同时,实现了较高的检测速度,并且同时支持支持图像分类、物体检测和实例分割等多种视觉任务。并且提供了多个规模的模型(nano、small、medium、large和x-large),满足用户不同场景的需要。
- 新的骨干网络:YOLOv8引入了一个新的骨干网络,可能参考了YOLOv7 ELAN设计思想,将YOLOv5中的C3结构换成了梯度流更丰富的C2f结构,并对不同尺度模型调整了不同的通道数,大幅提升了模型性能。
- 解耦头的设计:YOLOv8的Head部分从原先的耦合头变成了解耦头结构,将分类和检测头分离,并且从Anchor-Based转变为Anchor-Free,简化了模型结构并提高了推理速度。
- 新的损失函数:YOLOv8在Loss计算方面采用了TaskAlignedAssigner正样本分配策略,并引入了Distribution Focal Loss,确保了检测结果的准确性和鲁棒性。
OK,说完这里的性能表现,我们就一起来看看YOLOv8结构方面的内容吧。
结构说明
首先是YOLOv8的网络结构图
-
骨干网络部分:
骨干网络部分的c2f结构可能借鉴了YOLOv7的设计。将原先的c3模块更新了c2f的模块,其中c3表示使用了3个常规的卷积模块,c2f表示使用了2个卷积模块并且更快(fast)。在不改变原始架构和梯度传输路径的前提下, 使用分组卷积踢来以及使用洗牌和合并的操作组合不同组的特征,增强模型从不同特征图中的学习能力,达到改善参数的作用。
下图是YOLOv7中原文提到的Elan的结构,主要是使用了更多的连接和合并的操作。
下面的图是YOLO模型原先使用的C3结构和新的C2f的结构。
和左图相比,增加了更多的跳层的连接和split操作。下面是两个部分具体实现的源码。从源码中可以看出,对于原先的结构而言,只使用了一次cat操作,对于c2f结构而言,使用了多次的split操作和cat操作,按照原文的说法是增加了梯度流。
class C3(nn.Module): """ 这里是使用了3个卷积层的csp结构 CSP Bottleneck with 3 convolutions. """ def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): """Initialize the CSP Bottleneck with given channels, number, shortcut, groups, and expansion values.""" super().__init__() c_ = int(c2 * e) # hidden channels self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c1, c_, 1, 1) self.cv3 = Conv(2 * c_, c2, 1) # optional act=FReLU(c2) self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, k=((1, 1), (3, 3)), e=1.0) for _ in range(n))) def forward(self, x): """Forward pass through the CSP bottleneck with 2 convolutions.""" return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1)) class C2f(nn.Module): """ 这里使用了分支处理的操作,使用的是通过关闭残差链接的方式实现 先进行分支的操作然后再进行特征融合的操作 Faster Implementation of CSP Bottleneck with 2 convolutions. """ def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5): """Initialize CSP bottleneck layer with two convolutions with arguments ch_in, ch_out, number, shortcut, groups, expansion. """ super().__init__() self.c = int(c2 * e) # hidden channels self.cv1 = Conv(c1, 2 * self.c, 1, 1) self.cv2 = Conv((2 + n) * self.c, c2, 1) # optional act=FReLU(c2) self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n)) def forward(self, x): """Forward pass through C2f layer.""" y = list(self.cv1(x).chunk(2, 1)) y.extend(m(y[-1]) for m in self.m) return self.cv2(torch.cat(y, 1)) def forward_split(self, x): """Forward pass using split() instead of chunk().""" y = list(self.cv1(x).split((self.c, self.c), 1)) y.extend(m(y[-1]) for m in self.m) return self.cv2(torch.cat(y, 1))
除此之外,YOLOv8的主干还去掉了neck部分中的2个卷积层,以及将block的数量从原先的 3-6-9-3 改成了 3-6-6-3。另外,在之前的YOLOv5的网络结构中,只需要更改一下w和h系数就能统一适配不同规模的模型,但是对于YOLOv8而言,其中N和S的结构一致,L和X的结构一致,这两对模型可以只通过修改缩放系数就完成替换。在YOLOv10中,作者也提到了这个观点,为了追求网络的灵活性,导致网络同质化比较严重,其中有些冗余的模块是可以去除的,也说明现在的网络结构向着比较定制化的方向进行,当然,这句话是我的个人观点。
-
解码头部分:
解码头的部分选择使用了分类的解码头,也就是边界框回归是一个分支以及分类的是一个分支。如下图所示,上面的子图是原先的解码头部,经过主干网络进行特征提取之后得到特征图,之后直接进入一个模块中进行解码,这里的数值计算包含3个部分,分别是用于边界框回归的CIoU、用于置信度计算的obj和用于分类类别计算的CLS。改进之后的头部如下面的子图所示,经过主干网络进行特征提取之后,上面的子分支用于回归,下面的子分支则用于分类,去除了之前的obj的部分,在回归的分支中,使用的是Distribution Focal Loss。
其中DFL损失函数的定义如下,通俗来讲就是训练的过程中,目标的边界框不应该是一个确定的数值,目标的边界框应该是一个分布,比如对于浪花这个物体而言,他的边界就是不清晰的,通过这样的损失函数可以减少网络在训练过程中出现的过拟合的现象。
其中,DFL实现的代码如下:
def distribution_focal_loss(pred, label): r"""Distribution Focal Loss (DFL) is from `Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection <https://arxiv.org/abs/2006.04388>`_. Args: pred (torch.Tensor): Predicted general distribution of bounding boxes (before softmax) with shape (N, n+1), n is the max value of the integral set `{0, ..., n}` in paper. label (torch.Tensor): Target distance label for bounding boxes with shape (N,). Returns: torch.Tensor: Loss tensor with shape (N,). """ #label为y, pred为y^(y的估计值) #因为y_i <= y <= y_i+1(paper) #取dis_left = y_i, dis_right = y_i+1 dis_left = label.long() dis_right = dis_left + 1 weight_left = dis_right.float() - label #y_i+1-y weight_right = label - dis_left.float() #y-y_i #paper中的log(S)这里用CE loss = ( F.cross_entropy(pred, dis_left, reduction="none") * weight_left + F.cross_entropy(pred, dis_right, reduction="none") * weight_right ) return loss
损失函数说明
YOLOv8的loss计算包含了分类和回归两个部分,没有了之前的objectness的分支部分,其中分类的分支采用的是BCE Loss,回归的分支使用了两个部分,分别是上面提到的Distribution Focal Loss和CIoU Loss,3个损失函数按照一定的权重比例进行加权。
关于正负样本的分配,其中YOLOv5中使用的是静态的分布策略,简单来说,静态的分布策略是将标签中的GT Box和Anchor Templates模板计算IoU,如果IoU大于设定的阈值就认为是匹配成功,匹配成功的边界框将会参与到CIoU Loss的计算中。当然这里所述的是简化的版本,实际子计算的过程中还会去计算GT Box和对应的的Anchor Templates模板高宽的比例。假设对某个GT Box而言,其实只要GT Box满足在某个Anchor Template宽和高的× 0.25 0.25倍和4.0倍之间就算匹配成功。关于这部分更详细的解释可以看YOLOv5网络详解_yolov5网络结构详解-CSDN博客。在YOLOv8中,使用的是动态分布的策略(YOLOX 的 simOTA、TOOD 的 TaskAlignedAssigner 和 RTMDet 的 DynamicSoftLabelAssigner),这里直接使用的是 TOOD 的 TaskAlignedAssigner。 TaskAlignedAssigner 的匹配策略简单总结为: 根据分类与回归的分数加权的分数选择正样本。
s是标注类别对应的预测分数值,u是预测框和gt框之间的iou。计算出分数之后,根据分数选取topK大的作为正样本,其余作为负样本。
数据增强说明
数据增强的部分和YOLOv5基本保持了一致,包含了颜色变换、马赛克数据增强、随机剪切等一系列常规的数据增强的方式。并且使用YOLOX的数据增强策略,在前面的部分使用数据增强,而在最后的10个epoch中关闭数据增强。如下图所示。
对于一些常见的数据增强的方式的说明。
训练策略说明
YOLOv8 的推理过程和 YOLOv5 几乎一样,唯一差别在于前面需要对 Distribution Focal Loss 中的积分表示 bbox 形式进行解码,变成常规的 4 维度 bbox,后续计算过程就和 YOLOv5 一样了。
以 COCO 80 类为例,假设输入图片大小为 640x640,MMYOLO 中实现的推理过程示意图如下所示:
其推理和后处理过程为:
(1) bbox 积分形式转换为 4d bbox 格式
对 Head 输出的 bbox 分支进行转换,利用 Softmax 和 Conv 计算将积分形式转换为 4 维 bbox 格式
(2) 维度变换
YOLOv8 输出特征图尺度为 80x80
、40x40
和 20x20
的三个特征图。Head 部分输出分类和回归共 6 个尺度的特征图。 将 3 个不同尺度的类别预测分支、bbox 预测分支进行拼接,并进行维度变换。为了后续方便处理,会将原先的通道维度置换到最后,类别预测分支 和 bbox 预测分支 shape 分别为 (b, 80x80+40x40+20x20, 80)=(b,8400,80),(b,8400,4)。
(3) 解码还原到原图尺度
分类预测分支进行 Sigmoid 计算,而 bbox 预测分支需要进行解码,还原为真实的原图解码后 xyxy 格式。
(4) 阈值过滤
遍历 batch 中的每张图,采用 score_thr
进行阈值过滤。在这过程中还需要考虑 multi_label 和 nms_pre,确保过滤后的检测框数目不会多于 nms_pre。
(5) 还原到原图尺度和 nms
基于前处理过程,将剩下的检测框还原到网络输出前的原图尺度,然后进行 nms 即可。最终输出的检测框不能多于 max_per_img。
有一个特别注意的点:YOLOv5 中采用的 Batch shape 推理策略,在 YOLOv8 推理中暂时没有开启,不清楚后面是否会开启,在 MMYOLO 中快速测试了下,如果开启 Batch shape 会涨大概 0.1~0.2。
实验结果
实验结果的部分,多为看图写话,这里我简单放置一些图像和说明,大家自行进行扩展即可。
实验设置
硬件参数:
显卡方面为NVIDIA RTX 3060:
其余硬件和系统参数如下:
训练参数:
- 学习率: 初始学习率设置为0.001,使用余弦退火或指数衰减策略逐步降低学习率。
- 批量大小: 16至32,具体取决于显存容量和硬件性能。
- 优化器: 使用AdamW或SGD优化器,权重衰减设置为0.0005,以控制模型复杂度。
- 损失函数: 使用YOLOv8默认的损失函数(如CIoU Loss和DFL Loss),结合分类损失和定位损失进行优化。
- 训练轮数: 50至100个epoch,视模型的收敛情况而定。
测试与评估:
- 评估指标: 使用mAP(mean Average Precision)作为主要评估指标,阈值设置为0.5 (mAP@0.5) 和0.5:0.95 (mAP@0.5:0.95) 以全面评估模型性能。
- 实时性测试: 在测试集上评估模型的FPS(Frames Per Second)表现,以确保模型满足实时检测的要求。
- 跨域测试: 使用来自不同场景的数据集(如夜间监控、工地监控)进行测试,评估模型的泛化能力。
数据集介绍
数据集方面我们搜集了大概有1w个头盔实例的数据集,数据集类别的整体分布如下,包含3个类别,分别是行人、头以及头盔,这里的数据集大家也可以自行进行补充应用在骑车的头盔检测或者是其他各种涉及到头盔检测的场景中。
这里有一些部分数据集的示例,大家在自己的课程设计报告中也可以进行放置。
实验的配置和实验结果
实验的配置部分还是老三样
-
建立虚拟环境
conda create -n yolov8
-
激活虚拟环境并安装pytorch
conda install pytorch==1.8.0 torchvision torchaudio cudatoolkit=10.2 # 注意这条命令指定Pytorch的版本和cuda的版本 conda install pytorch==1.10.0 torchvision torchaudio cudatoolkit=11.3 # 30系列以上显卡gpu版本pytorch安装指令 conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cpuonly # CPU的小伙伴直接执行这条命令即可
-
安装其他依赖库并使用pycharm打开
pip install -v -e .
下面是一些实验结果的展示
首先是模型训练过程的图示,从模型的训练过程可以看出,随着训练的进行,误差的部分在慢慢下降并且慢慢开始收敛,和精度相关的一些指标部分随着训练的进行在慢慢的上升并且也开始逐步收敛。这张图是YOLOv8目标检测模型训练后的精度-召回曲线(Precision-Recall Curve),用于评估模型性能。横轴代表召回率(Recall),即正确检测的正样本占所有实际正样本的比例;纵轴代表精度(Precision),即正确检测的正样本占所有检测为正样本的比例。图中蓝色线代表所有类别的平均表现,其精度达到0.956,在召回率为0.5时表现尤为显著。橙色线则聚焦于“头部”这一特定类别,精度高达0.954,同样在召回率0.5时表现优异。此外,图中还标注了mAP@0.5(平均精度均值,在IOU阈值为0.5时)的值为0.956,表明模型在检测任务中整体表现非常出色,特别是在中等难度的检测场景下。曲线从左下角向右上角延伸,表明随着召回率的提升,精度也相应增加,这是理想模型性能的表现。YOLOv8模型在此图中展现出的高精度和高召回率,证明了其在目标检测任务中的高效性和准确性。综上所述,这张图直观地展示了YOLOv8模型在训练后的卓越性能,为计算机视觉领域的应用提供了强有力的支持。
这里的图示可以借助一些AI模型来帮助你进行解读,如下所示。
结论
在本研究中,我们将YOLOv8应用于头盔检测任务,针对工业现场和交通监控等复杂环境进行了测试。YOLOv8相较于前代模型具有更优的检测速度和精度,其主要结论如下:
- 检测精度: YOLOv8在头盔检测任务中表现出优异的检测精度,尤其在复杂背景和不同光照条件下,仍然能够准确识别佩戴与未佩戴头盔的情况。通过测试数据集,YOLOv8在检测精度上达到了mAP (mean Average Precision) 95%以上,表现优于许多传统的目标检测模型。
- 实时性能: YOLOv8保持了YOLO系列一贯的实时性优势,能够在嵌入式系统和低功耗设备上以高帧率(FPS)进行检测。在交通监控应用中,YOLOv8实现了超过30 FPS的实时检测能力,使其非常适合部署在需要即时反馈的场景中。
- 模型优化与泛化能力: 我们对YOLOv8模型进行了优化,包括数据增强、特征层次调优等,以适应头盔检测任务的特殊需求。实验结果表明,YOLOv8在泛化能力方面表现出色,能够有效应对不同场景和目标的多样性。
- 挑战与改进方向: 尽管YOLOv8在头盔检测中表现出色,但在处理极端角度、严重遮挡或非常小的目标时,模型的检测精度仍有待提高。此外,虽然YOLOv8在计算资源较为丰富的环境中表现良好,但在资源受限的设备上,如何进一步优化模型以减少计算开销仍然是一个挑战。
- 应用前景: 结合YOLOv8的检测精度和实时性,其在交通监控、工地安全监控等领域有广泛的应用前景。未来的工作可以进一步优化模型结构,降低计算复杂度,并探索与其他传感器数据的融合,以提升检测的鲁棒性和实用性。
总的来说,YOLOv8在头盔检测任务中的应用展现了深度学习在计算机视觉领域的强大潜力。该模型在保持实时性的同时,实现了高精度的检测效果,为实际应用提供了可靠的技术支持。未来的研究方向应集中在进一步优化模型、提升检测鲁棒性以及探索新型应用场景中。