Table of content
1.Collect Data
- Data Preprocessing
- Visualizing Data
- Build Model
- Train model
- Evaluating Trained Model
- Save a trained model
- Predict on custom data
- Realtime detection
1.Collect data
In every machine learning, problem data is the main.
here, data is collected from Kaggle.
data is a subset of this dataset you can download it from here
2.Data Preprocessing
Before we process data, first structure our data in the right folder.
For this we have two option:
- Use TensorFlow image_dataset_from_directory.
- load CSV file.
Here we choose to load from a CSV file.
For that, we change the image name to withmask and withoutmask.
Withmask
# importing os module
import os
# Function to rename multiple files
def main():
for count, filename in enumerate(os.listdir("DATASET/")):
dst ="withmask." + str(count) + ".jpeg"
src ='DATASET/'+ filename
dst ='DATASET/'+ dst
# rename() function will
# rename all the files
os.rename(src, dst)
# Driver Code
if __name__ == '__main__':
# Calling main() function
main()
Withoutmask
# importing os module
import os
# Function to rename multiple files
def main():
for count, filename in enumerate(os.listdir("New folder/")):
dst ="withoutmask." + str(count) + ".jpeg"
src ='New folder/'+ filename
dst ='New folder/'+ dst
# rename() function will
# rename all the files
os.rename(src, dst)
# Driver Code
if __name__ == '__main__':
# Calling main() function
main()
Now move all images into one folder and create a pandas data frame
Generate DataFrame
import pandas as pd
filenames=os.listdir("FULL_DATA/")
categories=[]
for f_name in filenames:
category=f_name.split('.')[0]
if category=='withmask':
categories.append('withmask')
else:
categories.append('withoutmask')
df=pd.DataFrame({
'filename':filenames,
'labels':categories
})
Save dataFrame into CSV file.
Now data is in the right structure we can load data
- Read CSV file
- Shuffle DataFrame with sample(frac=1)
- Turn label into an Array of Boolean
- Create a validation set with train_test_split
- Turning images into Tensor
# Define image size
IMG_SIZE = 224
# Function
def process_image(image_path, image_size=IMG_SIZE):
"""
Takes an image file path and turns the image into a Tensor.
"""
# Read in an image file
image = tf.io.read_file(image_path)
# Turn the jpg image into numerical Tensor with 3 colour channel(RGB)
image = tf.image.decode_jpeg(image,channels=3)
# Convert the color channel values to (0-1) values
image = tf.image.convert_image_dtype(image,tf.float32)
# Resize the image to (224,224)
image = tf.image.resize(image, size=[image_size,image_size])
return image
- Turning data into Batches
# Create a function to return a tuple (image, label)
def get_image_lable(image_path,label):
"""
Takes an image file path name and the label,
processes the image and return a tuple (image, label).
"""
image = process_image(image_path)
return image, label
# Define the batch size
BATCH_SIZE = 32
# Function to convert data into batches
def create_data_batches(X,y=None, batch_size=BATCH_SIZE,valid_data=False):
"""
Creates batches of data of image (X) and label (y) pairs.
Shuffle the data if it's training data but doesn't shuffle if it's validation data.
"""
# If data is valid dataset (NO SHUFFLE)
if valid_data:
print("Creating valid data batches.........")
data = tf.data.Dataset.from_tensor_slices((tf.constant(X),
tf.constant(y)))
data_batch = data.map(get_image_lable).batch(batch_size)
return data_batch
else:
print("Creating train data batches.........")
# Turn filepaths and labels into Tensors
data = tf.data.Dataset.from_tensor_slices((tf.constant(X),
tf.constant(y)))
# Shuffling pathname and labels before mapping image processor fun
data = data.shuffle(buffer_size=len(X))
data_batch = data.map(get_image_lable).batch(batch_size)
return data_batch
3.Visulizing Data
import matplotlib.pyplot as plt
# Create fun for viewing in a data batch
def show_images(images, labels):
"""
Displays a plot of 25 images and their labels from a data batch.
"""
plt.figure(figsize=(20, 20))
for i in range(25):
# Subplot
ax = plt.subplot(5,5,i+1)
plt.imshow(images[i])
plt.title(unique_category[labels[i].argmax()])
plt.axis("Off")
Call this fun
For Train data
train_images, train_labels = next(train_data.as_numpy_iterator())
show_images(train_images,train_labels)
For valid Data
val_images, val_labels = next(val_data.as_numpy_iterator())
show_images(val_images, val_labels)
4.Building a model
Here we can use the TensorFlow hub for pre-trained models.
For this task, we use MobileNet V2 which is a small model.
- Set input_shape = [none, 224,224,3]
- Set output_shape = 2
- Use Sequential model from tf.keras
# Create a fun to build a keras model
def create_model(input_shape=INPUT_SHAPE,output_shape=OUTPUT_SHAPE, model_url=MODEL_URL):
print("Building model with:", model_url)
# Setup the model
model = tf.keras.Sequential([
hub.KerasLayer(model_url),
tf.keras.layers.Dense(units=output_shape,
activation="softmax")
])
# Compile the model
model.compile(
loss = tf.keras.losses.BinaryCrossentropy(),
optimizer = tf.keras.optimizers.Adam(),
metrics = ["accuracy"]
)
# Build the model
model.build(input_shape)
return model
5. Train a model
Train a model on train_data and valid_data for 25 EPOCHS
Also, add an Early stopping callback
model = create_model()
model.summary()
With this model, val_loss is 0.0096 and Accuracy is almost 99.99 %
6.Evaluating prediction
Using model.predict() on val_data model return NumPy array of shape (_ , 2)
7.Saving and reloading a trained model
Save a trained model using save_model from keras.
Loading a model is a bit different from regular load_model
model = load_model(
'model/model.h5', custom_objects={"KerasLayer": hub.KerasLayer})
here we have to provide custom_objects={“KerasLayer”: hub.KerasLayer} in load_model function alongside model_path.
8.Predict on custom data
Before predicting the new data make sure it is in the right shape as well as the right size.
def test_data(path):
demo = imread(path)
demo = tf.image.convert_image_dtype(demo,tf.float32)
demo = tf.image.resize(demo,size=[224,224])
demo = np.expand_dims(demo,axis=0)
pred = model.predict(demo)
result = unique_category[np.argmax(pred)]
return result
9.Real-time detection
In this, we can use our pre-trained model with OpenCV to make real-time detection.
- Import library
- Use webcam with cv2.VideoCapture()
- Use Haarcascade_frontalface XML file for face detection.
- Predict with the loaded model.
- You can learn more here about OpenCV projects.
you can find the code repo here
patelvivekdev / End-to-end-mask-detector
build deep learning model for mask detection
End-to-end-mask-detector
Build deep learning model for mask detection
Download Data
Use TensorFlow hub model
Predicted image
Use OpenCV for real-time detection.
Hey Readers, thank you for your time. If you liked the blog, don’t forget to appreciate it.
Ai/ML Enthusiast | Blogger
If you have any queries or suggestions feel free to contact me on
Top comments (0)