☀️机器学习实战☀️基于 YOLO网络 的人脸识别 |(文末送机器学习书籍~)

简介: 目录一、 项目进展1.1 第一阶段1.2 第二阶段1.3 第三阶段1.4 第四阶段二、 项目难点三、解决思路3.1 问题一3.1.1 算法方面3.2 问题二3.2.1 数据集3.1.2 YOLOv3 To YOLOv5四、网络介绍4.1 YOLOv34.1.1 主干网络 Darknet-534.1.2 训练结果4.2 YOLOv54.2.1 输入端4.2.2 Backbone主干网络4.2.3 Neck4.2.4 结果演示4.3 YOLOv5 + MoblieNetV34.3.1 深度可分离卷积五、代码&参考文献六、福利送书最后

目录

一、 项目进展

1.1 第一阶段

1.2 第二阶段

1.3 第三阶段

1.4 第四阶段

二、 项目难点

三、解决思路

3.1 问题一

3.1.1 算法方面

3.2 问题二

3.2.1 数据集

3.1.2 YOLOv3 To YOLOv5

四、网络介绍

4.1 YOLOv3

4.1.1 主干网络 Darknet-53

4.1.2 训练结果

4.2 YOLOv5

4.2.1 输入端

4.2.2 Backbone主干网络

4.2.3 Neck

4.2.4 结果演示

4.3 YOLOv5 + MoblieNetV3

4.3.1 深度可分离卷积

五、代码&参考文献

六、福利送书

最后

一、 项目进展

1.1 第一阶段

由于是人脸识别,我们在打算使用OpenCV,通过进行一些的cv操作,例如将背景和人进行一个减法操作的运算,再进行高斯滤波降噪点,以及进行形态学的腐蚀与膨胀操作,但是这种算法只能应用于简单背景下的单人检测。无法应对多人情况下的检测识别。于是进入第二阶段。


1.2 第二阶段

在这个阶段,我们采取了YOLOv3 + OpenCV的方案,YOLO系列算法是目标检测领域的佼佼者。在YOLOv3强大的网络下,我们的人脸识别准确率达到了一个新的高度。当然由于YOLOv3的权重文件高达两百兆,无法实现多端部署(移动端等),于是我们寻求了更轻的网络结构—YOLOv5s,开启了我们的第三阶段。


1.3 第三阶段

麻雀虽小,五脏俱全。虽然YOLOv5s权重文件的大小仅有YOLOv3的二十分之一,但是在速度上却提高了两个量级,准确度的平均值比YOLOv3高出了6.3%。为了进一步扩大YOLOv5的长处,我们打算改进YOLOv5s的网络结构,将YOLOv5中的backbone结构更换成更轻量的结构,以为后续的多端协同操作打下基础。


1.4 第四阶段

在这个阶段,我们将YOLOv5s中的backbone更换成MoblieNetV3网络结构,我们的改进的模型,只有五兆,但是准确率降低了很多,在写这篇文章的时候,还没有很好的解决方案,还在研究当中。


二、 项目难点

目标在高速移动情况下的可能会失去检测,被堆叠情况下也可能会没被检测到。

数据集的制作,在各大网络上的数据集无法满足我们项目的需求。

优化YOLOv5的结构之后,准确率丢失。

三、解决思路

3.1 问题一

目标在高速移动情况下的可能会失去检测,被堆叠情况下也可能会没被检测到。


3.1.1 算法方面

由于在人脸堆叠的情况下,YOLOv3中的NMS算法对于目标堆叠状况下无法很好的进行检测,这也是我们更换YOLOv5的原因之一。image.png

在YOLOv5的输出端中采用其中的GIOU_Loss做Bounding box的损失函数。


先计算两个框的最小闭包区域面积 (同时包含了预测框和真实框的最小框的面积)

再计算出IoU

再计算闭包区域中不属于两个框的区域占闭包区域的比重

最后用IoU减去

这个比重得到GIoU。


图片理解如下:

image.png

两个框的最小闭包区域面积 = 红色矩形面积

IoU = 黄色框和蓝色框的交集 / 并集

闭包区域中不属于两个框的区域占闭包区域的比重 = 蓝色面积 / 红色矩阵面积

GIoU = IoU - 比重

针对很多目标框的筛选,通常需要NMS操作。因为CIOU_Loss中包含影响因子v,涉及groudtruth的信息,而测试推理时,是没有groundtruth的。所以Yolov4在DIOU_Loss的基础上采用DIOU_nms的方式,而YOLOv5中采用加权nms的方式。这种方式能更好地识别出目标。


