图片来自维基百科
对关键概念的解释,然后是使用YOLOv5的简单掩码检测实现
绪论
我最近完成了DeepLearningAI的卷积神经网络课程,该课程由Andrew Ng在Coursera上教授,其中一部分内容涉及计算机视觉领域。我被计算机视觉的能力以及它如何融入我们的日常生活所吸引,这促使我更深入地研究计算机视觉,并启动项目来加强我的学习。
如果你只想看YOLOv5模型的项目实施,请向下滚动。
物体检测是如何工作的
在实施一个项目之前,最好先了解一些关于物体检测的基本概念以及它是如何工作的。让我们从定义物体检测开始。
{分类+定位}→检测
图像分类是指将一种算法应用于图像,以预测一个物体的类别,例如。汽车。物体定位不仅可以预测物体的类别,还可以通过在物体周围画一个边界框来确定物体的位置。物体检测包括分类和定位,并且检测不止一个物体,甚至不止一个类别。
3个术语之间的视觉比较。汽车图片: Matt Antonioli Unsplash.com
边界框
一个标准的分类任务会涉及到图像在一个具有多层的Convnet中运行,向量特征被送入一个softmax单元,例如输出预测的类别(算法试图检测的物体类别,如汽车、树木、行人)。像YOLO这样的物体检测模型的工作原理是将图像分割成一个个单元格,每个单元格负责预测一个边界盒,如果边界盒的中心位于该单元格内。然后,它将输出预测的类别和界线盒的坐标,如下图所示。
标记为蓝色的单元格预测界线盒的中心位于该单元格内。作者的图片
图片显示与界线盒相关的变量。图片由作者提供
要了解更多关于卷积神经网络的信息,请查阅Mayank Mishra的《卷积神经网络解释》。他很好地解释了Convnet的工作原理。
交叉大于联合
当算法输出定位检测到的物体的边界框时,你如何判断算法是否运行良好?这就是 "联合交集"(IoU)发挥作用的地方。一般来说,IoU是对两个界线盒之间重叠的测量:算法预测的界线盒和地面实况界线盒。
图片由作者提供
IoU的公式是交集的大小除以两个界线盒的并集的大小。IoU的阈值约为0.5。值≥0.5的IoU被认为是 "正确的 "预测。
非最大限度的压制
参照下面的界线盒图像,标有1-33的单元格都预测界线盒的中心位于他们的单元格中。
这将导致算法多次检测到该物体,而不是只有一次。这就是Non-max抑制的作用,它确保算法对每个物体只检测一次。如前所述,每个单元输出y = (P𝒸, bₓ, bᵧ, b𝓌, bₕ, c),P𝒸是存在一个物体的概率。非最大抑制的作用是,它选择具有最高P𝒸的边界盒,丢弃任何P𝒸≤0.6的边界盒,并使其他IoU≥0.5的边界盒 "沉默"。
视觉上描述了非最大限度的抑制。图片由作者提供
锚定盒
如果多个物体位于同一个网格单元中,会怎样?边框会是怎样的?这里就可以使用锚定框的概念了。看下面的图片,注意到人和车的中点都在网格单元内。(为了简单起见,我把图片分成了3乘3的网格
图片描述了包含两个物体中点的网格单元。图片来源:Dan Senior, Unsplash.com
当前单元格输出y = (P𝒸, bₓ, bᵧ, b𝓌, bₕ, c),该单元格只能在检测到的两个物体中选择一个。但是如果有了锚箱(通常事先在训练数据集上用k-means分析法预定义),成本标签y就变成了(P𝒸, bₓ, bᵧ, b𝓌, bₕ, c, P𝒸₁, bₓ₁, bᵧ₁, b𝓌₁, bₕ₁,c, P𝒸, ....)基本上是重复的,这取决于有多少个锚箱,第一个输出编码为锚箱1,第二个输出编码为锚箱2,以此类推。每个输出单元检测一个物体类别;锚箱1类似于汽车,所以输出c将是汽车,下一个输出c将是人,因为它被编码到锚箱2。
图片由作者提供
请注意,代表物体类别的每个输出单元c都受到与物体的地面真实边界盒的高IoU的影响。
使用YOLOv5进行面具检测
模型
对于这个项目,我将使用YOLOv5来训练一个物体检测模型。YOLO是 "You Only Look Once "的首字母缩写。一个流行的架构,由于。
- 速度(基本模型--每秒45帧,快速模型--每秒155帧,比R-CNN快1000倍, )
- 架构只包括一个神经网络(可以直接对检测性能进行端到端的优化
- 能够学习物体的一般表征(预测是由图像的整体背景提供的
- 开源的
YOLOv5模型与EfficientDet的比较,图片来自Ultralytics
要了解更多关于该模型的信息,请访问他们的资料库。Ultralytics YOLOv5 Github资源库。
数据集
我在Kaggle上找到了这个人脸面具检测数据集,包括853张图片,有3个类别。有面罩、无面罩、面罩佩戴不正确。每张图片都有一个PASCAL VOC格式的XML文件,其中包含边界框的注释。下面是一个例子。
脸部面具检测数据集中的示例图像
<annotation>
<folder>images</folder>
<filename>maksssksksss4.png</filename>
<size>
<width>301</width>
<height>400</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>with_mask</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<occluded>0</occluded>
<difficult>0</difficult>
<bndbox>
<xmin>70</xmin>
<ymin>185</ymin>
<xmax>176</xmax>
<ymax>321</ymax>
</bndbox>
</object>
</annotation>
这个项目需要的关键信息是。
- <宽度>和<高度>:图像的尺寸,单位为像素
- 的全部内容:xmin, ymin表示界线盒左上角的位置,而xmax, ymax表示界线盒右下角的像素。
格式化
在用模型训练数据之前,必须将PASCAL VOC XML格式的注释数据改为YOLO格式,每幅图像有一个*.txt文件,规格如下。(也可以用下面的例子图片maksssksksss4.png来说明)
- 每个物体有一行
- 每行是类x_center y_center宽度高度格式。
- 方框坐标必须是归一化的xywh格式(从0-1)。如果你的盒子是像素,那么x_center和宽度要除以图像宽度,y_center和高度要除以图像高度。
- 类的数字是零指数的(从0开始)。
图片由作者提供
我写了一个函数,使用XML.etree库从XML文件中提取所需的信息,并计算出x_centre和y_centre。由于注释数据是以图像像素为单位的,我对最终的数值进行了标准化处理,以符合要求。
结果会是这样的。
图片由作者提供
此外,还要求目录以特定的方式格式化,如下图所示,训练和验证图像及标签被分离到每个独立的文件夹中。
按作者分类的图像
我又用Pathlib库写了一个简单的函数。
请注意,上面提到的整个格式化可以使用 Roboflow来完成,这是一个简单的、有代码的、不费力的替代方案。我个人更倾向于通过代码手动完成。
在训练模型之前,我们需要创建一个_projectdata. yaml_ 文件,指定训练和验证图像的位置和标签的数量 ,以及我们训练数据的标签名称。该文件的结构应如图所示。
# specify pathway which the val and training data is at# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../mask_detection/projectdata
训练模型
为了用自定义数据集训练模型,我在本地终端运行_train.py_ ,参数如下。
- **img:**输入图像大小
- **batch:**批次大小
- **epochs:**epochs的数量
- data: _projectdata.yaml_文件的路径
- cfg:在📁模型中选择预先存在的模型。
- **weights:**初始权重路径,默认为_yolov5s.pt_
- **cache:**缓存图像以加快训练速度
我选择了最小和最快的模型yolov5s。我还使用了该模型预先训练好的权重进行迁移学习,而不是重新训练新的权重,这非常耗时,而且由于处理能力要求高,不可能在笔记本电脑上训练。我使用批次大小为 "1",并对模型进行了10个epochs的训练。
python mask_detection\yolov5\train.py --img 640 --batch 1 --epochs 10 --data projectdata.yaml
图片由作者提供
如果所有的步骤都正确完成,该命令将输出以下内容并开始训练。留意mAP@.5,看看模型的表现如何。一旦训练开始,在 "运行 "文件夹下,Yolov5训练管道会在测试图像上输入地面真相和预测结果,如下所示。
地面真相训练图像。作者的图片
测试图像。作者的图片
一旦训练完成,训练后的模型将被保存在你的 "权重 "文件夹/目录下,验证指标将被记录在Tensorboard上。(我选择了将数据记录在wandb上,因为它被推荐了)。)
训练结果。作者的图像
图像高度和宽度的相关图
数据的相关图。作者的图片
物体检测模型的评估
流行的挑战和竞赛,如。
- PASCAL VOC挑战赛(Everingham等人,2010)。
- COCO物体检测挑战赛(Lin等人,2014)。
- 开放图像挑战赛(Kuznetsova 2018)。
这三个挑战赛都使用平均精度(mAP)作为评价物体检测器的主要指标。究竟什么是mAP?首先让我们来看看一些基础性的概念。
- 置信分数。锚箱包含分类器所预测的物体的概率。
- 联合上的交集(IoU)。 边界盒的交集面积除以预测边界盒的联合面积。
- 精度。真阳性**(TP**)的数量除以真阳性**(TP**)和假阳性(FP)的总和
- 召回率。真阳性的数量除以真阳性(TP)和假阴性(FP)的总和。
只有在满足以下条件的情况下,置信度和IoU才会被用来确定预测的检测是TP 还是FP(注意:任何违反后两个条件的行为都会使其成为FP
- 信心分>阈值(如果<阈值,检测算作假阴性(FN))。
- 预测的边界盒的IU值高于阈值
- 预测的类别与地面真相的类别相符
随着置信度分数的增加,召回率单调下降,而精度可以上升和下降,但对于这个项目来说,所有类别(除了戴错的面具)都会增加。
精度-召回曲线。图片由作者提供
虽然精度-召回率指标可以用来评估物体检测器的性能,但它不容易在不同的检测器之间进行比较。为了查看整个事物的比较,基于精度-召回曲线的平均精度(AP) 就发挥作用了。顾名思义,平均精度就是找到上述精度-召回曲线下的面积。**平均平均精度(mAP)**是AP的平均值。
请注意,mAP的定义和实现方式是有差异的。
在PASCAL VOC挑战赛中,一个对象类的AP是按照0.5的IoU阈值计算的。因此,mAP是所有物体类别的平均数。
在COCO物体检测挑战赛中,mAP是所有物体类别和10个IoU阈值的平均值。
推理
现在模型已经训练好了,是时候进行有趣的部分了:在图像或视频上运行推理在本地终端调用 detect.py 来运行推理,参数如下。(查看 detect.py 解析器以获得完整的参数列表)
- **weights:**训练好的模型的权重
- **source:**运行推理的输入文件/文件夹,网络摄像头为0
- iou-thres:IOU阈值,用于非最大抑制,默认值:0.45
python yolov5\detect.py --source vid.mp4 --weights runs\train\exp\weights\best.pt --img 640 --iou-thres 0.5

作者:GIF
正如你所看到的,该模型能够检测到脸部面具的存在!
结束语
该模型远非完美,仍有改进的余地
- 该模型无法检测到不正确佩戴的口罩,这是其中一个类别。这很可能是由于数据的巨大不平衡性。只有一小部分数据是由不正确佩戴的面具组成的。一个可能的解决方案是应用数据平衡,使模型能更好地识别不正确磨损的面具。
- 可以使用一个更大的框架,如Yolov5x而不是Yolov5s,以达到更高的mAP。但是一个可能的缺点是训练这样一个大型模型需要额外的时间。
就这样,我的文章到此结束这个项目对我来说真的很有趣,我很喜欢学习新的和有趣的概念,特别是在开始的时候,学习计算机视觉似乎是一个非常艰巨的任务,但我很高兴能通过它!我很高兴。干杯!
LinkedIn简介。肖恩-叶
参考文献
[1]Joseph Redmon,Santosh Divvala,Ross Girshick,Ali Farhadi,You Only Look Once: Unified, Real-Time Object Detection(2015)
[2]Andrew Ng,卷积神经网络,DeepLearning.AI Coursera
[3]The PASCAL Visual Object Classes (VOC) Challenge, by Mark Everingham, Luc Van Gool, Christopher K. I. Williams, John Winn and Andrew Zisserman
使用YOLOv5进行掩码检测》最初发表在《走向数据科学》杂志上,人们通过强调和回应这个故事来继续对话。