前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >具有TensorFlow,Keras和OpenCV的实时口罩检测器

具有TensorFlow,Keras和OpenCV的实时口罩检测器

作者头像
代码医生工作室
发布于 2020-06-01 08:48:54
发布于 2020-06-01 08:48:54
1.2K00
代码可运行
举报
文章被收录于专栏:相约机器人相约机器人
运行总次数:0
代码可运行

来源 | Medium

编辑 | 代码医生团队

在本文中,将使用Prajna Bhandary创建的口罩数据集。此数据集由属于1376个的图像with mask和without mask2类。

https://www.linkedin.com/feed/update/urn%3Ali%3Aactivity%3A6655711815361761280/

主要重点是在不靠近人员的情况下检测人员是否戴着口罩。

总览

用简单的话来说,首先,获得带有面部的图像,并通过级联分类器对其进行处理。分类器将给出脸部的关注区域(高度和宽度)。其次,将关注区域的大小调整为a 100x100并将其传递给预先训练的CNN,它将提供作为输出的概率。

步骤1:资料预处理

使用的数据集由颜色,大小和方向不同的图像组成。因此,需要将所有图像转换为灰度,因为需要确保颜色不应成为检测遮罩的关键点。之后,100x100在将其应用于神经网络之前,需要使所有图像具有相同的大小。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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个纪元时。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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]带遮罩或不带遮罩的的概率组成。此后将被标记。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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进行微调,则可以提高准确性。也可以将此模型部署到嵌入式系统。如果正确部署它,可以帮助确保您和他人的安全。

资源资源

  • Github回购

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/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 相约机器人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验