3.2 问题二

数据集的制作,在各大网络上的现成数据集无法满足我们项目的需求。


3.2.1 数据集

数据集方面,我们相对增强了堆叠状况的数据以及遮掩情况下的数据集。使得模型能够更好的迭代更新。


使用爬虫爬取网络的人脸图片,使用labelImg进行数据的标注,由于人工标注有限,我们总共标注了一千张左右的人脸图片,但是通过了YOLOv5的数据增强,例如上下翻滚,多图拼接等,使得了我们的数据集是原来的四倍。


3.1.2 YOLOv3 To YOLOv5

从YOLOv3到YOLOv5的过程并不是一蹴而就的,我们首先从YOLOv3转到YOLOv4,再转到YOLOv5。由于v4的网络结构与v3有部分的不同。而v5与前两代也不同,在这里就直接说一下v3到v5上的部分算法结构。


四、网络介绍

4.1 YOLOv3

4.1.1 主干网络 Darknet-53

【Darknet-53】

Yolo V3 采用了 Darknet-53 的网络结构(含有 5 组残差模块)来提取特征。其网络结构采用了横纵交叉结构,并采用了连串的 3×3 和 1×1 卷积。


其中,3×3 的卷积增加通道数,而 1×1 的卷积在于压缩 3×3 卷积后的特征表示,同时 Darknet-53 为了防止池化带来的低级特征的丢失,采用了全卷积层,并且引入了 residual残差结构。


这意味着网络结构可以更好地利用 GPU,从而使其评估效率更高、速度更快。Darknet-53 作为特征提取层,最终每个预测任务得到的特征大小为[3×(4+1+C)]。


每个grid cell预测 3 个预测框,4 代表 4是边界框中心坐标bx,by,以及边界框 bw,bh,1代表预测值,C 代表预测类别。最终YoloV3可以获取(16×10+32×20+64×40)个特征向量。


【网络结构】

模型结构如下图:


image.png


4.1.2 训练结果

迭代100次后的mAP

image.png

迭代400次后的mAP


image.png


从测试结果我们可以看出这个网络的检测结果的问题:


当人脸堆叠的时候,会导致先验框的堆叠,这就是v3的nms算法的弊端

黑肤色的人无法进行识别检测,这应该是训练集中对这方面数据样本的确实,导致这方面权重偏小。


image.png

当检测目标处于不堆叠且非黑色肤种的时候,就有非常高的准确率。


image.png


当人脸在被遮掩的情况,也有很不错的表现。

image.png



在昏暗和有遮掩物的条件下也能进行识别,虽然准确率比较低

image.png


当我们调用摄像头,帧率稳定在30帧左右。

image.png

4.2 YOLOv5

4.2.1 输入端

Mosaic数据增强。

V5的输入端沿用了V4的Mosaic数据增强的方式,通过随机缩放,随机剪裁,随机排布的方式进行拼接,对于小目标检测的效果有明显提高。

自适应锚框计算

在传统的Yolo算法中,针对不同的数据集,都会有初始设定的长宽的秒框,那么在网络训练中,网络在初始锚框的基础上输出预测框,进而与真实框进行对比,计算两者差距,再反向传播,迭代网络参数。V5对于V3、V4再这方面并不是固定的,而是将这个功能嵌入到了代码当中,每次训练中,都会自适应计算不同训练集中最佳的锚框值。

自适应图片缩放

在V5中对这方面进行了改进,首先是计算出缩放系数,原始图片的长宽都乘以最小的缩放系数,得到原本需要填充的高度。再对32(V5的网络经过5次下采样,而2的5次方=32。所以至少要去掉32的倍数) 取余,得到像素点,再除以2,即得到图片高度两端需要填充的数值通过这种简单的改进,推理速度得到了37%的提升

4.2.2 Backbone主干网络

Focus结构

V3、V4中并没有Focus结构,Focus结构是V5模型的一个创新点。其中关键点就是进行切片操作。比如下图的切片操作。

image.png


CSP结构

Yolov4网络结构中,借鉴了CSPNet的设计思路,在主干网络中设计了CSP结构。v5与v4不同点在于,v4中只有主干网络使用了CSP结构。而v5中设计了两种CSP结构,以Yolov5s网络为例,CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中。


