站点图标 AI技术聚合

人工智能应用于口罩检测:迁移学习应用

人工智能应用于口罩检测:迁移学习应用

应用机器学习

人工智能应用于口罩检测:迁移学习应用

将预训练模型应用于分类问题

人工智能应用于口罩检测:迁移学习应用

迁移学习是在几分钟内适应极其复杂的模型以获得非常好的结果的最佳方式。在本文中,我将迁移学习应用于掩码检测。

Introduction

口罩检测是当今世界的一个相关问题。在撰写本文时,欧洲的许多国家仍然强制您在室内和公共交通工具上佩戴它们。训练一个模型来检测是否戴口罩是一个有趣的问题,我可以展示迁移学习的潜力。

从图片中预测口罩是否正确佩戴涉及多个步骤。每个图像可以包含多个人,我们想要对每个人进行预测。问题的第一部分涉及在每张图像中找到人脸,裁剪人脸,并准备将它们用作机器学习模型的输入。问题的第二部分是分类问题。裁剪后的人脸分为 3 类:“口罩”、“不戴口罩”、“戴错口罩”。

数据

在整篇文章中,我使用面罩检测 | Kaggle 数据集是一个公共数据集,包含 800 多张带标签的戴口罩的人的图像。[0]

数据集被标记。每张图像都包含有关每张脸在哪里的信息,以及该人是否正确、错误地佩戴了口罩,或者根本没有佩戴口罩。绝大多数贴有标签的面孔都戴着口罩。

检测人脸

问题的第一部分是检测图像中的人脸,裁剪它们并准备好用作分类器的输入。

为了检测人脸,我使用了 CV2 的预训练模型,该模型接收图像并返回图像中人脸的坐标。我尝试了他们在这里找到的许多模型,但我发现“haarcascade_frontalface_alt2.xml”最适合戴面具的脸。[0]

上面的代码加载了 CV2 人脸模型,然后循环遍历每张图像,找到每张脸,并将鲮鱼的位置添加到 pandas 数据帧。生成的数据框如下所示:

CV2 模型经过训练可以检测没有蒙版的人脸,因此它们无法在每张图片中找到每一张脸是正常的。众所周知,这些模型也会与不直接面对相机的人作斗争。

在上图中,绿色方块表示数据集中提供的每个人脸位置的标签。蓝色是模型的预测。对于这个特定的图像,模型表现良好,检测到所有三个人脸。

为了验证人脸检测,我查看了预测的中心,如果它在数据集中标记的正方形内,我认为预测是正确的。

该模型并不完美,它遗漏了大约 80% 的标记人脸。

该模型经过训练以仅检测正面人脸。在上图中,模型仅检测到 16 个人脸中的 4 个。尽管性能很好,我仍然会使用这个模型来检测人脸,但我自己的训练超出了范围。

为分类器准备数据

一旦我们在每张图像中找到了人脸位置,我就可以裁剪图像并单独保存每张脸。然后,在训练分类器之前,我可以重新缩放和重塑图像,使它们都保持一致。

def save_faces(df):
    #for each face in dataframe
    for index, face in df.iterrows():
        #open image
        filename = "./images/" + face["file"].split("\\")[1] + ".png"
        im = Image.open(filename)
        #crop image
        im = im.crop( face[["xmin", "ymin", "xmax", "ymax"]].values)
        #save image
        save_name = ".//processed//" + face["name"] + "//" + face["file"] + "_" + str(index) + ".png"
        im.save(save_name)

为了裁剪和保存每张脸,我使用上面的代码。可以使用在训练期间馈送到神经网络的数据生成器来完成整形和归一化。

上图是预处理的图表。我首先使用 CV2 模型来定位面部并裁剪它们。然后我将它们重新缩放到一个共同的大小。在此之后,我还将数据归一化以使神经网络更容易学习。

以上 9 张图像是分类器的示例输入。该模型将尝试将这些图像中的每一个分类为“面具”、“无面具”或“错误佩戴”。

分类面孔

处理完图像后,我们可以训练分类器来预测每张图像是否显示一个人正确、错误地或根本没有戴口罩。

在图像上训练分类器可能非常昂贵,尤其是要获得良好的性能。这就是我使用迁移学习的原因:

迁移学习

迁移学习包括采用预先训练的模型,并将其调整为我们自己的应用程序。迁移学习特别适用于图像数据模型。

用于图像分类的迁移学习最流行的模型是为 ImageNet 竞赛训练的模型。 ImageNet 是一项竞赛,大型公司训练超大型模型,将数百万张图像中的对象分类为 1000 个类别。

上图显示了模型的性能与其训练成本的关系。我希望在没有 GPU 的本地机器上训练这些,因此我选择了 ResNet-50(图像左上角为粉红色)。该模型实现了非常好的性能,并且训练效率很高。

ResNet-50 是一个真正庞大的模型。它包含超过 2300 万个参数。当它在 ImageNet 中竞争时,它被训练将图像分类为 1000 个类别,但是,我的分类问题只包含 3 个类别(Mask、No Mask、Incorrectly Worn mask)。所以我们必须调整模型以便能够在这个问题中使用它。

