|
| 1 | +import numpy as np |
| 2 | +import keras |
| 3 | +import keras.backend as k |
| 4 | +from keras.layers import Conv2D,MaxPooling2D,SpatialDropout2D,Flatten,Dropout,Dense |
| 5 | +from keras.models import Sequential,load_model |
| 6 | +from keras.optimizers import Adam |
| 7 | +from keras.preprocessing import image |
| 8 | +import cv2 |
| 9 | +import datetime |
| 10 | + |
| 11 | + |
| 12 | +# UNCOMMENT THE FOLLOWING CODE TO TRAIN THE CNN FROM SCRATCH |
| 13 | + |
| 14 | +# BUILDING MODEL TO CLASSIFY BETWEEN MASK AND NO MASK |
| 15 | + |
| 16 | +model=Sequential() |
| 17 | +model.add(Conv2D(32,(3,3),activation='relu',input_shape=(150,150,3))) |
| 18 | +model.add(MaxPooling2D() ) |
| 19 | +model.add(Conv2D(32,(3,3),activation='relu')) |
| 20 | +model.add(MaxPooling2D() ) |
| 21 | +model.add(Conv2D(32,(3,3),activation='relu')) |
| 22 | +model.add(MaxPooling2D() ) |
| 23 | +model.add(Flatten()) |
| 24 | +model.add(Dense(100,activation='relu')) |
| 25 | +model.add(Dense(1,activation='sigmoid')) |
| 26 | + |
| 27 | +model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy']) |
| 28 | + |
| 29 | +from keras.preprocessing.image import ImageDataGenerator |
| 30 | +train_datagen = ImageDataGenerator( |
| 31 | + rescale=1./255, |
| 32 | + shear_range=0.2, |
| 33 | + zoom_range=0.2, |
| 34 | + horizontal_flip=True) |
| 35 | + |
| 36 | +test_datagen = ImageDataGenerator(rescale=1./255) |
| 37 | + |
| 38 | +training_set = train_datagen.flow_from_directory( |
| 39 | + 'train', |
| 40 | + target_size=(150,150), |
| 41 | + batch_size=16 , |
| 42 | + class_mode='binary') |
| 43 | + |
| 44 | +test_set = test_datagen.flow_from_directory( |
| 45 | + 'test', |
| 46 | + target_size=(150,150), |
| 47 | + batch_size=16, |
| 48 | + class_mode='binary') |
| 49 | + |
| 50 | +model_saved=model.fit_generator( |
| 51 | + training_set, |
| 52 | + epochs=10, |
| 53 | + validation_data=test_set, |
| 54 | + |
| 55 | + ) |
| 56 | + |
| 57 | +model.save('mymodel.h5',model_saved) |
| 58 | + |
| 59 | +#To test for individual images |
| 60 | + |
| 61 | +mymodel=load_model('mymodel.h5') |
| 62 | +#test_image=image.load_img('C:/Users/Karan/Desktop/ML Datasets/Face Mask Detection/Dataset/test/without_mask/30.jpg',target_size=(150,150,3)) |
| 63 | +test_image=image.load_img(r'C:/Users/karan/Desktop/FaceMaskDetector/test/with_mask/1-with-mask.jpg', |
| 64 | + target_size=(150,150,3)) |
| 65 | +test_image |
| 66 | +test_image=image.img_to_array(test_image) |
| 67 | +test_image=np.expand_dims(test_image,axis=0) |
| 68 | +mymodel.predict(test_image)[0][0] |
| 69 | + |
| 70 | + |
| 71 | +# IMPLEMENTING LIVE DETECTION OF FACE MASK |
| 72 | + |
| 73 | +mymodel=load_model('mymodel.h5') |
| 74 | + |
| 75 | +cap=cv2.VideoCapture(0) |
| 76 | +face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml') |
| 77 | + |
| 78 | +while cap.isOpened(): |
| 79 | + _,img=cap.read() |
| 80 | + face=face_cascade.detectMultiScale(img,scaleFactor=1.1,minNeighbors=4) |
| 81 | + for(x,y,w,h) in face: |
| 82 | + face_img = img[y:y+h, x:x+w] |
| 83 | + cv2.imwrite('temp.jpg',face_img) |
| 84 | + test_image=image.load_img('temp.jpg',target_size=(150,150,3)) |
| 85 | + test_image=image.img_to_array(test_image) |
| 86 | + test_image=np.expand_dims(test_image,axis=0) |
| 87 | + pred=mymodel.predict(test_image)[0][0] |
| 88 | + if pred==1: |
| 89 | + cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),3) |
| 90 | + cv2.putText(img,'NO MASK',((x+w)//2,y+h+20),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),3) |
| 91 | + else: |
| 92 | + cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),3) |
| 93 | + cv2.putText(img,'MASK',((x+w)//2,y+h+20),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),3) |
| 94 | + datet=str(datetime.datetime.now()) |
| 95 | + cv2.putText(img,datet,(400,450),cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255),1) |
| 96 | + |
| 97 | + cv2.imshow('img',img) |
| 98 | + |
| 99 | + if cv2.waitKey(1)==ord('q'): |
| 100 | + break |
| 101 | + |
| 102 | +cap.release() |
| 103 | +cv2.destroyAllWindows() |
0 commit comments