与yolov3的残差结构对比的话。CSPnet结构并不算复杂,就是将原来的残差块的堆叠进行了一个拆分,拆成左右两部分:


主干部分继续进行原来的残差块的堆叠

另一部分则像一个残差边一样,经过少量处理直接连接到最后。(Part 2)

因此可以认为CSP中存在一个大的残差边。(Part1)

image.png

4.2.3 Neck

Yolov5现在的Neck和Yolov4中一样,都采用FPN+PAN的结构,但在Yolov5刚出来时,只使用了FPN结构,后面才增加了PAN结构,此外网络中其他部分也进行了调整。

PANet结构

image.png


上图为原始的PANet的结构,可以看出来其具有一个非常重要的特点就是特征的反复提取,在(a)里面是传统的特征金字塔结构,在完成特征金字塔从下到上的特征提取后,还需要实现(b)中从上到下的特征提取。


Yolov4的Neck结构中,采用的都是普通的卷积操作。

Yolov5的Neck结构中,采用借鉴CSPnet设计的CSP2结构,加强网络特征融合的能力

4.2.4 结果演示

image.png

迭代训练完三百次后的模型结果还是很客观的,mAP不断向1收敛,我们为了防止过拟合,选择了停止训练,点到为止。

image.png


YOLOv5网络中的`数据增强

image.png

识别速度是非常快的,比v3模型要快。

image.png

当然识别率在物体遮掩的情况下是比v3模型稍微低一点。


4.3 YOLOv5 + MoblieNetV3


image.png

4.3.1 深度可分离卷积

【模型优化】


介于YoloV5的轻便小巧的特点,我们的优化方案是将V5小巧的优点继续发扬,将原生V5中的网络结构替换成MoblieNetV3。在mobilenet中,会有深度可分离卷积(depthwise separable convolution)


由depthwise(DW)和pointwise(PW)两个部分结合起来,用来提取特征feature map。相比常规的卷积操作,其参数数量和运算成本比较低。


深度可分离卷积主要分为两个过程


逐通道卷积(Depthwise Convolution)


DC的一个卷积核负责一个通道,一个通道只被一个卷积核卷积,这个过程产生的feature map通道数和输入的通道数完全一样。一张5×5像素、三通道彩色输入图片(shape为5×5×3),DC首先经过第一次卷积运算,DW完全是在二维平面内进行。卷积核的数量与上一层的通道数相同(通道和卷积核一一对应)。所以一个三通道的图像经过运算后生成了3个Feature map。


DC完成后的Feature map数量与输入层的通道数相同,但无法扩展Feature map。而且这种运算对输入层的每个通道独立进行卷积运算,并没有有效的利用不同通道在相同空间位置上的feature信息。因此需要Pointwise Convolution来将这些Feature map进行组合生成新的Feature Map。


逐点卷积(Pointwise Convolution)


PC的运算与常规卷积运算非常相似,它的卷积核的尺寸为 1×1×M,M为上一层的通道数。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个卷积核就有几个输出Feature map。经过PC之后,同样输出了4张Feature map,与常规卷积的输出维度相同。


我们可以看出这个权重文件是非常小的


我们从v3模型的216M,到v5模型的16M,再到优化后的5M大小



五、代码&参考文献

YOLOv3模型

YOLOv5模型

YOLOv5+ MoblieNetV3模型

[1] 张麒麟,林清平,肖蕾.改进YOLOv5的航拍图像识别算法[J].长江信息通信,2021,34(03):73-76.

[2] 江大白. 深入浅出Yolo系列之Yolov5核心基础知识完整讲解.2020

[3] 姜文志,李炳臻,顾佼佼,刘克.基于改进YOLO V3的舰船目标检测算法[J/OL].电光与控制:1-5[2021-04-21].http://kns.cnki.net/kcms/detail/41.1227.TN.20210322.1258.003.html.

[4] 王莉,何牧天,徐硕,袁天,赵天翊,刘建飞.基于YOLOv5s网络的垃圾分类和检测[J].包装工程,2021,42(08):50-56.

[5] 春枫琰玉. mobilenet系列之又一新成员—mobilenet-v3. CSDN.https://arxiv.org/abs/1905.02244


六、福利送书

点赞或评论,截至本周五(9月10日)在点赞区和评论区抽一位朋友,送这本《机器学习入门:基于数学原理的Python实战》书籍!!!


理论性与实用性兼备,既可作为初学者的入门书籍,也可作为求职者的面试宝典,更可作为职场人士转岗的实用手册。


《机器学习入门:基于数学原理的Python实战》


本书适合需要全面学习机器学习算法的初学者、希望掌握机器学习算法数学理论的程序员、想转行从事机器学习算法的专业人员、对机器学习算法兴趣浓厚的人员、专业培训机构学员和希望提高Python编程水平的程序员。


image.png


【作者简介】


戴璞微,中国民航大学硕士,CSDN博客专家。曾获得全国大学生数学竞赛国家一等奖、北美数学建模二等奖,参与国家自然科学基金项目1项。对计算机视觉、机器学习和深度学习有深入研究。

潘斌,浙江大学应用数学系博士,现任辽宁石油化工大学理学院副院长。2018年入选辽宁省“兴辽英才计划”青年拔尖人才,2016年主持国家自然科学基金青年基金项目1项;2015年主持辽宁省自然科学基金项目1项;2016年主持浙江大学CAD&CG国家重点实验室开放课题2项。近年来,指导本科生获全国大学生数学建模竞赛国家一等奖。

【书籍优势】

1.与周志华编写的《机器学习》相比,本书多了对算法的数学原理详细严谨的推导。

2.与李锐翻译的《机器学习实战》相比,本书多了用面向对象思想将算法模块化,并且书中代码在 Python 3环境下运行。

3.为了照顾初学者,本书补充了全书涉及的高等数学、线性代数、概率论与数理统计、Jessen不等式等数学基础知识。


相关文章
|
4月前
|
JSON 算法 数据可视化
5.3 目标检测YOLOv3实战:叶病虫害检测——损失函数、模型训练
这篇文章详细介绍了使用YOLOv3模型进行叶病虫害检测时的损失函数配置、模型训练过程、评估方法以及模型预测步骤,并提供了相应的代码实现和可能的改进方案。
|
28天前
|
机器学习/深度学习 TensorFlow API
机器学习实战:TensorFlow在图像识别中的应用探索
【10月更文挑战第28天】随着深度学习技术的发展,图像识别取得了显著进步。TensorFlow作为Google开源的机器学习框架,凭借其强大的功能和灵活的API,在图像识别任务中广泛应用。本文通过实战案例,探讨TensorFlow在图像识别中的优势与挑战,展示如何使用TensorFlow构建和训练卷积神经网络(CNN),并评估模型的性能。尽管面临学习曲线和资源消耗等挑战,TensorFlow仍展现出广阔的应用前景。
55 5
|
2月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
74 2
|
2月前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
84 1
|
2月前
|
机器学习/深度学习 算法 数据挖掘
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧1
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
51 5
|
2月前
|
机器学习/深度学习 数据采集 分布式计算
【Python篇】深入机器学习核心:XGBoost 从入门到实战
【Python篇】深入机器学习核心:XGBoost 从入门到实战
126 3
|
2月前
|
机器学习/深度学习 算法 数据可视化
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧2
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
42 1
|
2月前
|
数据采集 机器学习/深度学习 TensorFlow
声纹识别实战:从数据采集到模型训练
【10月更文挑战第16天】声纹识别技术通过分析个人的语音特征来验证其身份,具有无接触、便捷的特点。本文将带你从零开始,一步步完成声纹识别系统的构建,包括数据采集、音频预处理、特征提取、模型训练及评估等关键步骤。我们将使用Python语言和相关的科学计算库来进行实践。
219 0
|
3月前
|
机器学习/深度学习 算法 数据挖掘
从菜鸟到大师:Scikit-learn库实战教程,模型训练、评估、选择一网打尽!
【9月更文挑战第13天】在数据科学与机器学习领域,Scikit-learn是不可或缺的工具。本文通过问答形式,指导初学者从零开始使用Scikit-learn进行模型训练、评估与选择。首先介绍了如何安装库、预处理数据并训练模型;接着展示了如何利用多种评估指标确保模型性能;最后通过GridSearchCV演示了系统化的参数调优方法。通过这些实战技巧,帮助读者逐步成长为熟练的数据科学家。
115 3
|
3月前
|
机器学习/深度学习 人工智能 算法
利用机器学习预测股市趋势:一个实战案例
【9月更文挑战第5天】在这篇文章中,我们将探索如何使用机器学习技术来预测股市趋势。我们将通过一个简单的Python代码示例来演示如何实现这一目标。请注意,这只是一个入门级的示例,实际应用中可能需要更复杂的模型和更多的数据。