所以为了使这个模型适应我的应用程序,我删除了神经网络的最后一层,并添加了我自己的;这次输出大小为 3 而不是 1000(因为我想要 3 个类别)。然后我可以训练最后一层,而无需触及其他层中的任何权重。用 2300 万个参数训练整个模型会很昂贵,但是因为我只训练最后一层,所以这样做很便宜。

在上面的模型摘要中,您可以看到该模型有超过 2300 万个不可训练的参数(为 ImageNet 训练的参数)。我正在训练的唯一层是包含 6147 个参数的最后一层。

在这些深度神经网络中,大多数模型都试图在输入图像中找到重要特征,例如形状、纹理等。通过更改最后一层,我们使用所有这些信息,但只是更改最后一部分以使其对我们有用应用。

from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense
from tensorflow.keras.applications import ResNet50
from tensorflow import keras

model = Sequential()
model.add(ResNet50(include_top = False, pooling = RESNET50_POOLING_AVERAGE, weights='imagenet'))
model.add(Dense(NUM_CLASSES, activation = DENSE_LAYER_ACTIVATION))

#fix all model weights EXCEPT FOR THE FINAL LAYER (the one we want to train)
for i in model.layers[:-1]:
    i.trainable = False

#compile the model with your favourite optimizer, loss function and metrics 
model.compile(optimizer = "adam", loss = "categorical_crossentropy", metrics = "accuracy")

在上面的代码中,我使用 Keras 加载了预训练的 ResNet50。模型中唯一可训练的层是最后一层。然后我可以像训练任何其他神经网络一样训练模型。

培训和结果

我在没有 GPU 的情况下对最后一层进行了 30 个 epoch 的训练,大约需要 10 分钟。该模型达到了 90% 以上的准确率。

正如您在上面看到的,仅仅 30 个 epoch 之后,模型似乎收敛到了良好的性能。如果没有迁移学习,这将花费更长的时间。

以上是用于训练和验证的混淆矩阵。混淆矩阵可以让你看到模型出错的地方。验证数据集由前一节中提到的 CV2 模型提取的人脸组成。该模型非常擅长标记戴口罩和不戴口罩的人,在这些方面实现了超过 90% 的准确率和召回率。该模型难以正确标记不正确佩戴口罩的人。

结合两种模型

我们现在可以从图像中提取人脸并对其进行预测。让我们看一下模型的表现:

正面预测

当图像的主体面向相机时,该模型的表现非常好。但是,当拍摄对象距离较远且不看相机时,模型无法检测到任何人脸。

该模型在上面的图像上表现良好,因为图像中的人大致面向相机。在左边你可以看到数据的真实标签,在右边你可以看到分类器的预测。

但是,当人们没有面对相机或距离太远时,模型无法识别出一张脸。

戴错口罩

该模型特别擅长检测口罩与不戴口罩的情况,但难以检测佩戴不正确的口罩。

在上图中,左边的女人在她的鼻子下面有她的面具,但模特仍然把它归类为面具。

在上图中,模型正确识别出戴错口罩的女性,但由于他没有面对镜头,所以未能看到左边的男人。

Conclusion

迁移学习使您可以立即训练复杂且性能良好的模型。在这篇文章中,我展示了我用来解决掩码检测问题的管道。该问题由两个关键部分组成,首先我希望检测人脸并对其进行预处理,以便将它们用作分类器的输入。在第二阶段,我使用迁移学习来训练一个分类器来预测这个人是否戴着口罩。

模型训练的性能令人满意。分类器表现良好,可以检测口罩是否佩戴正确。人脸检测可以改进,它检测到的人脸大多是正确的,但它很难找到每张图像中的所有人脸。

潜在风险和道德问题

在处理面部识别和其他个人身份信息时,存在风险和道德问题。在这些项目中,尊重人们的隐私权很重要。我可能会在以后的文章中探讨的一种解决方案是在机器学习模型中使用差异隐私。

在为口罩检测模型选择合适的应用程序时,应该考虑道德问题。一个潜在的用例可能是计算在健身房正确佩戴口罩的人的百分比,而不是对不正确佩戴口罩的人处以罚款。对某人进行罚款将涉及从图像中确定该人的身份,这会引发道德问题,因为这些数据可能会被恶意使用。正确选择用例是使这些模型安全和合乎道德的关键。

支持我

希望对你有帮助,喜欢的话可以关注我哦![0]

您还可以使用我的推荐链接成为中型会员,访问我的所有文章等等:https://diegounzuetaruedas.medium.com/membership[0][1]

您可能会喜欢的其他文章

无监督学习:K-means 聚类[0]

数据可视化理论[0]

References

[1] https://www.semanticscholar.org/paper/An-Analysis-of-Deep-Neural-Network-Models-for-Canziani-Paszke/9a786d1ecf77dfba3459a83cd3fa0f1781bbcba4[0]

文章出处登录后可见!

已经登录?立即刷新
退出移动版