来源 | Medium
编辑 | 代码医生团队
在本文中,将使用Prajna Bhandary创建的口罩数据集。此数据集由属于1376个的图像with mask和without mask2类。
https://www.linkedin.com/feed/update/urn%3Ali%3Aactivity%3A6655711815361761280/
主要重点是在不靠近人员的情况下检测人员是否戴着口罩。
总览
用简单的话来说,首先,获得带有面部的图像,并通过级联分类器对其进行处理。分类器将给出脸部的关注区域(高度和宽度)。其次,将关注区域的大小调整为a 100x100并将其传递给预先训练的CNN,它将提供作为输出的概率。
步骤1:资料预处理
使用的数据集由颜色,大小和方向不同的图像组成。因此,需要将所有图像转换为灰度,因为需要确保颜色不应成为检测遮罩的关键点。之后,100x100在将其应用于神经网络之前,需要使所有图像具有相同的大小。
import cv2,os
import numpy as np
from keras.utils import np_utils
data_path='dataset'
categories=os.listdir(data_path)
labels=[i for i in range(len(categories))]
label_dict=dict(zip(categories,labels))
data=[]
target=[]
for category in categories:
folder_path=os.path.join(data_path,category)
img_names=os.listdir(folder_path)
for img_name in img_names:
img_path=os.path.join(folder_path,img_name)
img=cv2.imread(img_path)
try:
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
resized=cv2.resize(gray,(100, 100))dataset
data.append(resized)
target.append(label_dict[category])
except Exception as e:
print('Exception:',e)
data=np.array(data)/255.0
data=np.reshape(data,(data.shape[0],100, 100,1))
target=np.array(target)
new_target=np_utils.to_categorical(target)
np.save('data',data)
np.save('target',new_target)
数据预处理
步骤2:训练CNN
这包括2个卷积层(两个Convo2D 100 @ 3x3)。首先,必须从数据预处理中加载数据集。然后,必须配置卷积架构。提供model.add(Dropout(0.5))了摆脱过度拟合的功能。由于有两个类别(带遮罩和不带遮罩),因此可以使用binary_crossentropy。当开始使用模型检查点训练20个纪元时。
import numpy as np
from keras.models import Sequential
from keras.layers import Dense,Activation,Flatten,Dropout
from keras.layers import Conv2D,MaxPooling2D
from keras.callbacks import ModelCheckpoint
from sklearn.model_selection import train_test_split
data=np.load('data.npy')
target=np.load('target.npy')
model=Sequential()
model.add(Conv2D(100,(3,3),input_shape=data.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(100,(3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dropout(0.5))
model.add(Dense(50,activation='relu'))
model.add(Dense(2,activation='softmax'))
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
train_data,test_data,train_target,test_target=train_test_split(data,target,test_size=0.1)
checkpoint = ModelCheckpoint(
'model-{epoch:03d}.model',
monitor='val_loss',
verbose=0,
save_best_only=True,
mode='auto')
history=model.fit(
train_data,
train_target,
epochs=20,
callbacks=[checkpoint],
validation_split=0.2)
print(model.evaluate(test_data,test_target))
训练CNN
请记住,可以使用更多的Convo图层或使用外部训练器(例如MobileNetV2)来提高准确性。
可以绘制图形以做出更好的验证决策。已将其包含在我的存储库中。请参考。
步骤3:侦测有无面具的人脸
首先,必须加载创建的模型。然后,将想要的相机设置为默认相机。
可选-您可以将移动摄像头(Android / IOS)连接到OpenCV。下载适用于您的手机和PC的DroidCam应用程序。并更改代码source = cv2.VideoCapture(1)
其次,需要标记两个概率(0代表with_mask,1代表without_mask)。之后,需要使用RGB值设置边框矩形的颜色。给红色和绿色作为两种颜色。
在无限循环内,将逐帧从相机读取图像并将其转换为灰度并检测面部。for由于训练网络需要4D输入,因此它将循环运行以针对每个脸部并检测感兴趣的区域,将其调整大小并重塑为4D。对于模型,将使用最佳模型来获得结果。此结果由result=[P1, P2]带遮罩或不带遮罩的的概率组成。此后将被标记。
from keras.models import load_model
import cv2
import numpy as np
model = load_model('model-017.model')
face_clsfr=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
source=cv2.VideoCapture(0)
labels_dict={0:'with_mask',1:'without_mask'}
color_dict={0:(0,255,0),1:(0,0,255)}
while(True):
ret,img=source.read()
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces=face_clsfr.detectMultiScale(gray,1.3,5)
for x,y,w,h in faces:
face_img=gray[y:y+w,x:x+w]
resized=cv2.resize(face_img,(100,100))
normalized=resized/255.0
reshaped=np.reshape(normalized,(1,100,100,1))
result=model.predict(reshaped)
label=np.argmax(result,axis=1)[0]
cv2.rectangle(img,(x,y),(x+w,y+h),color_dict[label],2)
cv2.rectangle(img,(x,y-40),(x+w,y),color_dict[label],-1)
cv2.putText(
img, labels_dict[label],
(x, y-10),
cv2.FONT_HERSHEY_SIMPLEX,0.8,(255,255,255),2)
cv2.imshow('LIVE',img)
key=cv2.waitKey(1)
if(key==27):
break
cv2.destroyAllWindows()
source.release()
检测口罩
看一下演示
口罩检测器-Google云端硬盘
https://drive.google.com/open?id=1oLIPBOkCuhej-iNTre_qnlQ3b-fWZeEy
ravindu9701 /脸部检测器
https://github.com/ravindu9701/Face-Mask-Detector.git
结论
如果使用MobileNetV2进行微调,则可以提高准确性。也可以将此模型部署到嵌入式系统。如果正确部署它,可以帮助确保您和他人的安全。
资源资源
https://github.com/prajnasb/observations/tree/master/mask_classifier/Data_Generator
https://www.pyimagesearch.com/2020/05/04/covid-19-face-mask-detector-with-opencv-keras-tensorflow-and-deep-learning/
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有