深度学习实战——口罩识别系统

1.需求分析

(1)本系统通过模型训练,选择输入读取测试集maskTest中照片数量

(2)将照片识别分类,戴口罩的赋予“With Mask”特征标签,不戴口罩的赋予“Without Mask”特征标签,并展示分类后的图片

(3)展示训练准确率accuracy与损失loss

     展示训练集分类样本

     随机选择测试集一张照片进行测试

     创建UI界面,选择测试照片数量

2.概要设计

2.1模型的选择

口罩识别检测本质上属于人脸识别技术,在这个领域中我们通常采用卷积神经网络模型进行特征提取。

人脸特征提取一般来说涉及到降维操作,这意味着数据十分敏感,很可能在检测过程中发生过拟合现象。如此,我计划减少参数量,VGG16模型可以很好满足我的需求。VGG16模型将输入的图像通过一系列卷积层和池化层进行特征提取,最后通过全连接层进行分类。

2.2算法的原理

模型的底层卷积实际上具有非常强大的特征提取功能,因此我改变顶层(全连接层)设计,训练出自己的分类器。这个分类器由一个全连接层、一个 dropout 层和一个 sigmoid 激活函数组成。全连接层可以将特征映射到输出层的单个节点上,dropout 层可以防止过拟合,sigmoid 函数可以将模型的输出限制在 0 到 1 的范围内,表示佩戴口罩和未佩戴口罩的概率

2.3数据准备与预处理

  1. 与传统深度学习一样,构建自己的训练集(maskDetect)与测试集(maskTest),并导入
  2. 搭建数据生成器,方便后续从训练集中读取照片,并进行相关模型训练
  3. 根据我们已经学习过的数字图像处理相关知识,对读取的图片进行一系列处理,其中包括在这里,我们使用的 ImageDataGenerator 类来对图像进行旋转、平移、缩放等操作,以增加数据集的多样性,并使模型更具有鲁棒性。同时,我们还需要将图像像素值进行归一化处理。

2.4模型的搭建与训练

  1. 加载预训练的 VGG16 模型,去掉顶层,并冻结权重,便于后续训练分类器
  2. 向模型添加顶层分类器,使用sigmod函数进行激活处理
  3. 构建编译模型,设置一系列参数,包括损失,准确率,学习率
  4. 开始迭代训练,达到降低loss,提高准确率的要求

3.详细设计

  3.1模块搭建以及训练

①相关库导入

注意,此模型搭建过程中,我使用了tensorflow库,请确保在你的环境中安装相应的库文件

②数据集读取与处理

搭建数据生成器,方便后续从训练集中读取照片,并进行相关模型训练

③模型参数设置与训练

1.加载预训练的 VGG16 模型,去掉顶层,并冻结权重,便于后续训练分类器

2.向模型添加顶层分类器,使用sigmod函数进行激活处理

3.构建编译模型,设置一系列参数,包括损失,准确率,学习率

4.开始迭代训练,达到降低loss,提高准确率的要求

3.2获取训练图像样本

以下这段代码的目的是显示训练数据中的图像样本,并在标题中显示带口罩或不带口罩的标签。下面解释一下其中涉及的参数的含义:

fig, axes = plt.subplots(2, 4, figsize=(12, 6)):创建一个2行4列的子图,并设置整个图像的大小为12x6英寸。

axes = axes.flatten():将二维的axes数组转化为一维,以便后续循环使用。

for i, ax in enumerate(axes)::遍历所有的子图。

ax.imshow(images[i]):在当前子图中显示第i个图像。

if labels[i] == 0::根据第i个样本的标签值判断是否带口罩。

ax.set_title('With Mask'):如果标签为0,设置当前子图的标题为"With Mask",表示带口罩。

ax.set_title('Without Mask'):如果标签不为0,设置当前子图的标题为"Without Mask",表示不带口罩。

这是属于我的测试部分,由于不能判断数据生成器是否能够接受训练数据,我通过plt.show(),获取训练集中的样本,那么证明我们可以继续接下来的实验。

3.3 测试集中进行检测

test_folder = "maskTest":设置测试集文件夹的路径。

test_files = glob.glob(test_folder + '/*.jpg'):获取测试集文件夹中所有以.jpg为扩展名的图像文件的路径列表。

random_file = random.choice(test_files):从测试集文件列表中随机选择一个图像文件。

test_image = image.load_img(random_file, target_size=(224, 224)):加载随机选择的图像文件并将其大小调整为指定的尺寸(224x224)。

test_image = image.img_to_array(test_image):将加载的图像转换为 NumPy 数组。

test_image = np.expand_dims(test_image, axis=0):在数组的最前面添加一个维度,以匹配模型的输入形状。

prediction = model.predict(test_image)[0]:使用训练好的模型对测试图像进行预测,得到预测结果。

predicted_label = np.round(prediction):将预测结果进行四舍五入,得到预测的标签。

plt.imshow(image.array_to_img(test_image[0])):显示测试图像。

if predicted_label == 0::根据预测的标签判断是否带口罩。

为了检验测试集分类效果,我展开以下步骤:

  1. 读取测试集文件
  2. 为了验证测试的普遍性,我采取随机抽样的方式,选择测试集中的图片
  3. 为了方便显示,对检测图像的大小等参数预处理
  4. 使用训练好的模型进行检测
  5. 将检测好的结果输出,并赋予标签“Without Mask”“With Mask”

4.实验结果与分析

4.1数据处理与模型迭代训练

设置参数epochs值,我们观察迭代训练后的loss,accuracy:

我们可以观察到,在第十三次迭代训练中,我们以及得到最低的loss:0.124,同时accuracy:0.9624,这对于深度学习来说,已经是一个不错的模型,训练结果我们也可以接受。

  4.2检验训练集样本

images, labels = train_generator.next():通过调用训练数据生成器对象的next()方法,获取一批训练数据。每次调用next()方法会返回一批大小为batch_size的数据(默认为32),其中包括图像数据和标签数据。

fig, axes = plt.subplots(2, 4, figsize=(12, 6)):创建一个绘图对象,并定义子图的布局。这里创建了一个2x4的子图布局,共显示8张图像。

为了确保数据生成器正确接受样本,开始样本检测,我们有必要随机批量检查训练集成果

正确将训练样本分类,我们接下来去测试集进行验证!

4.3 测试集随机验证

查看结果:

很符合我们的accuracy,说明模型训练成功!

本次设计的完整代码与数据集需要可联系

5.实验小结

很高兴能够展示一个自我搭建的深度学习项目,并实现相关功能,卷积神经网络在我们生活中应用是在广泛。

通过这个实验,我们可以直观地查看口罩检测训练数据中的图像样本,并了解图像和标签之间的对应关系。但是,在训练不充分的情况下,十分影响我们模型的精度和准确率。在这个情况下,我们可能需要不断修改代码,不断训练······

但是,一个深度学习项目的意义是在应用,是在服务社会。故而不要怕困难,要一起加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值