转载请注明作者和出处:https://blog.csdn.net/qq_28810395
Python版本: Python3.x
运行平台: Windows 10
IDE: Pycharm profession 2019
如有需要数据集或整个工程文件的可以进行关注cai_5158046回复口罩识别进行获取。

一、前言

  在此只做简单利用Tensorflow进行口罩识别的程序实现,不做算法讲解,具体概念请移步下面链接。

https://blog.csdn.net/qq_28810395/article/details/107401125

二、前期准备

  数据集(200幅戴口罩图片,200幅没戴口罩图片)如下。

  1. mask
  2. nomask

    对于深度网络模型训练,仅仅200的训练集完全不足够进行训练,在此只是测试讲解,所以200样本集足够用于展示流程。

具体代码展示

  搭建网络,训练模型。

import os, shutil, random, glob
#添加tensorflow的库
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
#添加matplotlib的库进行界面可视化
import matplotlib.pyplot as plt#变量
resize = 224  #输入图片尺寸参数
total_num = 200  #训练集总计和
train_num = 180  #训练集实际训练数字,20的验证集
epochs = 5       #迭代次数
batch_size = 8   #每次训练多少张# -----------------------------------------------------------------------------
dir_data = './train/'            #训练集路径
dir_mask = os.path.join(dir_data, 'mask')     #戴口罩文件夹路径
dir_nomask = os.path.join(dir_data, 'nomask') #没带口罩文件夹路径
#健壮性的断言
assert os.path.exists(dir_mask), 'Could not find ' + dir_mask
assert os.path.exists(dir_nomask), 'Could not find ' + dir_nomask
#定义了文件指针对整个文件夹遍历一遍,将图像读出来
fpath_mask = [os.path.abspath(fp) for fp in glob.glob(os.path.join(dir_mask, '*.jpg'))]
fpath_nomask = [os.path.abspath(fp) for fp in glob.glob(os.path.join(dir_nomask, '*.jpg'))]
#文件数
num_mask = len(fpath_mask)
num_nomask = len(fpath_nomask)
#设置标签
label_mask = [0] * num_mask
label_nomask = [1] * num_nomaskprint('#mask:   ', num_mask)
print('#nomask: ', num_nomask)
#划分多少为验证集
RATIO_TEST = 0.1num_mask_test = int(num_mask * RATIO_TEST)
num_nomask_test = int(num_nomask * RATIO_TEST)# train
fpath_train = fpath_mask[num_mask_test:] + fpath_nomask[num_nomask_test:]
label_train = label_mask[num_mask_test:] + label_nomask[num_nomask_test:]
# validation
fpath_vali = fpath_mask[:num_mask_test] + fpath_nomask[:num_nomask_test]
label_vali = label_mask[:num_mask_test] + label_nomask[:num_nomask_test]num_train = len(fpath_train)
num_vali = len(fpath_vali)print(num_train)
print(num_vali)
#预处理
def preproc(fpath, label):image_byte = tf.io.read_file(fpath)image = tf.io.decode_image(image_byte)image_resize = tf.image.resize_with_pad(image, 224, 224) #缩放到224*224image_norm = tf.cast(image_resize, tf.float32) / 255. #归一化label_onehot = tf.one_hot(label, 2)return image_norm, label_onehotdataset_train = tf.data.Dataset.from_tensor_slices((fpath_train, label_train)) #将数据进行预处理
dataset_train = dataset_train.shuffle(num_train).repeat()  #打乱顺序
dataset_train = dataset_train.map(preproc, num_parallel_calls=tf.data.experimental.AUTOTUNE)
dataset_train = dataset_train.batch(batch_size).prefetch(tf.data.experimental.AUTOTUNE) #一批次处理多少份dataset_vali = tf.data.Dataset.from_tensor_slices((fpath_vali, label_vali))
dataset_vali = dataset_vali.shuffle(num_vali).repeat()
dataset_vali = dataset_vali.map(preproc, num_parallel_calls=tf.data.experimental.AUTOTUNE)
dataset_vali = dataset_vali.batch(batch_size).prefetch(tf.data.experimental.AUTOTUNE)
# -----------------------------------------------------------------------------# AlexNet  算法模型
model = keras.Sequential(name='Alexnet')
#第1层
model.add(layers.Conv2D(filters=96, kernel_size=(11,11),strides=(4,4), padding='valid',input_shape=(resize,resize,3),activation='relu'))
model.add(layers.BatchNormalization())
#第1层池化
model.add(layers.MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='valid'))
#第2层
model.add(layers.Conv2D(filters=256, kernel_size=(5,5), strides=(1,1), padding='same', activation='relu'))
model.add(layers.BatchNormalization())
#第2层池化
model.add(layers.MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='valid'))
#第3层
model.add(layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'))
#第4层
model.add(layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'))
#第5层
model.add(layers.Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='valid'))
#第6,7,8层
model.add(layers.Flatten())
model.add(layers.Dense(4096, activation='relu'))
model.add(layers.Dropout(0.5))model.add(layers.Dense(4096, activation='relu'))
model.add(layers.Dropout(0.5))model.add(layers.Dense(1000, activation='relu'))
model.add(layers.Dropout(0.5))# Output Layer
model.add(layers.Dense(2, activation='softmax'))# Training 优化器
model.compile(loss='categorical_crossentropy',optimizer='sgd',           #梯度下降法metrics=['accuracy'])history = model.fit(dataset_train,steps_per_epoch = num_train//batch_size,epochs = epochs,         #迭代次数validation_data = dataset_vali,validation_steps = num_vali//batch_size,verbose = 1)
#评分标准
# scores = model.evaluate(train_data, train_label, verbose=1)
scores = model.evaluate(dataset_train, steps=num_train//batch_size, verbose=1)
print(scores)# scores = model.evaluate(test_data, test_label, verbose=1)
scores = model.evaluate(dataset_vali, steps=num_vali//batch_size, verbose=1)
print(scores)
#保存模型
model.save('./model/mask.h5')# Record loss and acc
history_dict = history.history
train_loss = history_dict['loss']
train_accuracy = history_dict['accuracy']
val_loss = history_dict['val_loss']
val_accuracy = history_dict['val_accuracy']# Draw loss
plt.figure()
plt.plot(range(epochs), train_loss, label='train_loss')
plt.plot(range(epochs), val_loss, label='val_loss')
plt.legend()
plt.xlabel('epochs')
plt.ylabel('loss')# Draw acc
plt.figure()
plt.plot(range(epochs), train_accuracy, label='train_accuracy')
plt.plot(range(epochs), val_accuracy, label='val_accuracy')
plt.legend()
plt.xlabel('epochs')
plt.ylabel('accuracy')# Display
plt.show()print('Task finished')

三、模型训练结果展示

  程序中只采用了5次迭代,具体工程也是远远不够的,在此也同样仅仅做流程说明,所以不做要求。

  1. 显示loss
  2. 显示acc

四、测试集

  简单测试,所以只采用了2张图片。

五、测试模型代码

import cv2from tensorflow.keras.models import load_modelresize = 224
label = ('戴口罩!', '没戴口罩')image = cv2.resize(cv2.imread('./test/test1.jpg'),(resize,resize))
image = image.astype("float") / 255.0image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))model = load_model('./model/mask.h5')
predict = model.predict(image)
i = predict.argmax(axis=1)[0]
print(label[i])

六、测试结果

七、参考信息

  • http://edu.cstor.cn/#/

人工智能与深度学习实战(4)——口罩佩戴识别(CNN)相关推荐

  1. 人工智能:深度学习算法及应用——简单理解CNN卷积神经网络并python实现(带源码)

    深度学习算法及应用 一. 实验目的 二. 实验要求 三. 实验的硬件.软件平台 四. 实验原理 1.1. 深度学习概述 1.2. 深度学习的常见结构 1.3. 卷积神经网络(CNN) **卷积** * ...

  2. 深度学习实战——手写数字识别

    一,算法介绍 代码和数据来自知乎帖 https://zhuanlan.zhihu.com/p/274610199 不过文中的错误代码有点多...有的是看评论改的,有的是我自己改的. 这个算法全部放在一 ...

  3. 深度学习实战02-卷积神经网络(CNN)实现服装图像分类

    ​ ​ 活动地址:CSDN21天学习挑战赛 参考文章:https://mtyjkh.blog.csdn.net/article/details/116992196 一.前期准备 1. 设置GPU 如果 ...

  4. #21天学习挑战赛—深度学习实战100例#——验证码识别

    ​ ​ 活动地址:CSDN21天学习挑战赛 本文为

  5. 深度学习实战—手写数字识别

    文章目录 一.mnist数据集训练集下载 二.pytorch pycharm 三.直接运行python githup上的开源代码 四.参考视频和开源代码 一.mnist数据集训练集下载 直接运行下面的 ...

  6. 深度学习实战5-卷积神经网络(CNN)中文OCR识别项目

    文章目录 一.前期工作 导入库 图片生成函数 导入数据 生成数据集函数 二.CNN模型建立 三.训练模型函数 四.训练模型与结果 五.验证 大家好,我是微学AI,今天给大家带来一个利用卷积神经网络(C ...

  7. 深度学习实战14(进阶版)-手写文字OCR识别,手写笔记也可以识别了

    大家好,我是微学AI,今天给大家带来手写OCR识别的项目.手写的文稿在日常生活中较为常见,比如笔记.会议记录,合同签名.手写书信等,手写体的文字到处都有,所以针对手写体识别也是有较大的需求.目前手写体 ...

  8. 深度学习实战6-卷积神经网络(Pytorch)+聚类分析实现空气质量与天气预测

    文章目录 一.前期工作 导入库包 导入数据 主成分分析(PCA) 聚类分析(K-means) 二.神经网络模型建立 三.检验模型 大家好,我是微学AI,今天给大家带来一个利用卷积神经网络(pytorc ...

  9. 深度学习实战1-(keras框架)企业数据分析与预测

    大家好,我是微学AI,今天给大家带来深度学习框架keras的实战项目,用于基本的企业数据分析,预测企业净利润情况,并利用灰色预测函数GM11进行预测模型.我们拿到企业数据,这里参数抽象成x1-x9,y ...

  10. 深度学习实战3-文本卷积神经网络(TextCNN)新闻文本分类

    文章目录 一.前期工作 1. 设置GPU 2. 导入预处理词库类 二.导入预处理词库类 三.参数设定 四.创建模型 五.训练模型函数 六.测试模型函数 七.训练模型与预测 今天给大家带来一个简单的中文 ...

最新文章

  1. 推荐3个快速开发平台 前后端都有 项目经验又有着落了
  2. 计算机视觉与深度学习 | 不含动态背景的前景目标提取
  3. 真恶心,用安卓模拟器开微信不能找附近的人
  4. char 如何赋空的初值
  5. 利用arcgis将execl数据可视化(点)
  6. linux远程执行迷路,linux操作系统基础
  7. python多进程传递参数_急急急, Python 多进程,如何传递 epoll?
  8. win32开发(对话框启动)
  9. Nisus Writer Pro for Mac拆分视图和注释技巧
  10. 基于ATMEGA128单片机的播种机控制系统
  11. 教程 海湾主机crt_海湾消防主机JB-QT-GST5000火灾报警控制器(联动型)与crt是怎么连接编公式的...
  12. 聚类分析-K-means clustering 在生物信息学中的应用
  13. nyoj-239 月老的难题 (二分图匹配—匈牙利算法 网络流—Dinic算法)
  14. NIPS2022上的图神经网络相关论文总结
  15. ROCKCHIP PWM模块开发指南
  16. android解决kotlin问题Expecting member declaration
  17. C++初阶习题(牛客)【7】最小公倍数
  18. H.265/HEVC学习笔记:帧内预测编码
  19. MUX实现逻辑功能(反相器/与门/或门/与非门/或非门/异或门/同或门)
  20. python中self image_Python3用tkinter和PIL实现看图工具

热门文章

  1. hdfs MapTask类
  2. Windows核心编程_Edit操作
  3. SpringMVC的Model、Model Map、ModelAndView
  4. springboot Hello World探究
  5. SDWebImage常用方法及原理
  6. CSS3 3D切割轮播图
  7. MySQL系列(三)
  8. python的简单实用小工具(未完待续......)
  9. Win10 不火不行!Edge 无缝兼容 Chrome扩展
  10. java 小程序--杨辉三角