├── .gitignore ├── CNN.py ├── DataPreprocessing.py ├── Detector_MTCNN.py ├── DirectoryStructure.ipynb ├── FaceExtraction.ipynb ├── Filter ├── filter15.png └── filter9.png ├── GIFS ├── mask.gif └── mask2.gif ├── Graph ├── ResNet9trainingraph.png ├── lr.png ├── res9vsres15.png └── resnet15.png ├── LICENSE ├── Readme.md ├── testingCNNmodels.ipynb └── training.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /CNN.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """CNN.ipynb 3 | 4 | Automatically generated by Colaboratory. 5 | 6 | Original file is located at 7 | https://colab.research.google.com/drive/1bsDqsK60vP02Uk8Baei6mIIlzIGaKhE9 8 | 9 | #CNN 10 | """ 11 | 12 | import torch.nn as nn 13 | 14 | def conv_block(in_channels, out_channels, pooling=False): 15 | ''' 16 | params: in_channels: (int) number of input channels 17 | params: out_channels: (int) number of output channels 18 | params: pooling: (bool) use pooling or not 19 | return: convolutional layers 20 | ''' 21 | conv_layers = nn.Sequential( 22 | nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1, stride=1), 23 | nn.BatchNorm2d(out_channels), 24 | nn.ReLU() 25 | ) 26 | if pooling: 27 | conv_layers.add_module('max_pooling',nn.MaxPool2d(2)) 28 | return conv_layers 29 | 30 | class ResNet9(nn.Module): 31 | def __init__(self, in_channels, num_classes): 32 | super().__init__() 33 | 34 | #1st Block 35 | self.conv1 = conv_block(in_channels, 64)#input size 1*128*128 36 | self.conv2 = conv_block(64, 128, True) #After pooling 64*64*64 37 | #Residual layer 38 | self.res1 = nn.Sequential(conv_block(128,128), conv_block(128,128)) 39 | 40 | #2nd Block 41 | self.conv3 = conv_block(128, 256, True) #After pooling 256*32*32 42 | self.conv4 = conv_block(256, 512, True) #After pooling 512*16*16 43 | #Residual layer 44 | self.res2 = nn.Sequential(conv_block(512,512), conv_block(512,512)) 45 | 46 | #Linear Network 47 | self.linear = nn.Sequential( 48 | nn.MaxPool2d(16), #After pooling 512*1*1 49 | nn.Flatten(), # 512 50 | nn.Linear(512, num_classes), 51 | nn.LogSoftmax() 52 | ) 53 | 54 | def forward(self,x): 55 | #Block-1 56 | out = self.conv1(x) 57 | out = self.conv2(out) 58 | res1 = self.res1(out) + out 59 | 60 | #Block-2 61 | out = self.conv3(res1) 62 | out = self.conv4(out) 63 | res2 = self.res2(out) + out 64 | 65 | #Linear network 66 | out = self.linear(res2) 67 | return out 68 | 69 | class ResNet15(nn.Module): 70 | def __init__(self, in_channels, num_classes): 71 | super().__init__() 72 | 73 | #1st Block 74 | self.conv1 = conv_block(in_channels, 64) #inputs size 1*128*128 75 | self.conv2 = conv_block(64, 128, True) #After pooling 64*64*64 76 | #Residual layer 77 | self.res1 = nn.Sequential(conv_block(128,128), conv_block(128,128)) 78 | 79 | #2nd Block 80 | self.conv3 = conv_block(128, 256, True) #After pooling 256*32*32 81 | self.conv4 = conv_block(256, 512, True) #After pooling 512*16*16 82 | #Residual layer 83 | self.res2 = nn.Sequential(conv_block(512,512), conv_block(512,512)) 84 | 85 | #3rd Block 86 | self.conv5 = conv_block(512, 512, True) #After pooling 512*8*8 87 | self.conv6 = conv_block(512, 1024, True) #After pooling 1024*4*4 88 | #Residual layer 89 | self.res3 = nn.Sequential(conv_block(1024,1024), conv_block(1024,1024)) 90 | 91 | 92 | #Linear Network 93 | self.linear = nn.Sequential( 94 | nn.MaxPool2d(4), #After pooling 1024*1*1 95 | nn.Flatten(), # 1024 96 | nn.Linear(1024, 512), 97 | nn.ReLU(), 98 | nn.Linear(512,128), 99 | nn.ReLU(), 100 | nn.Linear(128,num_classes), 101 | nn.LogSoftmax() 102 | ) 103 | 104 | def forward(self,x): 105 | #Block-1 106 | out = self.conv1(x) 107 | out = self.conv2(out) 108 | res1 = self.res1(out) + out 109 | 110 | #Block-2 111 | out = self.conv3(res1) 112 | out = self.conv4(out) 113 | res2 = self.res2(out) + out 114 | 115 | #Block-3 116 | out = self.conv5(res2) 117 | out = self.conv6(out) 118 | res3 = self.res3(out) + out 119 | 120 | #Linear network 121 | out = self.linear(res3) 122 | return out -------------------------------------------------------------------------------- /DataPreprocessing.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """DataPreprocessing.ipynb 3 | 4 | Automatically generated by Colaboratory. 5 | 6 | Original file is located at 7 | https://colab.research.google.com/drive/1iZLQ3IqfMJ-DBVLYl4J9KPZInf_xoGxW 8 | 9 | #Data Preprocessing 10 | """ 11 | 12 | #Importing required libraries 13 | 14 | from torchvision.datasets import ImageFolder 15 | from torchvision import transforms 16 | import numpy as np 17 | import torch 18 | 19 | class Preprocessing(): 20 | # This class will transforms every images into the applied transforms. 21 | # And it returns the dataset as tensor dataset and the categories 22 | 23 | def __init__(self, path=None, img=None): 24 | ''' 25 | params: path: (str) directory to the image folder 26 | params: array: (array) image array 27 | ''' 28 | self.directory = path 29 | self.img = img 30 | 31 | def __image_transformation(self): 32 | ''' 33 | params: None 34 | return: transformations 35 | ''' 36 | transform = transforms.Compose([ 37 | transforms.Resize((130,130)), 38 | transforms.CenterCrop(128), 39 | transforms.Grayscale(1), 40 | transforms.ToTensor(), 41 | transforms.Normalize(0.5,0.5) 42 | ]) 43 | return transform 44 | 45 | 46 | def preprocessed_arrays(self): 47 | #For predicting 48 | ''' 49 | params: None 50 | return: (array) single Tensor data 51 | ''' 52 | img = self.img 53 | transforms = self.__image_transformation() 54 | return torch.tensor(np.expand_dims(transforms(img),0)) 55 | 56 | def preprocessed_dataset(self): 57 | ''' 58 | params: None 59 | return: Tensor dataset 60 | ''' 61 | #Using torch's ImageFolder to get data from directory and applying 62 | #transforms 63 | transformations = transforms.Compose([ 64 | transforms.RandomHorizontalFlip(), 65 | transforms.RandomPerspective(0.2,p=0.5), 66 | self.__image_transformation()]) 67 | 68 | dataset_train = ImageFolder(self.directory['train'], 69 | transform= transformations) 70 | dataset_test = ImageFolder(self.directory['test'], 71 | transform= self.__image_transformation()) 72 | 73 | 74 | return dataset_train, dataset_test 75 | 76 | -------------------------------------------------------------------------------- /Detector_MTCNN.py: -------------------------------------------------------------------------------- 1 | #Importing libraries 2 | from facenet_pytorch import MTCNN 3 | import cv2 as cv 4 | from PIL import Image 5 | import torch 6 | from math import ceil as r 7 | 8 | #Importing modules 9 | from CNN import ResNet15, ResNet9 10 | from DataPreprocessing import Preprocessing 11 | 12 | device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') 13 | 14 | #model 15 | model = ResNet15(1,2).to(device) 16 | #model = ResNet15(1,2) 17 | 18 | state_dict = torch.load('state_dict_resnet15.pth', map_location=device) 19 | #loading the state_dict to the model 20 | model.load_state_dict(state_dict) 21 | 22 | #the classifier 23 | mtcnn = MTCNN(select_largest=False, device=device) 24 | 25 | # Load a single image and display 26 | cap = cv.VideoCapture(0) 27 | 28 | labels = { 29 | 0:'with mask', 30 | 1:'without mask' 31 | } 32 | color_dict={ 33 | 0:(255,0,255), 34 | 1:(255,0,0) 35 | } 36 | 37 | def resize(frame, height, width): 38 | if height and width >= 1000: 39 | return cv.resize(frame, (r(height*0.5), r(width*0.5))) 40 | elif height and width >= 2500: 41 | return cv.resize(frame, (r(height*0.7), r(width*0.7))) 42 | else: 43 | return cv.resize(frame, (height, width)) 44 | 45 | while True: 46 | success, frame = cap.read() 47 | 48 | if success: 49 | width, height, _ = frame.shape 50 | # if the video is too big uncomment the below code 51 | #frame = resize(frame, height, width) 52 | 53 | #padding the image to avoid the bounding box going out of the image 54 | #and crashes the program 55 | padding = cv.copyMakeBorder(frame, 50,50,50,50, cv.BORDER_CONSTANT) 56 | #converting numpy array into image 57 | image = Image.fromarray(padding) 58 | 59 | #gives the face co-ordinates 60 | face_coord,_ = mtcnn.detect(image) 61 | 62 | 63 | if face_coord is not None: 64 | for coord in face_coord: 65 | for x1,y1,x2,y2 in [coord]: 66 | x1,y1,x2,y2 = r(x1),r(y1),r(x2),r(y2) 67 | 68 | #face array 69 | face = padding[y1:y2 ,x1:x2] 70 | 71 | #Preprocessing 72 | preprocess = Preprocessing(img=Image.fromarray(face)) 73 | #tensor array 74 | tensor_img_array = preprocess.preprocessed_arrays() 75 | 76 | #Predicting 77 | prob, label = torch.max(torch.exp(model( 78 | tensor_img_array.to(device))),dim=1) 79 | 80 | scale = round((y2-y1)*35/100) 81 | #mini box 82 | cv.rectangle(frame, (x1-50,y1-50), (x1-40,y1-40), 83 | color_dict[label.item()],-1) 84 | 85 | #Bounding box 86 | cv.rectangle(frame, (x1-50,y1-50), (x2-50,y2-50), 87 | color_dict[label.item()],1) 88 | 89 | cv.putText(frame,labels[label.item()], 90 | (x1-50,y1-53),cv.FONT_HERSHEY_SIMPLEX, 91 | scale*0.01,(255,255,0),1) 92 | 93 | cv.imshow("Frame", frame) 94 | # im = Image.fromarray(frame) 95 | # im.save('mask/a%s.png'%(a)) 96 | if cv.waitKey(1) & 0xFF == ord('q'): 97 | break 98 | 99 | 100 | else: 101 | print('End') 102 | break 103 | 104 | cap.release() 105 | cv.destroyAllWindows() 106 | 107 | -------------------------------------------------------------------------------- /DirectoryStructure.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "DirectoryStructure.ipynb", 7 | "provenance": [] 8 | }, 9 | "kernelspec": { 10 | "name": "python3", 11 | "display_name": "Python 3" 12 | } 13 | }, 14 | "cells": [ 15 | { 16 | "cell_type": "markdown", 17 | "metadata": { 18 | "id": "dkSk2uFilchj", 19 | "colab_type": "text" 20 | }, 21 | "source": [ 22 | "directory of the dataset before.\n", 23 | "```\n", 24 | ".\n", 25 | "│─── dataset\n", 26 | " └── with mask\n", 27 | " └── without mask\n", 28 | "\n", 29 | "```\n", 30 | "directory of the dataset after(goal).\n", 31 | "```\n", 32 | ".\n", 33 | "│─── dataset\n", 34 | " |──test\n", 35 | " | ├── with mask\n", 36 | " | └── without mask\n", 37 | " |──test\n", 38 | " ├── with mask\n", 39 | " └── without mask\n", 40 | "\n", 41 | "```\n", 42 | "\n" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "metadata": { 48 | "id": "5fL95hhf53YX", 49 | "colab_type": "code", 50 | "colab": {} 51 | }, 52 | "source": [ 53 | "#Importing libraries\n", 54 | "import os, math\n", 55 | "from google.colab import drive" 56 | ], 57 | "execution_count": null, 58 | "outputs": [] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "metadata": { 63 | "id": "bvro868C59Vq", 64 | "colab_type": "code", 65 | "colab": { 66 | "base_uri": "https://localhost:8080/", 67 | "height": 34 68 | }, 69 | "outputId": "992f1842-3c70-45ff-b95e-dda110f4363c" 70 | }, 71 | "source": [ 72 | "drive.mount('/content/gdrive')\n", 73 | "dir_ = '/content/gdrive/My Drive/Colab Notebooks/Face mask/dataset'" 74 | ], 75 | "execution_count": null, 76 | "outputs": [ 77 | { 78 | "output_type": "stream", 79 | "text": [ 80 | "Mounted at /content/gdrive\n" 81 | ], 82 | "name": "stdout" 83 | } 84 | ] 85 | }, 86 | { 87 | "cell_type": "code", 88 | "metadata": { 89 | "id": "_R0y19SDaszr", 90 | "colab_type": "code", 91 | "colab": {} 92 | }, 93 | "source": [ 94 | "#changing the directory to the dataset\n", 95 | "os.chdir(dir_)" 96 | ], 97 | "execution_count": null, 98 | "outputs": [] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "metadata": { 103 | "id": "33WWDgPs6kOY", 104 | "colab_type": "code", 105 | "colab": {} 106 | }, 107 | "source": [ 108 | "def folder_maker(folder_names):\n", 109 | " '''\n", 110 | " This functions creates a new folder.\n", 111 | "\n", 112 | " params: folders: folder name\n", 113 | " return: None\n", 114 | " '''\n", 115 | " for x in folder_names:\n", 116 | " #checking if the folder exist or not\n", 117 | " if not os.path.isdir(x):\n", 118 | " os.mkdir(x)\n", 119 | " else:\n", 120 | " pass\n", 121 | "\n", 122 | "folder_names = ['test','train','train/with mask','train/without mask',\n", 123 | " 'test/with mask', 'test/without mask']\n", 124 | "\n", 125 | "\n", 126 | "folder_maker(folder_names)" 127 | ], 128 | "execution_count": null, 129 | "outputs": [] 130 | }, 131 | { 132 | "cell_type": "code", 133 | "metadata": { 134 | "id": "aS26T41jKAe4", 135 | "colab_type": "code", 136 | "colab": {} 137 | }, 138 | "source": [ 139 | "#getting the images from the folders\n", 140 | "with_mask_dir = os.listdir('with mask')\n", 141 | "without_mask_dir = os.listdir('without mask')" 142 | ], 143 | "execution_count": null, 144 | "outputs": [] 145 | }, 146 | { 147 | "cell_type": "code", 148 | "metadata": { 149 | "id": "WTwkEPv0IVS-", 150 | "colab_type": "code", 151 | "colab": {} 152 | }, 153 | "source": [ 154 | "#12% of the data will be for the test dataset\n", 155 | "test_size_with = math.ceil(len(with_mask_dir)*12/100)\n", 156 | "test_size_without = math.ceil(len(without_mask_dir)*12/100)" 157 | ], 158 | "execution_count": null, 159 | "outputs": [] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "metadata": { 164 | "id": "0ssxVk2yIzsJ", 165 | "colab_type": "code", 166 | "colab": {} 167 | }, 168 | "source": [ 169 | "def move_withRange(items,range,from_, to):\n", 170 | " '''\n", 171 | " This function will move the data from one\n", 172 | " directory to other.\n", 173 | "\n", 174 | " params: items: the images\n", 175 | " params: range: number of data to move\n", 176 | " params: from_: directory from where the data to be moved\n", 177 | " params: to: desired directory to move in the data\n", 178 | " '''\n", 179 | " for img_name in items[:range]:\n", 180 | " os.replace('%s/%s'%(from_, img_name), '%s/%s'%(to,img_name))\n", 181 | "\n", 182 | "move_withRange(without_mask_dir, test_size_without, 'without mask', 'test/without mask')\n", 183 | "move_withRange(with_mask_dir, test_size_with, 'with mask', 'test/with mask')" 184 | ], 185 | "execution_count": null, 186 | "outputs": [] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "metadata": { 191 | "id": "MaVFMkPogwvZ", 192 | "colab_type": "code", 193 | "colab": {} 194 | }, 195 | "source": [ 196 | "def move(items,from_, to):\n", 197 | " '''\n", 198 | " This is similar to the other fn but this\n", 199 | " function will move the entier data.\n", 200 | " '''\n", 201 | " for img_name in items:\n", 202 | " os.replace('%s/%s'%(from_, img_name), '%s/%s'%(to,img_name))\n", 203 | "\n", 204 | "move(with_mask_dir, 'with mask', 'train/with mask')\n", 205 | "move(without_mask_dir, 'without mask', 'train/without mask')" 206 | ], 207 | "execution_count": null, 208 | "outputs": [] 209 | }, 210 | { 211 | "cell_type": "code", 212 | "metadata": { 213 | "id": "GGFR-kR8j9YG", 214 | "colab_type": "code", 215 | "colab": {} 216 | }, 217 | "source": [ 218 | "" 219 | ], 220 | "execution_count": null, 221 | "outputs": [] 222 | } 223 | ] 224 | } -------------------------------------------------------------------------------- /FaceExtraction.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "FaceExtraction.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [] 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | } 14 | }, 15 | "cells": [ 16 | { 17 | "cell_type": "markdown", 18 | "metadata": { 19 | "id": "g7HmeiKGDjsJ", 20 | "colab_type": "text" 21 | }, 22 | "source": [ 23 | "The dataset contains irrelevant things like the background behind the face and \n", 24 | "upper part of the body. Training with those irrelevant stuffs makes the network\n", 25 | "poor during testing." 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "metadata": { 31 | "id": "_1JLukWpDpHM", 32 | "colab_type": "code", 33 | "colab": { 34 | "base_uri": "https://localhost:8080/", 35 | "height": 225 36 | }, 37 | "outputId": "25b84d8e-cad1-4dcd-8168-453a7ba1966b" 38 | }, 39 | "source": [ 40 | "#Importing libraries\n", 41 | "import os\n", 42 | "from PIL import Image\n", 43 | "import matplotlib.pyplot as plt\n", 44 | "import torchvision.transforms as t\n", 45 | "from math import ceil as r\n", 46 | "!pip install facenet_pytorch\n", 47 | "from facenet_pytorch import MTCNN" 48 | ], 49 | "execution_count": null, 50 | "outputs": [ 51 | { 52 | "output_type": "stream", 53 | "text": [ 54 | "Collecting facenet_pytorch\n", 55 | "\u001b[?25l Downloading https://files.pythonhosted.org/packages/58/26/9dbb553500bff164cdcd491785cfe55dcbb34b431d44f655640476db8d82/facenet_pytorch-2.2.9-py3-none-any.whl (1.9MB)\n", 56 | "\r\u001b[K |▏ | 10kB 18.2MB/s eta 0:00:01\r\u001b[K |▍ | 20kB 6.2MB/s eta 0:00:01\r\u001b[K |▌ | 30kB 6.0MB/s eta 0:00:01\r\u001b[K |▊ | 40kB 6.8MB/s eta 0:00:01\r\u001b[K |▉ | 51kB 6.3MB/s eta 0:00:01\r\u001b[K |█ | 61kB 7.0MB/s eta 0:00:01\r\u001b[K |█▏ | 71kB 7.3MB/s eta 0:00:01\r\u001b[K |█▍ | 81kB 7.9MB/s eta 0:00:01\r\u001b[K |█▋ | 92kB 7.4MB/s eta 0:00:01\r\u001b[K |█▊ | 102kB 7.8MB/s eta 0:00:01\r\u001b[K |██ | 112kB 7.8MB/s eta 0:00:01\r\u001b[K |██ | 122kB 7.8MB/s eta 0:00:01\r\u001b[K |██▎ | 133kB 7.8MB/s eta 0:00:01\r\u001b[K |██▍ | 143kB 7.8MB/s eta 0:00:01\r\u001b[K |██▋ | 153kB 7.8MB/s eta 0:00:01\r\u001b[K |██▉ | 163kB 7.8MB/s eta 0:00:01\r\u001b[K |███ | 174kB 7.8MB/s eta 0:00:01\r\u001b[K |███▏ | 184kB 7.8MB/s eta 0:00:01\r\u001b[K |███▎ | 194kB 7.8MB/s eta 0:00:01\r\u001b[K |███▌ | 204kB 7.8MB/s eta 0:00:01\r\u001b[K |███▋ | 215kB 7.8MB/s eta 0:00:01\r\u001b[K |███▉ | 225kB 7.8MB/s eta 0:00:01\r\u001b[K |████ | 235kB 7.8MB/s eta 0:00:01\r\u001b[K |████▏ | 245kB 7.8MB/s eta 0:00:01\r\u001b[K |████▍ | 256kB 7.8MB/s eta 0:00:01\r\u001b[K |████▌ | 266kB 7.8MB/s eta 0:00:01\r\u001b[K |████▊ | 276kB 7.8MB/s eta 0:00:01\r\u001b[K |████▉ | 286kB 7.8MB/s eta 0:00:01\r\u001b[K |█████ | 296kB 7.8MB/s eta 0:00:01\r\u001b[K |█████▎ | 307kB 7.8MB/s eta 0:00:01\r\u001b[K |█████▍ | 317kB 7.8MB/s eta 0:00:01\r\u001b[K |█████▋ | 327kB 7.8MB/s eta 0:00:01\r\u001b[K |█████▊ | 337kB 7.8MB/s eta 0:00:01\r\u001b[K |██████ | 348kB 7.8MB/s eta 0:00:01\r\u001b[K |██████ | 358kB 7.8MB/s eta 0:00:01\r\u001b[K |██████▎ | 368kB 7.8MB/s eta 0:00:01\r\u001b[K |██████▌ | 378kB 7.8MB/s eta 0:00:01\r\u001b[K |██████▋ | 389kB 7.8MB/s eta 0:00:01\r\u001b[K |██████▉ | 399kB 7.8MB/s eta 0:00:01\r\u001b[K |███████ | 409kB 7.8MB/s eta 0:00:01\r\u001b[K |███████▏ | 419kB 7.8MB/s eta 0:00:01\r\u001b[K |███████▎ | 430kB 7.8MB/s eta 0:00:01\r\u001b[K |███████▌ | 440kB 7.8MB/s eta 0:00:01\r\u001b[K |███████▊ | 450kB 7.8MB/s eta 0:00:01\r\u001b[K |███████▉ | 460kB 7.8MB/s eta 0:00:01\r\u001b[K |████████ | 471kB 7.8MB/s eta 0:00:01\r\u001b[K |████████▏ | 481kB 7.8MB/s eta 0:00:01\r\u001b[K |████████▍ | 491kB 7.8MB/s eta 0:00:01\r\u001b[K |████████▌ | 501kB 7.8MB/s eta 0:00:01\r\u001b[K |████████▊ | 512kB 7.8MB/s eta 0:00:01\r\u001b[K |█████████ | 522kB 7.8MB/s eta 0:00:01\r\u001b[K |█████████ | 532kB 7.8MB/s eta 0:00:01\r\u001b[K |█████████▎ | 542kB 7.8MB/s eta 0:00:01\r\u001b[K |█████████▍ | 552kB 7.8MB/s eta 0:00:01\r\u001b[K |█████████▋ | 563kB 7.8MB/s eta 0:00:01\r\u001b[K |█████████▊ | 573kB 7.8MB/s eta 0:00:01\r\u001b[K |██████████ | 583kB 7.8MB/s eta 0:00:01\r\u001b[K |██████████▏ | 593kB 7.8MB/s eta 0:00:01\r\u001b[K |██████████▎ | 604kB 7.8MB/s eta 0:00:01\r\u001b[K |██████████▌ | 614kB 7.8MB/s eta 0:00:01\r\u001b[K |██████████▋ | 624kB 7.8MB/s eta 0:00:01\r\u001b[K |██████████▉ | 634kB 7.8MB/s eta 0:00:01\r\u001b[K |███████████ | 645kB 7.8MB/s eta 0:00:01\r\u001b[K |███████████▏ | 655kB 7.8MB/s eta 0:00:01\r\u001b[K |███████████▍ | 665kB 7.8MB/s eta 0:00:01\r\u001b[K |███████████▌ | 675kB 7.8MB/s eta 0:00:01\r\u001b[K |███████████▊ | 686kB 7.8MB/s eta 0:00:01\r\u001b[K |███████████▉ | 696kB 7.8MB/s eta 0:00:01\r\u001b[K |████████████ | 706kB 7.8MB/s eta 0:00:01\r\u001b[K |████████████▏ | 716kB 7.8MB/s eta 0:00:01\r\u001b[K |████████████▍ | 727kB 7.8MB/s eta 0:00:01\r\u001b[K |████████████▋ | 737kB 7.8MB/s eta 0:00:01\r\u001b[K |████████████▊ | 747kB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████ | 757kB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████ | 768kB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████▎ | 778kB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████▍ | 788kB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████▋ | 798kB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████▉ | 808kB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████ | 819kB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████▏ | 829kB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████▎ | 839kB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████▌ | 849kB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████▋ | 860kB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████▉ | 870kB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████ | 880kB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████▏ | 890kB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████▍ | 901kB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████▌ | 911kB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████▊ | 921kB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████▉ | 931kB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████ | 942kB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████▏ | 952kB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████▍ | 962kB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████▋ | 972kB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████▊ | 983kB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████ | 993kB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████ | 1.0MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████▎ | 1.0MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████▍ | 1.0MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████▋ | 1.0MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████▉ | 1.0MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████ | 1.1MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████▏ | 1.1MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████▎ | 1.1MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████▌ | 1.1MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████▋ | 1.1MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████▉ | 1.1MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████ | 1.1MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████▏ | 1.1MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████▍ | 1.1MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████▌ | 1.1MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████▊ | 1.2MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████▉ | 1.2MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████ | 1.2MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████▎ | 1.2MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████▍ | 1.2MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████▋ | 1.2MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████▊ | 1.2MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████ | 1.2MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████ | 1.2MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████▎ | 1.2MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████▌ | 1.3MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████▋ | 1.3MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████▉ | 1.3MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████ | 1.3MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████▏ | 1.3MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████▎ | 1.3MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████▌ | 1.3MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████▊ | 1.3MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████▉ | 1.3MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████ | 1.4MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████▏ | 1.4MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████▍ | 1.4MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████▌ | 1.4MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████▊ | 1.4MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████████ | 1.4MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████████ | 1.4MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████████▎ | 1.4MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████████▍ | 1.4MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████████▋ | 1.4MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████████▊ | 1.5MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████████ | 1.5MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████████▏ | 1.5MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████████▎ | 1.5MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████████▌ | 1.5MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████████▋ | 1.5MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████████▉ | 1.5MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████████ | 1.5MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████████▏ | 1.5MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████████▍ | 1.5MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████████▌ | 1.6MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████████▊ | 1.6MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████████▉ | 1.6MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████████ | 1.6MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████████▏ | 1.6MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████████▍ | 1.6MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████████▋ | 1.6MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████████▊ | 1.6MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████████████ | 1.6MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████████████ | 1.6MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████████████▎ | 1.7MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████████████▍ | 1.7MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████████████▋ | 1.7MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████████████▉ | 1.7MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████████████ | 1.7MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████████████▏ | 1.7MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████████████▎ | 1.7MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████████████▌ | 1.7MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████████████▋ | 1.7MB 7.8MB/s eta 0:00:01\r\u001b[K |█████████████████████████████▉ | 1.8MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████████████ | 1.8MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████████████▏ | 1.8MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████████████▍ | 1.8MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████████████▌ | 1.8MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████████████▊ | 1.8MB 7.8MB/s eta 0:00:01\r\u001b[K |██████████████████████████████▉ | 1.8MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████████████ | 1.8MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████████████▎| 1.8MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████████████▍| 1.8MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████████████▋| 1.9MB 7.8MB/s eta 0:00:01\r\u001b[K |███████████████████████████████▊| 1.9MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 1.9MB 7.8MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 1.9MB 7.8MB/s \n", 57 | "\u001b[?25hRequirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from facenet_pytorch) (2.23.0)\n", 58 | "Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from facenet_pytorch) (1.18.5)\n", 59 | "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->facenet_pytorch) (2.9)\n", 60 | "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->facenet_pytorch) (1.24.3)\n", 61 | "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->facenet_pytorch) (2020.6.20)\n", 62 | "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->facenet_pytorch) (3.0.4)\n", 63 | "Installing collected packages: facenet-pytorch\n", 64 | "Successfully installed facenet-pytorch-2.2.9\n" 65 | ], 66 | "name": "stdout" 67 | } 68 | ] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "metadata": { 73 | "id": "ZG5nqIShDaup", 74 | "colab_type": "code", 75 | "colab": { 76 | "base_uri": "https://localhost:8080/", 77 | "height": 34 78 | }, 79 | "outputId": "ec2e3d9b-2c0d-4df5-f670-e2c186a4ff27" 80 | }, 81 | "source": [ 82 | "#mounting\n", 83 | "from google.colab import drive\n", 84 | "drive.mount('/content/drive')" 85 | ], 86 | "execution_count": null, 87 | "outputs": [ 88 | { 89 | "output_type": "stream", 90 | "text": [ 91 | "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" 92 | ], 93 | "name": "stdout" 94 | } 95 | ] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "metadata": { 100 | "id": "MvzE_G1MSUzM", 101 | "colab_type": "code", 102 | "colab": {} 103 | }, 104 | "source": [ 105 | "dir_ = '/content/drive/My Drive/Colab Notebooks/Face mask/dataset/new'\n", 106 | "os.chdir(dir_)" 107 | ], 108 | "execution_count": null, 109 | "outputs": [] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "metadata": { 114 | "id": "NLq3j1sZSat8", 115 | "colab_type": "code", 116 | "colab": {} 117 | }, 118 | "source": [ 119 | "#images with mask\n", 120 | "imgs_with = os.listdir('with mask')\n", 121 | "#images without mask\n", 122 | "imgs_without = os.listdir('without mask')" 123 | ], 124 | "execution_count": null, 125 | "outputs": [] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "metadata": { 130 | "id": "ckNOTevdDCEk", 131 | "colab_type": "code", 132 | "colab": {} 133 | }, 134 | "source": [ 135 | "if not os.path.isdir('train'):\n", 136 | " os.mkdir('train')" 137 | ], 138 | "execution_count": null, 139 | "outputs": [] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "metadata": { 144 | "id": "cTK8ywqNTCIp", 145 | "colab_type": "code", 146 | "colab": {} 147 | }, 148 | "source": [ 149 | "mtcnn = MTCNN()\n", 150 | "def face_extractor(items, from_, to):\n", 151 | " '''\n", 152 | " Extracts the face and saves it in another file\n", 153 | "\n", 154 | " params: items: the images\n", 155 | " params: from_: directory from where the data to be moved\n", 156 | " params: to: desired directory to move in the data\n", 157 | " '''\n", 158 | " \n", 159 | " for i in range(len(items)):\n", 160 | " \n", 161 | " pic = Image.open('%s/%s'%(from_,items[i]))\n", 162 | " tensor = t.ToTensor()\n", 163 | " try: \n", 164 | " face = mtcnn.detect(pic)\n", 165 | " \n", 166 | " tensor_img = tensor(pic)\n", 167 | " \n", 168 | " if face[0] is not None:\n", 169 | " for x,y,w,h in face[0]:\n", 170 | " pass\n", 171 | " x,y,w,h = r(x), r(y), r(w), r(h) \n", 172 | " \n", 173 | " pil = t.ToPILImage()(tensor_img[:,y:h, x:w])\n", 174 | " #This way the dataset contains images above the size (130,130) 175 | " if pil.size >= (130,130):\n", 176 | " pil.save('%s/%s'%(to, items[i]))\n", 177 | " \n", 178 | " except: \n", 179 | " pass\n", 180 | "\n", 181 | "\n", 182 | "face_extractor(imgs_with, 'with mask', 'train/with mask')\n", 183 | "face_extractor(imgs_without, 'without mask', 'train/without mask')" 184 | ], 185 | "execution_count": null, 186 | "outputs": [] 187 | } 188 | ] 189 | } 190 | -------------------------------------------------------------------------------- /Filter/filter15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ashborn-SM/Face-Mask-Detection-Pytorch/4eebcabc8ef5889a778097eebeda4dc7fded0c7e/Filter/filter15.png -------------------------------------------------------------------------------- /Filter/filter9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ashborn-SM/Face-Mask-Detection-Pytorch/4eebcabc8ef5889a778097eebeda4dc7fded0c7e/Filter/filter9.png -------------------------------------------------------------------------------- /GIFS/mask.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ashborn-SM/Face-Mask-Detection-Pytorch/4eebcabc8ef5889a778097eebeda4dc7fded0c7e/GIFS/mask.gif -------------------------------------------------------------------------------- /GIFS/mask2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ashborn-SM/Face-Mask-Detection-Pytorch/4eebcabc8ef5889a778097eebeda4dc7fded0c7e/GIFS/mask2.gif -------------------------------------------------------------------------------- /Graph/ResNet9trainingraph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ashborn-SM/Face-Mask-Detection-Pytorch/4eebcabc8ef5889a778097eebeda4dc7fded0c7e/Graph/ResNet9trainingraph.png -------------------------------------------------------------------------------- /Graph/lr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ashborn-SM/Face-Mask-Detection-Pytorch/4eebcabc8ef5889a778097eebeda4dc7fded0c7e/Graph/lr.png -------------------------------------------------------------------------------- /Graph/res9vsres15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ashborn-SM/Face-Mask-Detection-Pytorch/4eebcabc8ef5889a778097eebeda4dc7fded0c7e/Graph/res9vsres15.png -------------------------------------------------------------------------------- /Graph/resnet15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ashborn-SM/Face-Mask-Detection-Pytorch/4eebcabc8ef5889a778097eebeda4dc7fded0c7e/Graph/resnet15.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Rahul0128 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | ## About 2 | This is a course project i have created using pytorch ,using all the skills i learned 3 | from [freecodecamp](https://www.freecodecamp.org/) and [Jovian](https://www.jovian.ml/). 4 | 5 | ## How to use: 6 | Run the Detector_MTCNN.py file. At present video is taken from the webcam(live) if you want 7 | to feed in a pre-recorded video give the path of the file instead of 0 in line 28 *cv.VideoCapture(0)*. 8 | If the video is too big and potentially freeze the computer uncomment line 57 *#frame = resize(frame, height, width)* 9 | this will resize it. 10 | 11 | **Make sure to download the state dict to get the predictions right** 12 | 13 | **state dict- https://drive.google.com/drive/folders/1oRBDw_HmqCaQ2jnT4aSZHyYVBi4ELhSt?usp=sharing, 14 | dataset - https://drive.google.com/drive/folders/1LEKdePxk854r0kT542g42loM1z1UkL4g?usp=sharing** 15 | 16 | I tried both the models with different video's, ResNet9 and ResNet15 performed well. 17 | I noticed that there are some video ResNet9 performed well but ResNet15 did not and vice-versa. 18 | 19 | Try both the models and see whats best. 20 | 21 | ### Note: 22 | The model is trained on certain type of mask so it may not perform well on other kinds of mask. 23 | 24 | ## Third-Party Libraries used: 25 | 1. Facenet PyTorch 26 | 2. Open CV 27 | 3. PyTorch 28 | 4. Numpy 29 | 5. Matplotlib 30 | 31 | ## Guide 32 | 1. Guide to MTCNN in facenet-pytorch - https://www.kaggle.com/timesler/guide-to-mtcnn-in-facenet-pytorch 33 | 2. Facenet implementation in a video - https://github.com/timesler/facenet-pytorch/blob/master/examples/face_tracking.ipynb 34 | 35 | ### Predicted video 36 | ![Mask](https://github.com/Rahul0128/Face-Mask-Detection-Pytorch/blob/master/GIFS/mask.gif), 37 | ![](https://github.com/Rahul0128/Face-Mask-Detection-Pytorch/blob/master/GIFS/mask2.gif) 38 | -------------------------------------------------------------------------------- /testingCNNmodels.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "testingCNNmodels.ipynb", 7 | "provenance": [] 8 | }, 9 | "kernelspec": { 10 | "name": "python3", 11 | "display_name": "Python 3" 12 | }, 13 | "accelerator": "GPU" 14 | }, 15 | "cells": [ 16 | { 17 | "cell_type": "markdown", 18 | "metadata": { 19 | "id": "aE_n-CoyFgj_", 20 | "colab_type": "text" 21 | }, 22 | "source": [ 23 | "Testing both the custom built ResNet9 and ResNet15" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "metadata": { 29 | "id": "ekZHJ2hz02An", 30 | "colab_type": "code", 31 | "colab": { 32 | "base_uri": "https://localhost:8080/", 33 | "height": 122 34 | }, 35 | "outputId": "a44728cb-57cd-4191-a4f3-4d6c3f359d43" 36 | }, 37 | "source": [ 38 | "#Importing libraries\n", 39 | "import matplotlib.pyplot as plt\n", 40 | "from google.colab import drive\n", 41 | "import torch\n", 42 | "from torch.utils.data import DataLoader\n", 43 | "drive.mount('/content/gdrive')" 44 | ], 45 | "execution_count": 1, 46 | "outputs": [ 47 | { 48 | "output_type": "stream", 49 | "text": [ 50 | "Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n", 51 | "\n", 52 | "Enter your authorization code:\n", 53 | "··········\n", 54 | "Mounted at /content/gdrive\n" 55 | ], 56 | "name": "stdout" 57 | } 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "metadata": { 63 | "id": "rT7LPviX1Vjf", 64 | "colab_type": "code", 65 | "colab": { 66 | "base_uri": "https://localhost:8080/", 67 | "height": 170 68 | }, 69 | "outputId": "13cc47d0-d20b-4d4b-b93f-ed812840ce1b" 70 | }, 71 | "source": [ 72 | "!pip install import_ipynb\n", 73 | "import import_ipynb" 74 | ], 75 | "execution_count": 2, 76 | "outputs": [ 77 | { 78 | "output_type": "stream", 79 | "text": [ 80 | "Collecting import_ipynb\n", 81 | " Downloading https://files.pythonhosted.org/packages/63/35/495e0021bfdcc924c7cdec4e9fbb87c88dd03b9b9b22419444dc370c8a45/import-ipynb-0.1.3.tar.gz\n", 82 | "Building wheels for collected packages: import-ipynb\n", 83 | " Building wheel for import-ipynb (setup.py) ... \u001b[?25l\u001b[?25hdone\n", 84 | " Created wheel for import-ipynb: filename=import_ipynb-0.1.3-cp36-none-any.whl size=2976 sha256=fd14f250ef23f4ca18b073df946cb5f6d0772d59424f2d0fb5f74412673e241b\n", 85 | " Stored in directory: /root/.cache/pip/wheels/b4/7b/e9/a3a6e496115dffdb4e3085d0ae39ffe8a814eacc44bbf494b5\n", 86 | "Successfully built import-ipynb\n", 87 | "Installing collected packages: import-ipynb\n", 88 | "Successfully installed import-ipynb-0.1.3\n" 89 | ], 90 | "name": "stdout" 91 | } 92 | ] 93 | }, 94 | { 95 | "cell_type": "code", 96 | "metadata": { 97 | "id": "eN4tayU_0_Vm", 98 | "colab_type": "code", 99 | "colab": { 100 | "base_uri": "https://localhost:8080/", 101 | "height": 34 102 | }, 103 | "outputId": "b3ea6cd8-02d8-4deb-b576-a8e1836cf030" 104 | }, 105 | "source": [ 106 | "%cd '/content/gdrive/My Drive/Colab Notebooks/Face mask'" 107 | ], 108 | "execution_count": 3, 109 | "outputs": [ 110 | { 111 | "output_type": "stream", 112 | "text": [ 113 | "/content/gdrive/My Drive/Colab Notebooks/Face mask\n" 114 | ], 115 | "name": "stdout" 116 | } 117 | ] 118 | }, 119 | { 120 | "cell_type": "code", 121 | "metadata": { 122 | "id": "EG9fFAf51MJu", 123 | "colab_type": "code", 124 | "colab": { 125 | "base_uri": "https://localhost:8080/", 126 | "height": 51 127 | }, 128 | "outputId": "ad05f218-3e06-49bf-fcac-4862dd7c7039" 129 | }, 130 | "source": [ 131 | "#importing modules\n", 132 | "from CNN import ResNet9, ResNet15\n", 133 | "from DataPreprocessing import Preprocessing" 134 | ], 135 | "execution_count": 4, 136 | "outputs": [ 137 | { 138 | "output_type": "stream", 139 | "text": [ 140 | "importing Jupyter notebook from CNN.ipynb\n", 141 | "importing Jupyter notebook from DataPreprocessing.ipynb\n" 142 | ], 143 | "name": "stdout" 144 | } 145 | ] 146 | }, 147 | { 148 | "cell_type": "code", 149 | "metadata": { 150 | "id": "Mpo7k2Zv1jLc", 151 | "colab_type": "code", 152 | "colab": {} 153 | }, 154 | "source": [ 155 | "device = torch.device('cuda')" 156 | ], 157 | "execution_count": 5, 158 | "outputs": [] 159 | }, 160 | { 161 | "cell_type": "code", 162 | "metadata": { 163 | "id": "PlSWlDR20yBB", 164 | "colab_type": "code", 165 | "colab": { 166 | "base_uri": "https://localhost:8080/", 167 | "height": 34 168 | }, 169 | "outputId": "7cc4b190-ddbb-4dd3-bc0e-ecffb1a328f7" 170 | }, 171 | "source": [ 172 | "#model and loading the state_dict\n", 173 | "model15 = ResNet15(1,2).to(device)\n", 174 | "model9 = ResNet9(1,2).to(device)\n", 175 | "model15.load_state_dict(torch.load('state_dict_resnet15.pth'))\n", 176 | "model9.load_state_dict(torch.load('state_dict_resnet9.pth'))" 177 | ], 178 | "execution_count": 6, 179 | "outputs": [ 180 | { 181 | "output_type": "execute_result", 182 | "data": { 183 | "text/plain": [ 184 | "" 185 | ] 186 | }, 187 | "metadata": { 188 | "tags": [] 189 | }, 190 | "execution_count": 6 191 | } 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "metadata": { 197 | "id": "g7UoC0s12azM", 198 | "colab_type": "code", 199 | "colab": {} 200 | }, 201 | "source": [ 202 | "data = Preprocessing(path={'test':'dataset/test',\n", 203 | " 'train':'dataset/train'})\n", 204 | "_, test_ds = data.preprocessed_dataset()\n", 205 | "test_dl = DataLoader(test_ds, 10, num_workers=3,\n", 206 | " pin_memory=True)" 207 | ], 208 | "execution_count": 8, 209 | "outputs": [] 210 | }, 211 | { 212 | "cell_type": "code", 213 | "metadata": { 214 | "id": "fGmtIgV62MmX", 215 | "colab_type": "code", 216 | "colab": { 217 | "base_uri": "https://localhost:8080/", 218 | "height": 241 219 | }, 220 | "outputId": "e714dac9-9f07-4843-a96f-46744fe6b907" 221 | }, 222 | "source": [ 223 | "#testing\n", 224 | "accuracy9 = []\n", 225 | "accuracy15 = []\n", 226 | "for x, y in test_dl:\n", 227 | " x, y = x.to(device), y.to(device)\n", 228 | " _, label15 = torch.max(torch.exp(model15(x)), dim=1)\n", 229 | " _, label9 = torch.max(torch.exp(model9(x)), dim=1)\n", 230 | " acc9 = torch.sum(label9 == y).item()/len(y)\n", 231 | " acc15 = torch.sum(label15 == y).item()/len(y)\n", 232 | " accuracy9.append(acc9)\n", 233 | " accuracy15.append(acc15)\n", 234 | " print('ResNet9: {}, ResNet15: {}'.format(acc9, acc15))\n", 235 | " " 236 | ], 237 | "execution_count": 9, 238 | "outputs": [ 239 | { 240 | "output_type": "stream", 241 | "text": [ 242 | "/usr/local/lib/python3.6/dist-packages/torch/nn/modules/container.py:100: UserWarning: Implicit dimension choice for log_softmax has been deprecated. Change the call to include dim=X as an argument.\n", 243 | " input = module(input)\n" 244 | ], 245 | "name": "stderr" 246 | }, 247 | { 248 | "output_type": "stream", 249 | "text": [ 250 | "ResNet9: 0.8, ResNet15: 1.0\n", 251 | "ResNet9: 0.8, ResNet15: 1.0\n", 252 | "ResNet9: 1.0, ResNet15: 1.0\n", 253 | "ResNet9: 0.9, ResNet15: 1.0\n", 254 | "ResNet9: 0.9, ResNet15: 0.9\n", 255 | "ResNet9: 1.0, ResNet15: 0.7\n", 256 | "ResNet9: 0.8, ResNet15: 0.9\n", 257 | "ResNet9: 1.0, ResNet15: 0.9\n", 258 | "ResNet9: 0.9, ResNet15: 0.8\n", 259 | "ResNet9: 0.8888888888888888, ResNet15: 0.7777777777777778\n" 260 | ], 261 | "name": "stdout" 262 | } 263 | ] 264 | }, 265 | { 266 | "cell_type": "code", 267 | "metadata": { 268 | "id": "eMnJcrGZ3sPC", 269 | "colab_type": "code", 270 | "colab": { 271 | "base_uri": "https://localhost:8080/", 272 | "height": 312 273 | }, 274 | "outputId": "3e2774d7-291e-4e95-9feb-0b4cddcdaa38" 275 | }, 276 | "source": [ 277 | "plt.plot(accuracy9, 'r--x', markersize=8, markeredgewidth=3\n", 278 | " , linewidth=3,label='ResNet9')\n", 279 | "plt.plot(accuracy15, 'c-1', markersize=12, markeredgewidth=3\n", 280 | " , linewidth=2,label='ResNet15')\n", 281 | "plt.grid()\n", 282 | "plt.title('Accuracy: ResNet9 vs ResNet15')\n", 283 | "plt.xlabel('batches')\n", 284 | "plt.ylabel('Accuracy')\n", 285 | "plt.legend(loc='lower right')\n" 286 | ], 287 | "execution_count": 10, 288 | "outputs": [ 289 | { 290 | "output_type": "execute_result", 291 | "data": { 292 | "text/plain": [ 293 | "" 294 | ] 295 | }, 296 | "metadata": { 297 | "tags": [] 298 | }, 299 | "execution_count": 10 300 | }, 301 | { 302 | "output_type": "display_data", 303 | "data": { 304 | "image/png": "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\n", 305 | "text/plain": [ 306 | "
" 307 | ] 308 | }, 309 | "metadata": { 310 | "tags": [], 311 | "needs_background": "light" 312 | } 313 | } 314 | ] 315 | } 316 | ] 317 | } -------------------------------------------------------------------------------- /training.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "training.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "toc_visible": true 10 | }, 11 | "kernelspec": { 12 | "name": "python3", 13 | "display_name": "Python 3" 14 | }, 15 | "accelerator": "GPU" 16 | }, 17 | "cells": [ 18 | { 19 | "cell_type": "markdown", 20 | "metadata": { 21 | "id": "sVbYgY3Rb8UL", 22 | "colab_type": "text" 23 | }, 24 | "source": [ 25 | "#Training\n", 26 | "\n", 27 | "\n" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "metadata": { 33 | "id": "Hv2tuwUsb66A", 34 | "colab_type": "code", 35 | "colab": {} 36 | }, 37 | "source": [ 38 | "#Importing libraries\n", 39 | "import torch\n", 40 | "import torch.nn as nn\n", 41 | "from torchvision.utils import make_grid\n", 42 | "import matplotlib.pyplot as plt\n", 43 | "from torch.utils.data import DataLoader, random_split\n", 44 | "import numpy as np\n", 45 | "import math" 46 | ], 47 | "execution_count": null, 48 | "outputs": [] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "metadata": { 53 | "id": "6fcJ9D9d-LnQ", 54 | "colab_type": "code", 55 | "colab": { 56 | "base_uri": "https://localhost:8080/", 57 | "height": 34 58 | }, 59 | "outputId": "aa881b03-e93f-4c54-84eb-cd383a59069b" 60 | }, 61 | "source": [ 62 | "#Libraries for importing ipynb file\n", 63 | "from google.colab import drive, files\n", 64 | "!pip install import_ipynb\n", 65 | "import import_ipynb" 66 | ], 67 | "execution_count": null, 68 | "outputs": [ 69 | { 70 | "output_type": "stream", 71 | "text": [ 72 | "Requirement already satisfied: import_ipynb in /usr/local/lib/python3.6/dist-packages (0.1.3)\n" 73 | ], 74 | "name": "stdout" 75 | } 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "metadata": { 81 | "id": "RF4q-TuDdMn9", 82 | "colab_type": "code", 83 | "colab": { 84 | "base_uri": "https://localhost:8080/", 85 | "height": 34 86 | }, 87 | "outputId": "ae8441c3-9d4a-4d27-f469-1c50de3fc52e" 88 | }, 89 | "source": [ 90 | "#Mounting \n", 91 | "drive.mount('/content/gdrive')" 92 | ], 93 | "execution_count": null, 94 | "outputs": [ 95 | { 96 | "output_type": "stream", 97 | "text": [ 98 | "Mounted at /content/gdrive\n" 99 | ], 100 | "name": "stdout" 101 | } 102 | ] 103 | }, 104 | { 105 | "cell_type": "code", 106 | "metadata": { 107 | "id": "WAEds0OKelYd", 108 | "colab_type": "code", 109 | "colab": { 110 | "base_uri": "https://localhost:8080/", 111 | "height": 68 112 | }, 113 | "outputId": "38f771a3-aaa1-447a-d4d7-00df7400f28c" 114 | }, 115 | "source": [ 116 | "\n", 117 | "#Location of Datapreprocessing file is in Colab Notebooks folder\n", 118 | "#Changing the directory to Colab Notebooks\n", 119 | "%cd '/content/gdrive/My Drive/Colab Notebooks/Face mask/new'\n", 120 | "from DataPreprocessing import Preprocessing\n", 121 | "from CNN import ResNet15, ResNet9" 122 | ], 123 | "execution_count": null, 124 | "outputs": [ 125 | { 126 | "output_type": "stream", 127 | "text": [ 128 | "/content/gdrive/My Drive/Colab Notebooks/Face mask\n", 129 | "importing Jupyter notebook from DataPreprocessing.ipynb\n", 130 | "importing Jupyter notebook from CNN.ipynb\n" 131 | ], 132 | "name": "stdout" 133 | } 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "metadata": { 139 | "id": "k2mkHfYYlZUK", 140 | "colab_type": "code", 141 | "colab": {} 142 | }, 143 | "source": [ 144 | "#Directory of the dataset\n", 145 | "directory = 'dataset'" 146 | ], 147 | "execution_count": null, 148 | "outputs": [] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "metadata": { 153 | "id": "2FXUNgRgyXRy", 154 | "colab_type": "code", 155 | "colab": {} 156 | }, 157 | "source": [ 158 | "data = Preprocessing(path = {'test':directory+'/test',\n", 159 | " 'train':directory+'/train'})\n", 160 | "train_ds, test_ds = data.preprocessed_dataset()" 161 | ], 162 | "execution_count": null, 163 | "outputs": [] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "metadata": { 168 | "id": "i_jtQSbPrVPy", 169 | "colab_type": "code", 170 | "colab": {} 171 | }, 172 | "source": [ 173 | "#Splitting and creating batches of data\n", 174 | "batch_size = 20\n", 175 | "val_size = math.ceil(len(test_ds)* 20/100)\n", 176 | "test_size = len(test_ds) - val_size \n", 177 | "\n", 178 | "#splitting the data\n", 179 | "val_ds, test_ds = random_split(test_ds, [val_size, test_size])\n", 180 | "\n", 181 | "#creating data loader\n", 182 | "train_dl = DataLoader(train_ds, batch_size, num_workers=3, shuffle = True,\n", 183 | " pin_memory=True)\n", 184 | "val_dl = DataLoader(val_ds, batch_size, num_workers=3,\n", 185 | " pin_memory=True)\n" 186 | ], 187 | "execution_count": null, 188 | "outputs": [] 189 | }, 190 | { 191 | "cell_type": "code", 192 | "metadata": { 193 | "id": "6i-i4jQa0t3W", 194 | "colab_type": "code", 195 | "colab": {} 196 | }, 197 | "source": [ 198 | "x,y = next(iter(train_dl))" 199 | ], 200 | "execution_count": null, 201 | "outputs": [] 202 | }, 203 | { 204 | "cell_type": "code", 205 | "metadata": { 206 | "id": "KcDR8q8Bci4-", 207 | "colab_type": "code", 208 | "colab": { 209 | "base_uri": "https://localhost:8080/", 210 | "height": 154 211 | }, 212 | "outputId": "3a641101-630d-44b9-addb-126e83eb97b5" 213 | }, 214 | "source": [ 215 | "\n", 216 | "#Visualizing \n", 217 | "fig, ax = plt.subplots(figsize=(12,12))\n", 218 | "ax.imshow(make_grid(x[:10], nrow=10).permute(1,2,0))\n", 219 | "x.shape" 220 | ], 221 | "execution_count": null, 222 | "outputs": [ 223 | { 224 | "output_type": "stream", 225 | "text": [ 226 | "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n" 227 | ], 228 | "name": "stderr" 229 | }, 230 | { 231 | "output_type": "execute_result", 232 | "data": { 233 | "text/plain": [ 234 | "torch.Size([20, 1, 128, 128])" 235 | ] 236 | }, 237 | "metadata": { 238 | "tags": [] 239 | }, 240 | "execution_count": 9 241 | }, 242 | { 243 | "output_type": "display_data", 244 | "data": { 245 | "image/png": "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\n", 246 | "text/plain": [ 247 | "
" 248 | ] 249 | }, 250 | "metadata": { 251 | "tags": [], 252 | "needs_background": "light" 253 | } 254 | } 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "metadata": { 260 | "id": "8rLp7Toowj6l", 261 | "colab_type": "code", 262 | "colab": {} 263 | }, 264 | "source": [ 265 | "#Activating cuda\n", 266 | " #Uses cuda if available else cpu\n", 267 | "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')" 268 | ], 269 | "execution_count": null, 270 | "outputs": [] 271 | }, 272 | { 273 | "cell_type": "code", 274 | "metadata": { 275 | "id": "iSBT4xHs-dl9", 276 | "colab_type": "code", 277 | "colab": {} 278 | }, 279 | "source": [ 280 | "model = ResNet9(1,2).to(device)" 281 | ], 282 | "execution_count": null, 283 | "outputs": [] 284 | }, 285 | { 286 | "cell_type": "code", 287 | "metadata": { 288 | "id": "s9AI7OZ5G3wJ", 289 | "colab_type": "code", 290 | "colab": {} 291 | }, 292 | "source": [ 293 | "def get_lr(optimizer):\n", 294 | " '''\n", 295 | " params: optimizer: optimizer of the model\n", 296 | " return: learning rate\n", 297 | " '''\n", 298 | " \n", 299 | " for x in optimizer.param_groups:\n", 300 | " return x['lr']" 301 | ], 302 | "execution_count": null, 303 | "outputs": [] 304 | }, 305 | { 306 | "cell_type": "code", 307 | "metadata": { 308 | "id": "gNczvHaq_iWy", 309 | "colab_type": "code", 310 | "colab": {} 311 | }, 312 | "source": [ 313 | "def fit(model, epochs, max_lr, train_dl, val_dl, weight_decay=0, \n", 314 | " optim = torch.optim.Adam, grad_clip = None):\n", 315 | " '''\n", 316 | " Arguments:\n", 317 | "\n", 318 | " model --> CNN model\n", 319 | " epochs --> number of epoch\n", 320 | " max_lr --> max learning rate for One-cycle lr scheduler\n", 321 | " train_dl, val_dl --> training and validation dataloader\n", 322 | " weight_decay --> regularizing parametric(reduces the weights to avoid \n", 323 | " overfitting)\n", 324 | " optim --> optimizer\n", 325 | " grad_clip --> regularizing parametric(limit the values of gradients to a \n", 326 | " small range)\n", 327 | " \n", 328 | " Return:\n", 329 | "\n", 330 | " history --> {\n", 331 | " training_loss --> training loss for every epochs\n", 332 | " validation_loss --> validation loss for every epochs\n", 333 | " validation_acc --> validation accuracy for every epochs\n", 334 | " }\n", 335 | " '''\n", 336 | " model.train() #training\n", 337 | " torch.cuda.empty_cache() #releases cache memory improves performance\n", 338 | "\n", 339 | " #Defining optimizer and loss\n", 340 | " optimizer = optim(model.parameters(), max_lr, weight_decay = weight_decay)\n", 341 | " criterion = nn.NLLLoss()\n", 342 | "\n", 343 | " #One-cycle learning rate scheduler\n", 344 | " sched = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr,\n", 345 | " steps_per_epoch = len(train_dl) ,epochs = epochs)\n", 346 | "\n", 347 | " val_loss_min = np.inf #initial value at infinity\n", 348 | "\n", 349 | " history = {\n", 350 | " 'training_loss': [], #training loss for every epochs\n", 351 | " 'validation_loss': [], #validation loss for every epochs\n", 352 | " 'validation_acc': [], #validation accuracy for every epochs\n", 353 | " 'learning_rates': [] #lr for every epochs \n", 354 | " }\n", 355 | " \n", 356 | " for epoch in range(epochs):\n", 357 | "\n", 358 | " batch_train_loss = 0 #training loss for every batch\n", 359 | " batch_val_loss = 0 #validation loss for every batch\n", 360 | " batch_val_acc = 0 #valdation acc for every batch\n", 361 | "\n", 362 | " #looping through training dataloader\n", 363 | " for imgs, labels in train_dl:\n", 364 | "\n", 365 | " #Sending images and labels to GPU\n", 366 | " imgs, labels = imgs.to(device), labels.to(device)\n", 367 | "\n", 368 | " predictions = model(imgs)\n", 369 | " loss = criterion(predictions, labels)\n", 370 | " batch_train_loss += loss\n", 371 | " loss.backward()\n", 372 | "\n", 373 | " #gradient clipping\n", 374 | " if grad_clip:\n", 375 | " nn.utils.clip_grad_value_(model.parameters(), grad_clip)\n", 376 | " \n", 377 | " optimizer.step()\n", 378 | " optimizer.zero_grad()\n", 379 | " \n", 380 | " #record and update lr\n", 381 | " history['learning_rates'].append(get_lr(optimizer))\n", 382 | " sched.step()\n", 383 | "\n", 384 | " #shutting down the gradients\n", 385 | " with torch.no_grad():\n", 386 | " model.eval() #for evaluating\n", 387 | "\n", 388 | " #looping through validation dataloader\n", 389 | " for imgs, labels in val_dl:\n", 390 | " #Sending images and labels to GPU\n", 391 | " imgs, labels = imgs.to(device), labels.to(device)\n", 392 | "\n", 393 | " predictions = model(imgs)\n", 394 | " loss = criterion(predictions, labels) \n", 395 | "\n", 396 | " #Converting predictions to probabilities\n", 397 | " prob = torch.exp(predictions)\n", 398 | " #Finding the index of maximum probability\n", 399 | " _, index = torch.max(prob, dim=1)\n", 400 | " \n", 401 | " batch_val_loss += loss.item()\n", 402 | " batch_val_acc += torch.sum(index == labels).item() / len(index)\n", 403 | " \n", 404 | " #loss and accuracy per epoch\n", 405 | " training_loss = batch_train_loss / len(train_dl)\n", 406 | " val_loss = batch_val_loss / len(val_dl)\n", 407 | " val_acc = batch_val_acc / len(val_dl)\n", 408 | "\n", 409 | " history['training_loss'].append(training_loss)\n", 410 | " history['validation_loss'].append(val_loss)\n", 411 | " history['validation_acc'].append(val_acc)\n", 412 | "\n", 413 | " #Verbose\n", 414 | " print('Epochs: {}, training_loss: {:.4f}, val_loss: {:.4f},\\\n", 415 | " val_acc: {:.4f}'.format(epoch, training_loss, val_loss, val_acc))\n", 416 | " \n", 417 | " if val_loss <= val_loss_min:\n", 418 | " '''\n", 419 | " Initailly the val_loss_min is set at infinity and gets \n", 420 | " updated each time val_loss is lesser than val_loss_min.\n", 421 | " Basically it saves the model with least validation loss.\n", 422 | " ''' \n", 423 | " torch.save(model.state_dict(), 'state_dict_resnet9.pth')\n", 424 | " print('{} --> {}. Saving ...'.format(val_loss_min, val_loss))\n", 425 | " val_loss_min = val_loss\n", 426 | "\n", 427 | " return history\n", 428 | " " 429 | ], 430 | "execution_count": null, 431 | "outputs": [] 432 | }, 433 | { 434 | "cell_type": "code", 435 | "metadata": { 436 | "id": "ZlGBZSj9CfaI", 437 | "colab_type": "code", 438 | "colab": { 439 | "base_uri": "https://localhost:8080/", 440 | "height": 326 441 | }, 442 | "outputId": "243435e2-dbbd-48f8-e5fe-acbd46f35656" 443 | }, 444 | "source": [ 445 | "history = fit(model, 10, 0.0001, train_dl, val_dl, weight_decay=0.01, \n", 446 | " optim = torch.optim.Adam, grad_clip = 0.1)" 447 | ], 448 | "execution_count": null, 449 | "outputs": [ 450 | { 451 | "output_type": "stream", 452 | "text": [ 453 | "/usr/local/lib/python3.6/dist-packages/torch/nn/modules/container.py:100: UserWarning: Implicit dimension choice for log_softmax has been deprecated. Change the call to include dim=X as an argument.\n", 454 | " input = module(input)\n" 455 | ], 456 | "name": "stderr" 457 | }, 458 | { 459 | "output_type": "stream", 460 | "text": [ 461 | "Epochs: 0, training_loss: 1.1460, val_loss: 0.2883, val_acc: 0.9000\n", 462 | "inf --> 0.2882944643497467. Saving ...\n", 463 | "Epochs: 1, training_loss: 0.3747, val_loss: 0.0648, val_acc: 1.0000\n", 464 | "0.2882944643497467 --> 0.06478280574083328. Saving ...\n", 465 | "Epochs: 2, training_loss: 0.1320, val_loss: 0.1003, val_acc: 1.0000\n", 466 | "Epochs: 3, training_loss: 0.1161, val_loss: 0.0954, val_acc: 0.9500\n", 467 | "Epochs: 4, training_loss: 0.0595, val_loss: 0.0122, val_acc: 1.0000\n", 468 | "0.06478280574083328 --> 0.012150990776717663. Saving ...\n", 469 | "Epochs: 5, training_loss: 0.0521, val_loss: 0.0022, val_acc: 1.0000\n", 470 | "0.012150990776717663 --> 0.002183937933295965. Saving ...\n", 471 | "Epochs: 6, training_loss: 0.0207, val_loss: 0.0057, val_acc: 1.0000\n", 472 | "Epochs: 7, training_loss: 0.0162, val_loss: 0.0021, val_acc: 1.0000\n", 473 | "0.002183937933295965 --> 0.0020512579940259457. Saving ...\n", 474 | "Epochs: 8, training_loss: 0.0102, val_loss: 0.0037, val_acc: 1.0000\n", 475 | "Epochs: 9, training_loss: 0.0083, val_loss: 0.0028, val_acc: 1.0000\n" 476 | ], 477 | "name": "stdout" 478 | } 479 | ] 480 | }, 481 | { 482 | "cell_type": "code", 483 | "metadata": { 484 | "id": "tA52b5f3kX5C", 485 | "colab_type": "code", 486 | "colab": {} 487 | }, 488 | "source": [ 489 | "training_loss = history['training_loss']\n", 490 | "val_loss = history['validation_loss']\n", 491 | "val_acc = history['validation_acc']\n", 492 | "lr = history['learning_rates']" 493 | ], 494 | "execution_count": null, 495 | "outputs": [] 496 | }, 497 | { 498 | "cell_type": "code", 499 | "metadata": { 500 | "id": "T4B79tghpt6z", 501 | "colab_type": "code", 502 | "colab": { 503 | "base_uri": "https://localhost:8080/", 504 | "height": 448 505 | }, 506 | "outputId": "a74fe9d8-0b58-4847-ef4f-a25acc9f70de" 507 | }, 508 | "source": [ 509 | "plt.figure(figsize=(10,7))\n", 510 | "plt.plot(val_loss, 'b-1', markersize=12, markeredgewidth=3\n", 511 | " , linewidth=2,label='val_loss')\n", 512 | "plt.plot(val_acc, 'r--x', markersize=8, markeredgewidth=3\n", 513 | " , linewidth=3,label='val_acc')\n", 514 | "plt.plot(training_loss, 'c-1', markersize=12, markeredgewidth=3\n", 515 | " , linewidth=2,label='training_loss')\n", 516 | "plt.grid()\n", 517 | "plt.legend(loc='center right')" 518 | ], 519 | "execution_count": null, 520 | "outputs": [ 521 | { 522 | "output_type": "execute_result", 523 | "data": { 524 | "text/plain": [ 525 | "" 526 | ] 527 | }, 528 | "metadata": { 529 | "tags": [] 530 | }, 531 | "execution_count": 16 532 | }, 533 | { 534 | "output_type": "display_data", 535 | "data": { 536 | "image/png": "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\n", 537 | "text/plain": [ 538 | "
" 539 | ] 540 | }, 541 | "metadata": { 542 | "tags": [], 543 | "needs_background": "light" 544 | } 545 | } 546 | ] 547 | }, 548 | { 549 | "cell_type": "code", 550 | "metadata": { 551 | "id": "nmnYlGVxp_RM", 552 | "colab_type": "code", 553 | "colab": { 554 | "base_uri": "https://localhost:8080/", 555 | "height": 282 556 | }, 557 | "outputId": "b73f806f-de46-4618-b7a5-f072c7516437" 558 | }, 559 | "source": [ 560 | "plt.plot(lr,'r', label='lr')\n", 561 | "plt.legend()" 562 | ], 563 | "execution_count": null, 564 | "outputs": [ 565 | { 566 | "output_type": "execute_result", 567 | "data": { 568 | "text/plain": [ 569 | "" 570 | ] 571 | }, 572 | "metadata": { 573 | "tags": [] 574 | }, 575 | "execution_count": 17 576 | }, 577 | { 578 | "output_type": "display_data", 579 | "data": { 580 | "image/png": "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\n", 581 | "text/plain": [ 582 | "
" 583 | ] 584 | }, 585 | "metadata": { 586 | "tags": [], 587 | "needs_background": "light" 588 | } 589 | } 590 | ] 591 | } 592 | ] 593 | } --------------------------------------------------------------------------------