点击上方“码农的后花园”,选择“星标” 公众号
精选文章,第一时间送达
这里手把手教大家,从数据集图像的预处理开始,然后搭建一个7层的浅层的CNN模型,使用Tensorflow和OpenCV单手撸一个卷积神经CNN网络口罩检测模型,浅层的卷积神经网络模型也可以有很好的检测效果哦。
文章目录
一、数据集准备和预处理
二、搭建口罩检测卷积神经网络CNN模型
三、训练并保存口罩检测模型
四、导入人脸检测程序Cascade Classifier检测人脸
五、加载口罩检测模型,预测是否佩戴口罩
一、数据集准备和预处理
数据集: 使用Prajna Bhandary在Github上开源提供的口罩数据集,这个数据集包括大约1376幅图像,其中690幅包含戴口罩的人,686幅图像包含没有戴口罩的人。
数据预处理
使用Kearas中提供的ImageDataGenerator类实现对图片的预处理操作,包括数据增强(旋转、扭曲、翻转、归一化等)、生成一个批次一个批次的图片,以生成器的形式给模型训练。
再使用ImageDataGenerator类中的flow_from_directory函数实现对图片数据的读取和处理,以及图片标签的生成、该方法以训练图片文件夹为路径,生成经过数据增强/归一化的数据,在一个无限循环中生成无限产生batch数据供给模型进行训练,具体代码如下:
print("The number of images with facemask labelled 'yes':",len(os.listdir(r'D:\Project\OpenCV\06_Face-Mask-Detection-master\Data\facemask-dataset\train\with_mask')))
print("The number of images with facemask labelled 'no':",len(os.listdir(r'D:\Project\OpenCV\06_Face-Mask-Detection-master\Data\facemask-dataset\train\without_mask')))
运行结果如下:
二、搭建口罩检测卷积神经网络CNN模型
为了检测是否佩戴口罩,搭建一个7层:Conv2D->MaxPooling2D->Conv2D->Maxpooling2D->Flatten->Dense->Dense的顺序浅层CNN模型用来预测,这个模型实际上就是实现二分类,佩戴口罩with_mask和without_mask,使用的损失函数是二元交叉熵损失binary_crossentropy,网络结构图如下:
创建模型:
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(100, (3,3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(100, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(50, activation='relu'),
tf.keras.layers.Dense(2, activation='softmax')
])
print(model.summary())
模型结构网络如下:
三、训练并保存口罩检测模型
训练之前我们需要对模型进行一些简单的配置:优化器、损失函数的定义、以及训练过程记录的回调函数checkpoint,训练完之后使用keras自带的model.save()方法以h5文件格式将模型结构完整保存下来。
#编译模型
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['mse','acc'])
#模型训练记录
checkpoint = ModelCheckpoint('model-{epoch:03d}.model',monitor='val_loss',verbose=0,save_best_only=True,mode='auto')
#训练模型
history = model.fit_generator(train_generator,
epochs=8,
# validation_data=validation_generator,
callbacks=[checkpoint])
#模型保存
model.save(filepath=r'D:\Project\OpenCV\06_Face-Mask-Detection-master\mask_model.h5') #保存模型到那个文件路径
训练结果如下:
绘制最终训练损失和准确率变化曲线图:
#模型训练结果展示
print(history.history.keys())
# loss
plt.plot(history.epoch,history.history.get('loss'),color='green',label = 'loss')
# acc
plt.plot(history.epoch,history.history.get('acc'),color='red',label = 'acc')
plt.legend()
plt.show()
变化曲线图如下,我们可以看到准确率在上升,但是缓慢,损失值在下降,有坡度,说明模型还可以进一步优化,比如加深网络或者增加数据集的多样性。
四、导入人脸检测程序Cascade Classifier检测人脸
在检测是否佩戴口罩之前,首先我们需要实现人脸检测,这里使用OpenCV内置的基于Haar特征的级联分类器->CascadeClassifier来检测人脸的特征。
CascadeClassifier:是opencv下目标检测模块中用来检测目标的级联分类器的一个类,简单来说就是采用滑动窗口机制+级联分类器的形式,级联分类器包括:训练和检测,这里直接使用训练好的去检测人脸classifier.detectMultiScale方法。
# We load the xml fileclassifier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 载入图像img_eye = cv2.imread(r'D:\Project\OpenCV\06_Face-Mask-Detection-master\Data\facemask-dataset\without_mask\1.jpg')# 利用分类器进行检测eyeRects = classifier.detectMultiScale(img_eye, 1.2, 2, cv2.CASCADE_DO_CANNY_PRUNING, (20, 20))# 检测结果if len(eyeRects) > 0: counter = 0for eyeRect in eyeRects: counter += 1 x, y, w, h = eyeRect cv2.rectangle(img_eye, (int(x), int(y)), (int(x + w), int(y + h)), (0, 255, 0), 2, 8)cv2.imshow('eye', img_eye)cv2.waitKey()
检测结果如下:
五、加载口罩检测模型,预测是否佩戴口罩
检测到人脸区域之后,再使用keras自带的load_model方法加载我们已经训练好了的口罩检测模型,具体代码见detect.py,检测结果如下:
#加载模型
mask_model = tf.keras.models.load_model(filepath=r'D:\Project\OpenCV\06_Face-Mask-Detection-master\mask_model.h5') #要加载模型的路径
#导入人脸检测程序
face_clsfr=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 标记信息
labels_dict={0:'without_mask',1:'with_mask'}
color_dict={0:(0,0,255),1:(0,255,0)}
检测图如下:
六、代码下载和环境设置
完整代码下载,回复:项目实战,即可获取数据集和源代码,本机环境设置如下:
python==3.6
tensorflow-gpu==1.13.1
keras==2.1.5
更多优质内容?等你点在看