怎么使用TensorFlow构建面部口罩识别系统
这期内容当中小编将会给大家带来有关怎么使用TensorFlow构建面部口罩识别系统,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
TensorFlow和OpenCV库的复杂性使得创建自动化解决方案成为可能,从而不仅可以最大程度地提高效率和确保合规性,而且还可以挽救生命。
我们看到计算机视觉 图像识别技术在我们日常生活中的应用非常频繁。无论是通过面部识别来解锁iPhone,通过机场检查,甚至是通过收费架来捕获您通过的汽车图像,图像分类都可以使机器有效地实现我们对它们的编程。无论是上述方法还是面罩识别系统,都应将技术融入我们的日常生活中以实现社会公益。我们的目标就是这样做-创建一个每个人都可以理解图像分类如何工作的面罩识别系统,以便我们的项目可以在现实生活中的实践中应用和复制。对于好奇的人 这是我们使用TensorFlow创建面部识别系统的方式,该系统可检测您的面部边界并预测您是否实时佩戴面罩。
数据采集
首先,我们需要为训练和测试数据集收集图像。我们想创建自己的数据集,该数据集包括戴有口罩的人的图像和未戴口罩的人的图像。我们利用Python中的Selenium和BeautifulSoup库来自动化Web浏览器,以解析Shutterstock.com上免版税的图像。我们创建了一个脚本,要求用户输入用户要刮擦的图像类型(照片或任何类型的图像)以及他们对该图像的搜索查询。此外,用户可以指定要从中刮取多少页。
数据预处理
在抓取606个带有面罩的人的图像和665个没有面罩的人的图像之后,我们创建了一个训练集和测试集,其中包含具有以下规格的这些图像:80%的随机选择的带面罩的人图像去了在训练集中,有20%的带有口罩的人的随机选择图像进入了测试集。重复此过程以训练和测试没有面罩的人的图像的数据集。
随着我们所掌握的只有几张图片,我们可以使用仍然建立一个强大的图像分类ImageDataGenerator在Keras产生张量的批次,实时数据增强(多维数组)的图像数据,以增加数据集的数量和多样性。数据扩充过程通过创建重复的图片(例如添加滤镜和翻转原始图像)来完成,这样做是为了增加数据大小而不必收集新图像,同时还有助于训练模型以捕获位置,图像质量上的差异和外观。
建立模型
在机器学习中,我们经常通过根据自然世界建模框架来找到针对现实世界问题的最佳解决方案。通过图像分类,我们实质上是通过在人工神经网络中通过一系列算法对人眼进行功能训练来展示人眼的功能,这些算法以生物神经网络为模型。对于这个项目,我们使用在卷积神经网络(CNN)中找到的经典构件来设计模型。我们决定建立CNN模型的原因是由于其产生高精度率而在图像识别中广受欢迎。CNN遵循一个分层模型,该模型用于构建类似漏斗的网络,该网络输出一个完全连接的层,其中所有神经元都相互连接,并且确定了分类概率。
卷积层是接受我们训练的图像输入的第一层。其主要目的是从输入图像中提取重要特征。卷积层能够合成局部特征,因为它们约束了要定位的神经网络中隐藏层的接受场。每个图像都被视为像素值矩阵。每个矩阵单元包含3个通道(红色,绿色和蓝色),可提供颜色饱和度。在我们数据集的每个图像上,卷积层应用大小为3x3的100个不同的滤镜或内核,这意味着滤镜的步距为1个像素,如以下动画所示。
(3x3滤镜跨5x5输入图像跨一个像素,以生成新的3x3特征图)
卷积层的输出称为特征图,特征图的每个单个元素都是像素值矩阵与我们将滤波器滑动1个像素之前求和的滤波器的乘积的结果。对于每个应用的卷积滤波器,都有一个对应的唯一特征图乘积。
以下的图像为如何导出每个特征图提供了很好的视觉效果。因为我们在卷积层上使用了100个滤镜,所以我们将输出100个特征图与数据集中的每个图像。
那么为什么要100个过滤器呢?因为我们使用的滤镜数量越多,提取的图像特征就越多,并且我们的网络在识别看不见的图像中的图案方面变得越好。
为了创建这些特征图,我们使用ReLU(整流线性单位) 激活函数,该函数将非线性引入我们的模型。ReLU不仅克服了消失的梯度问题,还使我们的模型学习更快,性能更好。输出称为"整流特征图",它是我们合并步骤的输入。
下一层Pooling在保留重要信息的同时降低了每个特征图的维数。我们选择使用池大小为3x3的MaxPooling在每个要素图的每个窗口中选择最大值。结果是经过下采样的功能图,突出显示了补丁中最普遍的功能。
在合并层之后,我们通过第二个卷积层+ ReLU和合并层再次重复此过程,然后将第二个合并层的输出作为Flattening层(进行层)的输入。展平层将第二合并层的校正后的特征图转换为连接到最终分类模型的一维数组(单个长特征向量)。
在扁平化层之后,Dropout层以前馈方式忽略随机选择的神经元,以避免过度拟合并降低完全连接层的神经元之间的相互依赖性。它迫使神经网络学习更强大的功能。我们的模型有0.5个概率作为我们的层超参数。
最后,我们决定在模型中使用三个分别包含50、35和最终2个神经元的密集层(全连接层)。密集网络根据无掩码= 1和掩码= 0的二进制分类输出概率。
结合Adam优化器,对随机梯度下降(SGD)的扩展,它使用动量和自适应学习率更快收敛,并且将二进制交叉熵作为我们的损失函数,输出损失的均值或概率的负对数,通过此模型,我们获得了最佳的验证准确性。当验证精度达到平稳状态并随着每个周期的增加而停滞时,我们最多可以运行5个周期的模型。以下代码是我们用Python构造CNN模型的方式。
实时测试我们的模型
为了测试模型的最适用用途,我们使用了CV2库中的VideoCapture函数。由OpenCV设计的Cascade分类器用于通过" detectMultiScale"检测实时视频中的正面。使用" while"循环来保持从镜像的实时视频中捕获图像。然后,模型将确定是否实时佩戴了口罩。根据模型的性能和准确性,将通过在面部周围覆盖一个绿色矩形(表示相机上的人戴着口罩)或一个红色矩形(表示相机上的人没有戴着口罩)来显示二进制分类器结果。面具。
结果
使用我们选择的模型,我们发现验证的准确性高达61%。在所有情况下都是如此,每次运行的代码在验证准确性上都存在差异。这主要是由于考虑到该层随机选择神经元,因此每次从头开始运行代码时,辍学层都会对模型的训练产生一些不同的影响。
尽管高达61%的验证准确度肯定高于随机机会,但在使用OpenCV进行实时测试时,结果并不完美。该模型已经有足够的次数生成了误报和误报。通过检查结果,我们的模型在实践中似乎对面部表情和方向以及头部位置更加敏感。我们认为,这可能是我们相对较小但高度多样化的数据集的副产品。结果,我们的模型在少量图像上进行训练,并发现在整个数据集中寻找通用模式的难度。
我们还对其他模型进行了测试,更改了层的组成和数量。我们训练的其他值得注意的模型是具有额外卷积和池化层的模型,在密集层中具有激活函数(ReLU和Softmax)的模型以及具有较少密集层的模型。对于在密集层中具有额外卷积和合并层或激活函数的模型,我们没有注意到验证准确性的显着一致差异,以使包括这些层在内的层值得模型的额外计算成本和复杂性。在致密层少了的模型中,我们确实注意到验证准确度显着下降,而最高验证准确度约为54%。
正如有这么一句话:"深度学习的大部分工作都包括使用Python脚本处理数据,然后详细地调整深度网络的体系结构和超参数以获取可行的模型" --- Keras的发明者FrançoisChollet
结论和进一步改进
在尝试了不同的独特设计的CNN模型之后,我们最终模型的构造产生了最佳的性能和准确性。
尽管该模型无法完美预测是否佩戴了口罩,但我们相信,通过更多的训练数据,我们可以获得更好的结果,可以准确地确定各种口罩,面部表情,头部位置和其他因素对口罩的使用情况。此外,最好使用网络抓取工具从异常图像中清除数据集,因为它们固有地拾取了许多无关图像,以防止具有大量噪声图像对模型在训练期间执行准确分类的能力产生负面影响。
有测试模型歧管方式使用迁移学习中,我们使用不同的声誉和预先训练体系结构,如RESNET,VGG,Lenet,AlexNet,甚至Xception。然后,我们可以按时期数显示这些不同的转移学习模型的重叠训练和验证准确性以及损失图,以比较哪种模型给出了最好的结果。
我们相信,我们的框架和模型可以在公共生活的各个部门中复制和实施,并且可以通过使用TensorFlow和OpenCV库进行机器学习来启发图像分类的无限可能性。
上述就是小编为大家分享的怎么使用TensorFlow构建面部口罩识别系统了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。