├── CLientSIdeCCTV ├── .test.py.swp ├── API.py ├── Detector (copy).py ├── Detector.py ├── Resource │ ├── haarcascade_eye.xml │ └── haarcascade_frontalface_default.xml ├── group.py └── main.py ├── FaceRecog.ipynb ├── FaceRecog_TransfererLearning.ipynb ├── Presentation.pdf ├── Project Report.pdf ├── README.md ├── Server ├── Server code.py ├── projectapp.log └── templates │ └── index.html ├── flask debian setup.pdf └── workflow diagram.PNG /CLientSIdeCCTV/.test.py.swp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DEBOJYOTI11/Automated-CCTV-surveillance/921b44b2873a47f27c57087eb92a5dc62c262503/CLientSIdeCCTV/.test.py.swp -------------------------------------------------------------------------------- /CLientSIdeCCTV/API.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import os 3 | import time 4 | import argparse 5 | 6 | class api: 7 | def __init__(self, url = "http://localhost:3000/upload"): 8 | self.url = url 9 | self.dirs=[] 10 | 11 | def upload_images(self,folder): 12 | self.dir=[] 13 | self.dirs = os.listdir(folder) 14 | multiple_images = [] 15 | for d in self.dirs: 16 | d = os.path.join(folder,d) 17 | files = ('images',(d.split('/')[1] ,open(d,"rb"), 'image/jpg')) 18 | multiple_images.append(files) 19 | 20 | try: 21 | r = requests.post(url = self.url ,files =multiple_images) 22 | print r.text 23 | except requests.exceptions.RequestException as e: 24 | print '[Fatal error] : %s'%(e) 25 | 26 | 27 | def clear(self, folder): 28 | print "[Info]: in clear" 29 | for d in self.dirs: 30 | os.remove(str(folder)+str(d)) 31 | def halt(self,t): 32 | time.sleep(t) 33 | 34 | def get(self): 35 | r = requests.get(url = "http://35.200.255.243") 36 | print r.text 37 | print r.status_code 38 | if __name__ == '__main__': 39 | 40 | parser = argparse.ArgumentParser() 41 | parser.add_argument("--production",help="To connect to cloud, by default it runs locally", 42 | action="store_true") 43 | 44 | args = parser.parse_args() 45 | 46 | if(args.production): 47 | a= api(url = "http://35.200.255.243/upload") 48 | else: 49 | a = api(url="http://localhost:3000/upload") 50 | 51 | a.upload_images("RecognizedFaces/") 52 | -------------------------------------------------------------------------------- /CLientSIdeCCTV/Detector (copy).py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import cv2 3 | import dlib 4 | import datetime 5 | import time 6 | import logging 7 | from skimage.measure import compare_ssim 8 | 9 | 10 | 11 | class Frame: 12 | 13 | #constructor , takes path of the video default 14 | def __init__(self, DatasetPath ,path=0 ,label = 1 ,threshold=0.9): 15 | self.path = path 16 | self.DatasetPath = DatasetPath 17 | self.cap = cv2.VideoCapture(self.path) 18 | self.eye_cascade = cv2.CascadeClassifier('Resource/haarcascade_eye.xml') 19 | self.face_cascade = cv2.CascadeClassifier('Resource/haarcascade_frontalface_default.xml') 20 | self.label = label 21 | self.threshold = threshold 22 | 23 | 24 | #destroy all windows 25 | def destroy(self): 26 | self.cap.release() 27 | cv2.destroyAllWindows() 28 | 29 | def showimage(self, img,faces): 30 | for (x,y,w,h) in faces: 31 | cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) 32 | cv2.imshow("frame",img) 33 | 34 | def preprocess(self, img): 35 | 36 | #image resize 37 | #image highlight (histogram quilization) 38 | print img.shape 39 | return img 40 | 41 | #save image to disk 42 | def save(self, image): 43 | image = self.preprocess(image) 44 | image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR) 45 | localtime = datetime.datetime.now().strftime("%I:%M%p on %B %d, %Y") 46 | title = self.DatasetPath+ str(self.label) + '-'+ str(localtime) + ".jpg" 47 | print '[Info] Saved ',title 48 | cv2.imwrite(title, image) 49 | 50 | #templat match : template = Region of interest (face) 51 | #big picturem = current frame under processing 52 | def match(self, roi,face): 53 | 54 | face = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY) 55 | roi = roi.astype(np.uint8) 56 | face = face.astype(np.uint8) 57 | 58 | w,h = roi.shape[::-1] 59 | res = cv2.matchTemplate(face, 60 | roi, 61 | cv2.TM_CCOEFF_NORMED) 62 | 63 | 64 | locations = np.where(res>=(self.threshold)) 65 | if locations is None: 66 | self.label+=1 67 | return False 68 | 69 | 70 | if(len(locations)==1): 71 | return False 72 | return True 73 | 74 | def run(self): 75 | #face or tempplate 76 | roi = None 77 | counter=0 78 | f = None 79 | while(True): 80 | if not self.cap.isOpened(): 81 | self.cap.open(self.path) 82 | 83 | flag, img = self.cap.read() 84 | if not flag: 85 | print '[Error] Bad frame detected' 86 | break 87 | 88 | gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 89 | # if(f is None): 90 | # f = gray 91 | # try: 92 | # compare = compare_ssim(f,gray) 93 | # except: 94 | # pass 95 | 96 | # if(compare<0.85): 97 | # print compare 98 | # cv2.imshow("frame",gray) 99 | # f= gray 100 | # if counter>1000: 101 | # break 102 | # continue 103 | #check if the current region of interest(template) matches with the current frame. 104 | #if mathed then ignore the current frame 105 | 106 | faces = self.face_cascade.detectMultiScale(gray, 1.4, 6) 107 | print len(faces) 108 | continue 109 | for (x,y,w,h) in faces: 110 | 111 | cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) 112 | roi = gray[y:y+h, x:x+w] 113 | if roi is None: 114 | self.save(roi) 115 | elif self.match(roi,img): 116 | print '[Info] Frame detected' 117 | self.save(roi) 118 | 119 | #display image on the frame 120 | cv2.imshow("Video Streaming",img) 121 | counter+=1 122 | 123 | 124 | if cv2.waitKey(1) & 0xFF == ord('q'): 125 | break 126 | 127 | 128 | def recognizeEyes(self): 129 | eyes = self.eye_cascade.detectMultiScale(gray) 130 | 131 | for (ex,ey,ew,eh) in eyes: 132 | cv2.rectangle(img,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) 133 | 134 | 135 | frame = Frame("video.avi") 136 | frame.run() 137 | frame.destroy() -------------------------------------------------------------------------------- /CLientSIdeCCTV/Detector.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import cv2 3 | import dlib 4 | import datetime 5 | import time 6 | import logging 7 | import os 8 | from skimage.measure import compare_ssim 9 | 10 | class Frame: 11 | 12 | #constructor , takes path of the video default 13 | def __init__(self, DatasetPath ,path=0 ,label = 1 ,threshold=0.9): 14 | self.path = path 15 | self.DatasetPath = DatasetPath 16 | self.cap = cv2.VideoCapture(self.path) 17 | self.eye_cascade = cv2.CascadeClassifier('Resource/haarcascade_eye.xml') 18 | self.face_cascade = cv2.CascadeClassifier('Resource/haarcascade_frontalface_default.xml') 19 | self.label = label 20 | self.threshold = threshold 21 | self.cache = [] 22 | 23 | 24 | #destroy all windows 25 | def destroy(self): 26 | self.cap.release() 27 | cv2.destroyAllWindows() 28 | 29 | def showimage(self, img,faces): 30 | for (x,y,w,h) in faces: 31 | cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) 32 | cv2.imshow("frame",img) 33 | 34 | def preprocess(self, img): 35 | 36 | #image resize 37 | #image highlight (histogram quilization) 38 | return img 39 | 40 | #save image to disk 41 | def save(self, image,mode ): 42 | 43 | 44 | image = self.preprocess(image) 45 | print image.shape 46 | image=cv2.resize(image,(224,224)) 47 | localtime = datetime.datetime.now() 48 | 49 | #.strftime("%I:%M%p on %B %d, %Y") 50 | #title = self.DatasetPath+ str(self.label) + '-'+ str(localtime)+ mode + ".jpg" 51 | 52 | title = os.path.join(self.DatasetPath, mode + ".jpg") 53 | 54 | 55 | print '[Info] Saved ',title 56 | cv2.imwrite(title, image) 57 | 58 | #templat match : template = Region of interest (face) 59 | #big picturem = current frame under processing 60 | def match(self, roi,face): 61 | 62 | #face = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY) 63 | roi = roi.astype(np.uint8) 64 | face = face.astype(np.uint8) 65 | 66 | w,h = roi.shape[::-1] 67 | res = cv2.matchTemplate(face, 68 | roi, 69 | cv2.TM_CCOEFF_NORMED) 70 | 71 | 72 | locations = np.where(res>=(self.threshold)) 73 | if locations is None: 74 | self.label+=1 75 | return False 76 | 77 | 78 | if(len(locations)==1): 79 | return False 80 | return True 81 | 82 | def run(self): 83 | #face or tempplate 84 | prev_face = None 85 | roi = None 86 | counter=0 87 | frame_count=0 88 | f = None 89 | while(True): 90 | 91 | roi_l=[] 92 | face_l=[] 93 | if not self.cap.isOpened(): 94 | self.cap.open(self.path) 95 | 96 | flag, img = self.cap.read() 97 | frame_count=frame_count+1 98 | if not flag: 99 | print '[Error] Bad frame detected' 100 | break 101 | 102 | gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 103 | # if(f is None): 104 | # f = gray 105 | # try: 106 | # compare = compare_ssim(f,gray) 107 | # except: 108 | # pass 109 | 110 | # if(compare<0.85): 111 | # print compare 112 | # cv2.imshow("frame",gray) 113 | # f= gray 114 | # if counter>1000: 115 | # break 116 | # continue 117 | #check if the current region of interest(template) matches with the current frame. 118 | #if mathed then ignore the current frame 119 | 120 | faces = self.face_cascade.detectMultiScale(gray, 1.4, 6) 121 | print len(faces) 122 | for (x,y,w,h) in faces: 123 | 124 | cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) 125 | counter=counter+1 126 | roi = gray[y:y+h, x:x+w] 127 | roi_l.append((x,y,w,h,counter)) 128 | #counter=counter+1 129 | if len(faces)>0: 130 | for i in range(0,20): 131 | flag, img = self.cap.read() 132 | frame_count=frame_count+1 133 | gray_next = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 134 | for (x,y,w,h,counter) in roi_l: 135 | cv2.imwrite("scraps/%03d.jpg"%(i+counter),img) 136 | print x,y,w,h 137 | (roi) = gray[y:y+h, x:x+w] 138 | face = gray_next[y:y+h+10, x:x+w+10] 139 | print 'face',len(faces) 140 | if roi is None: 141 | self.save(roi,"%d:%d:%d"%(counter,frame_count,i)) 142 | 143 | elif self.match(roi,face): 144 | print '[Info] Frame detected' 145 | self.save(roi,"%d:%d:%d"%(counter,frame_count,i)) 146 | 147 | 148 | #display image on the frame 149 | cv2.imshow("Video Streaming",img) 150 | 151 | 152 | if cv2.waitKey(1) & 0xFF == ord('q'): 153 | break 154 | 155 | 156 | def recognizeEyes(self): 157 | eyes = self.eye_cascade.detectMultiScale(gray) 158 | 159 | for (ex,ey,ew,eh) in eyes: 160 | cv2.rectangle(img,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) 161 | -------------------------------------------------------------------------------- /CLientSIdeCCTV/group.py: -------------------------------------------------------------------------------- 1 | import os 2 | from API import api 3 | app = api() 4 | while(1): 5 | app.send("RecognizedFaces/") 6 | app.clear("RecognizedFaces/") 7 | app.halt(60) 8 | print " again" -------------------------------------------------------------------------------- /CLientSIdeCCTV/main.py: -------------------------------------------------------------------------------- 1 | from Detector import Frame 2 | frame = Frame("RecognizedFaces/") 3 | frame.run() 4 | frame.destroy() 5 | -------------------------------------------------------------------------------- /FaceRecog.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import sys" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 2, 17 | "metadata": {}, 18 | "outputs": [ 19 | { 20 | "name": "stdout", 21 | "output_type": "stream", 22 | "text": [ 23 | "3.5.4 (default, Aug 8 2017, 11:09:21) \n", 24 | "[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]\n" 25 | ] 26 | } 27 | ], 28 | "source": [ 29 | "print(sys.version)" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 3, 35 | "metadata": {}, 36 | "outputs": [ 37 | { 38 | "name": "stderr", 39 | "output_type": "stream", 40 | "text": [ 41 | "Using TensorFlow backend.\n", 42 | "/usr/lib64/python3.5/site-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", 43 | " \"This module will be removed in 0.20.\", DeprecationWarning)\n" 44 | ] 45 | } 46 | ], 47 | "source": [ 48 | "import os\n", 49 | "from PIL import Image\n", 50 | "import cv2\n", 51 | "from keras import backend as K\n", 52 | "K.set_image_data_format( 'channels_last' ) \n", 53 | "\n", 54 | "\n", 55 | "from keras.models import Sequential, Model\n", 56 | "from keras.layers import Input, Dense, Flatten, Dropout, Activation, Lambda, Permute, Reshape\n", 57 | "from keras.layers import Convolution2D, ZeroPadding2D, MaxPooling2D\n", 58 | "from keras.utils import np_utils\n", 59 | "from sklearn.cross_validation import train_test_split" 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": 4, 65 | "metadata": {}, 66 | "outputs": [ 67 | { 68 | "name": "stdout", 69 | "output_type": "stream", 70 | "text": [ 71 | "112\n" 72 | ] 73 | } 74 | ], 75 | "source": [ 76 | "DatasetPath=[]\n", 77 | "imageLabels=[]\n", 78 | "k=-1\n", 79 | "for i in os.listdir(\"faces94/male\"):\n", 80 | " k=k+1\n", 81 | " for j in os.listdir(\"faces94/male/\"+i):\n", 82 | " DatasetPath.append(os.path.join(\"faces94/male/\",i,j))\n", 83 | " imageLabels.append(k)\n", 84 | "print (k)" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 5, 90 | "metadata": { 91 | "collapsed": true 92 | }, 93 | "outputs": [], 94 | "source": [ 95 | "imageData=[]\n", 96 | "for i in DatasetPath:\n", 97 | " imgRead=cv2.imread(i)\n", 98 | " imgRead=cv2.resize(imgRead,(224,224))\n", 99 | " imageData.append(imgRead)" 100 | ] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": 7, 105 | "metadata": {}, 106 | "outputs": [ 107 | { 108 | "name": "stdout", 109 | "output_type": "stream", 110 | "text": [ 111 | "2260\n", 112 | "2260\n" 113 | ] 114 | } 115 | ], 116 | "source": [ 117 | "print (len(imageData))\n", 118 | "print (len(imageLabels))" 119 | ] 120 | }, 121 | { 122 | "cell_type": "code", 123 | "execution_count": 8, 124 | "metadata": { 125 | "collapsed": true 126 | }, 127 | "outputs": [], 128 | "source": [ 129 | "import numpy as np\n", 130 | "\n", 131 | "\n", 132 | "%matplotlib inline\n", 133 | "import matplotlib.pyplot as plt" 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "execution_count": 9, 139 | "metadata": { 140 | "collapsed": true 141 | }, 142 | "outputs": [], 143 | "source": [ 144 | "def convblock(cdim, nb, bits=3):\n", 145 | " L = []\n", 146 | " \n", 147 | " for k in range(1,bits+1):\n", 148 | " convname = 'conv'+str(nb)+'_'+str(k)\n", 149 | " #L.append( Convolution2D(cdim, 3, 3, border_mode='same', activation='relu', name=convname) ) # Keras 1\n", 150 | " L.append( Convolution2D(cdim, kernel_size=(3, 3), padding='same', activation='relu', name=convname) ) # Keras 2\n", 151 | " \n", 152 | " L.append( MaxPooling2D((2, 2), strides=(2, 2)) )\n", 153 | " \n", 154 | " return L" 155 | ] 156 | }, 157 | { 158 | "cell_type": "code", 159 | "execution_count": 10, 160 | "metadata": { 161 | "collapsed": true 162 | }, 163 | "outputs": [], 164 | "source": [ 165 | "def vgg_face_blank():\n", 166 | " \n", 167 | " withDO = True # no effect during evaluation but usefull for fine-tuning\n", 168 | " \n", 169 | " if True:\n", 170 | " mdl = Sequential()\n", 171 | " \n", 172 | " # First layer is a dummy-permutation = Identity to specify input shape\n", 173 | " mdl.add( Permute((1,2,3), input_shape=(224,224,3)) ) # WARNING : 0 is the sample dim\n", 174 | "\n", 175 | " for l in convblock(64, 1, bits=2):\n", 176 | " mdl.add(l)\n", 177 | "\n", 178 | " for l in convblock(128, 2, bits=2):\n", 179 | " mdl.add(l)\n", 180 | " \n", 181 | " for l in convblock(256, 3, bits=3):\n", 182 | " mdl.add(l)\n", 183 | " \n", 184 | " for l in convblock(512, 4, bits=3):\n", 185 | " mdl.add(l)\n", 186 | " \n", 187 | " for l in convblock(512, 5, bits=3):\n", 188 | " mdl.add(l)\n", 189 | " \n", 190 | " #mdl.add( Convolution2D(4096, 7, 7, activation='relu', name='fc6') ) # Keras 1\n", 191 | " mdl.add( Convolution2D(4096, kernel_size=(7, 7), activation='relu', name='fc6') ) # Keras 2\n", 192 | " if withDO:\n", 193 | " mdl.add( Dropout(0.5) )\n", 194 | " #mdl.add( Convolution2D(4096, 1, 1, activation='relu', name='fc7') ) # Keras 1\n", 195 | " mdl.add( Convolution2D(4096, kernel_size=(1, 1), activation='relu', name='fc7') ) # Keras 2\n", 196 | " if withDO:\n", 197 | " mdl.add( Dropout(0.5) )\n", 198 | " #mdl.add( Convolution2D(2622, 1, 1, name='fc8') ) # Keras 1\n", 199 | " mdl.add( Convolution2D(2622, kernel_size=(1, 1), activation='relu', name='fc8') ) # Keras 2\n", 200 | " mdl.add( Flatten() )\n", 201 | " mdl.add( Activation('softmax') )\n", 202 | " \n", 203 | " return mdl\n", 204 | " \n", 205 | " else:\n", 206 | " # See following link for a version based on Keras functional API :\n", 207 | " # gist.github.com/EncodeTS/6bbe8cb8bebad7a672f0d872561782d9\n", 208 | " raise ValueError('not implemented')" 209 | ] 210 | }, 211 | { 212 | "cell_type": "code", 213 | "execution_count": 11, 214 | "metadata": {}, 215 | "outputs": [ 216 | { 217 | "name": "stdout", 218 | "output_type": "stream", 219 | "text": [ 220 | "_________________________________________________________________\n", 221 | "Layer (type) Output Shape Param # \n", 222 | "=================================================================\n", 223 | "permute_1 (Permute) (None, 224, 224, 3) 0 \n", 224 | "_________________________________________________________________\n", 225 | "conv1_1 (Conv2D) (None, 224, 224, 64) 1792 \n", 226 | "_________________________________________________________________\n", 227 | "conv1_2 (Conv2D) (None, 224, 224, 64) 36928 \n", 228 | "_________________________________________________________________\n", 229 | "max_pooling2d_1 (MaxPooling2 (None, 112, 112, 64) 0 \n", 230 | "_________________________________________________________________\n", 231 | "conv2_1 (Conv2D) (None, 112, 112, 128) 73856 \n", 232 | "_________________________________________________________________\n", 233 | "conv2_2 (Conv2D) (None, 112, 112, 128) 147584 \n", 234 | "_________________________________________________________________\n", 235 | "max_pooling2d_2 (MaxPooling2 (None, 56, 56, 128) 0 \n", 236 | "_________________________________________________________________\n", 237 | "conv3_1 (Conv2D) (None, 56, 56, 256) 295168 \n", 238 | "_________________________________________________________________\n", 239 | "conv3_2 (Conv2D) (None, 56, 56, 256) 590080 \n", 240 | "_________________________________________________________________\n", 241 | "conv3_3 (Conv2D) (None, 56, 56, 256) 590080 \n", 242 | "_________________________________________________________________\n", 243 | "max_pooling2d_3 (MaxPooling2 (None, 28, 28, 256) 0 \n", 244 | "_________________________________________________________________\n", 245 | "conv4_1 (Conv2D) (None, 28, 28, 512) 1180160 \n", 246 | "_________________________________________________________________\n", 247 | "conv4_2 (Conv2D) (None, 28, 28, 512) 2359808 \n", 248 | "_________________________________________________________________\n", 249 | "conv4_3 (Conv2D) (None, 28, 28, 512) 2359808 \n", 250 | "_________________________________________________________________\n", 251 | "max_pooling2d_4 (MaxPooling2 (None, 14, 14, 512) 0 \n", 252 | "_________________________________________________________________\n", 253 | "conv5_1 (Conv2D) (None, 14, 14, 512) 2359808 \n", 254 | "_________________________________________________________________\n", 255 | "conv5_2 (Conv2D) (None, 14, 14, 512) 2359808 \n", 256 | "_________________________________________________________________\n", 257 | "conv5_3 (Conv2D) (None, 14, 14, 512) 2359808 \n", 258 | "_________________________________________________________________\n", 259 | "max_pooling2d_5 (MaxPooling2 (None, 7, 7, 512) 0 \n", 260 | "_________________________________________________________________\n", 261 | "fc6 (Conv2D) (None, 1, 1, 4096) 102764544 \n", 262 | "_________________________________________________________________\n", 263 | "dropout_1 (Dropout) (None, 1, 1, 4096) 0 \n", 264 | "_________________________________________________________________\n", 265 | "fc7 (Conv2D) (None, 1, 1, 4096) 16781312 \n", 266 | "_________________________________________________________________\n", 267 | "dropout_2 (Dropout) (None, 1, 1, 4096) 0 \n", 268 | "_________________________________________________________________\n", 269 | "fc8 (Conv2D) (None, 1, 1, 2622) 10742334 \n", 270 | "_________________________________________________________________\n", 271 | "flatten_1 (Flatten) (None, 2622) 0 \n", 272 | "_________________________________________________________________\n", 273 | "activation_1 (Activation) (None, 2622) 0 \n", 274 | "=================================================================\n", 275 | "Total params: 145,002,878\n", 276 | "Trainable params: 145,002,878\n", 277 | "Non-trainable params: 0\n", 278 | "_________________________________________________________________\n" 279 | ] 280 | } 281 | ], 282 | "source": [ 283 | "facemodel = vgg_face_blank()\n", 284 | "facemodel.summary()" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "execution_count": 12, 290 | "metadata": { 291 | "collapsed": true 292 | }, 293 | "outputs": [], 294 | "source": [ 295 | "from scipy.io import loadmat" 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": 14, 301 | "metadata": { 302 | "collapsed": true 303 | }, 304 | "outputs": [], 305 | "source": [ 306 | "data = loadmat('vgg-face.mat', matlab_compatible=False, struct_as_record=False)\n", 307 | "l = data['layers']\n", 308 | "description = data['meta'][0,0].classes[0,0].description\n" 309 | ] 310 | }, 311 | { 312 | "cell_type": "code", 313 | "execution_count": 15, 314 | "metadata": {}, 315 | "outputs": [ 316 | { 317 | "data": { 318 | "text/plain": [ 319 | "((1, 37), (2622, 1))" 320 | ] 321 | }, 322 | "execution_count": 15, 323 | "metadata": {}, 324 | "output_type": "execute_result" 325 | } 326 | ], 327 | "source": [ 328 | "l.shape, description.shape" 329 | ] 330 | }, 331 | { 332 | "cell_type": "code", 333 | "execution_count": 16, 334 | "metadata": {}, 335 | "outputs": [ 336 | { 337 | "data": { 338 | "text/plain": [ 339 | "('conv', 'conv3_1')" 340 | ] 341 | }, 342 | "execution_count": 16, 343 | "metadata": {}, 344 | "output_type": "execute_result" 345 | } 346 | ], 347 | "source": [ 348 | "l[0,10][0,0].type[0], l[0,10][0,0].name[0]" 349 | ] 350 | }, 351 | { 352 | "cell_type": "code", 353 | "execution_count": 17, 354 | "metadata": {}, 355 | "outputs": [ 356 | { 357 | "data": { 358 | "text/plain": [ 359 | "((3, 3, 128, 256), (256, 1))" 360 | ] 361 | }, 362 | "execution_count": 17, 363 | "metadata": {}, 364 | "output_type": "execute_result" 365 | } 366 | ], 367 | "source": [ 368 | "l[0,10][0,0].weights[0,0].shape, l[0,10][0,0].weights[0,1].shape" 369 | ] 370 | }, 371 | { 372 | "cell_type": "code", 373 | "execution_count": 18, 374 | "metadata": { 375 | "collapsed": true 376 | }, 377 | "outputs": [], 378 | "source": [ 379 | "def weight_compare(kmodel):\n", 380 | " kerasnames = [lr.name for lr in kmodel.layers]\n", 381 | "\n", 382 | " # WARNING : important setting as 2 of the 4 axis have same size dimension\n", 383 | " #prmt = (3,2,0,1) # INFO : for 'th' setting of 'dim_ordering'\n", 384 | " prmt = (0,1,2,3) # INFO : for 'channels_last' setting of 'image_data_format'\n", 385 | "\n", 386 | " for i in range(l.shape[1]):\n", 387 | " matname = l[0,i][0,0].name[0]\n", 388 | " mattype = l[0,i][0,0].type[0]\n", 389 | " if matname in kerasnames:\n", 390 | " kindex = kerasnames.index(matname)\n", 391 | " print(matname, mattype)\n", 392 | " print(l[0,i][0,0].weights[0,0].transpose(prmt).shape, l[0,i][0,0].weights[0,1].shape)\n", 393 | " print(kmodel.layers[kindex].get_weights()[0].shape, kmodel.layers[kindex].get_weights()[1].shape)\n", 394 | " print('------------------------------------------')\n", 395 | " else:\n", 396 | " print('MISSING : ', matname, mattype)\n", 397 | " print('------------------------------------------')" 398 | ] 399 | }, 400 | { 401 | "cell_type": "code", 402 | "execution_count": 19, 403 | "metadata": { 404 | "collapsed": true 405 | }, 406 | "outputs": [], 407 | "source": [ 408 | "def copy_mat_to_keras(kmodel):\n", 409 | "\n", 410 | " kerasnames = [lr.name for lr in kmodel.layers]\n", 411 | "\n", 412 | " # WARNING : important setting as 2 of the 4 axis have same size dimension\n", 413 | " #prmt = (3,2,0,1) # INFO : for 'th' setting of 'dim_ordering'\n", 414 | " prmt = (0,1,2,3) # INFO : for 'channels_last' setting of 'image_data_format'\n", 415 | "\n", 416 | " for i in range(l.shape[1]):\n", 417 | " matname = l[0,i][0,0].name[0]\n", 418 | " if matname in kerasnames:\n", 419 | " kindex = kerasnames.index(matname)\n", 420 | " #print matname\n", 421 | " l_weights = l[0,i][0,0].weights[0,0]\n", 422 | " l_bias = l[0,i][0,0].weights[0,1]\n", 423 | " f_l_weights = l_weights.transpose(prmt)\n", 424 | " #f_l_weights = np.flip(f_l_weights, 2) # INFO : for 'th' setting in dim_ordering\n", 425 | " #f_l_weights = np.flip(f_l_weights, 3) # INFO : for 'th' setting in dim_ordering\n", 426 | " assert (f_l_weights.shape == kmodel.layers[kindex].get_weights()[0].shape)\n", 427 | " assert (l_bias.shape[1] == 1)\n", 428 | " assert (l_bias[:,0].shape == kmodel.layers[kindex].get_weights()[1].shape)\n", 429 | " assert (len(kmodel.layers[kindex].get_weights()) == 2)\n", 430 | " kmodel.layers[kindex].set_weights([f_l_weights, l_bias[:,0]])\n", 431 | " #print '------------------------------------------'" 432 | ] 433 | }, 434 | { 435 | "cell_type": "code", 436 | "execution_count": 20, 437 | "metadata": { 438 | "collapsed": true 439 | }, 440 | "outputs": [], 441 | "source": [ 442 | "copy_mat_to_keras(facemodel)" 443 | ] 444 | }, 445 | { 446 | "cell_type": "code", 447 | "execution_count": 29, 448 | "metadata": { 449 | "collapsed": true 450 | }, 451 | "outputs": [], 452 | "source": [ 453 | "def pred(kmodel, crpimg, transform=False):\n", 454 | " \n", 455 | " # transform=True seems more robust but I think the RGB channels are not in right order\n", 456 | " \n", 457 | " imarr = np.array(crpimg).astype(np.float32)\n", 458 | "\n", 459 | " if transform:\n", 460 | " imarr[:,:,0] -= 129.1863\n", 461 | " imarr[:,:,1] -= 104.7624\n", 462 | " imarr[:,:,2] -= 93.5940\n", 463 | " #\n", 464 | " # WARNING : in this script (https://github.com/rcmalli/keras-vggface) colours are switched\n", 465 | " aux = copy.copy(imarr)\n", 466 | " #imarr[:, :, 0] = aux[:, :, 2]\n", 467 | " #imarr[:, :, 2] = aux[:, :, 0]\n", 468 | "\n", 469 | " #imarr[:,:,0] -= 129.1863\n", 470 | " #imarr[:,:,1] -= 104.7624\n", 471 | " #imarr[:,:,2] -= 93.5940\n", 472 | "\n", 473 | " #imarr = imarr.transpose((2,0,1)) # INFO : for 'th' setting of 'dim_ordering'\n", 474 | " imarr = np.expand_dims(imarr, axis=0)\n", 475 | "\n", 476 | " out = kmodel.predict(imarr)\n", 477 | "\n", 478 | " best_index = np.argmax(out, axis=1)[0]\n", 479 | " best_name = description[best_index,0]\n", 480 | " print(best_index, best_name[0], out[0,best_index], [np.min(out), np.max(out)])\n" 481 | ] 482 | }, 483 | { 484 | "cell_type": "code", 485 | "execution_count": 24, 486 | "metadata": { 487 | "collapsed": true 488 | }, 489 | "outputs": [], 490 | "source": [ 491 | "im = Image.open('Downloads/ak.png') # WARNING : this image is well centered and square\n", 492 | "im = im.resize((224,224))" 493 | ] 494 | }, 495 | { 496 | "cell_type": "code", 497 | "execution_count": 23, 498 | "metadata": {}, 499 | "outputs": [ 500 | { 501 | "name": "stdout", 502 | "output_type": "stream", 503 | "text": [ 504 | "\u001b[0m\u001b[01;34mDesktop\u001b[0m/ FaceReocgMAt.ipynb \u001b[01;34mopencv_contrib\u001b[0m/ \u001b[01;34mTemplates\u001b[0m/\r\n", 505 | "\u001b[01;34mDocuments\u001b[0m/ \u001b[01;34mfaces94\u001b[0m/ \u001b[01;34mPictures\u001b[0m/ Untitled.ipynb\r\n", 506 | "\u001b[01;34mDownloads\u001b[0m/ \u001b[01;34mMusic\u001b[0m/ \u001b[01;34mprj\u001b[0m/ vgg-face.mat\r\n", 507 | "\u001b[01;34menv_prj_3\u001b[0m/ \u001b[01;34mopencv\u001b[0m/ \u001b[01;34mPublic\u001b[0m/ \u001b[01;34mVideos\u001b[0m/\r\n" 508 | ] 509 | } 510 | ], 511 | "source": [ 512 | "%ls" 513 | ] 514 | }, 515 | { 516 | "cell_type": "code", 517 | "execution_count": 25, 518 | "metadata": {}, 519 | "outputs": [ 520 | { 521 | "data": { 522 | "text/plain": [ 523 | "" 524 | ] 525 | }, 526 | "execution_count": 25, 527 | "metadata": {}, 528 | "output_type": "execute_result" 529 | }, 530 | { 531 | "data": { 532 | "image/png": "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\n/X+eJfhS9Y9uDQAAAABJRU5ErkJggg==\n", 533 | "text/plain": [ 534 | "" 535 | ] 536 | }, 537 | "metadata": {}, 538 | "output_type": "display_data" 539 | } 540 | ], 541 | "source": [ 542 | "plt.imshow(np.asarray(im))\n" 543 | ] 544 | }, 545 | { 546 | "cell_type": "code", 547 | "execution_count": 26, 548 | "metadata": { 549 | "collapsed": true 550 | }, 551 | "outputs": [], 552 | "source": [ 553 | "crpim = im" 554 | ] 555 | }, 556 | { 557 | "cell_type": "code", 558 | "execution_count": 30, 559 | "metadata": {}, 560 | "outputs": [ 561 | { 562 | "name": "stdout", 563 | "output_type": "stream", 564 | "text": [ 565 | "2 Aamir_Khan 0.994438 [9.476131e-09, 0.99443793]\n", 566 | "2 Aamir_Khan 0.944438 [2.2034408e-06, 0.9444375]\n" 567 | ] 568 | } 569 | ], 570 | "source": [ 571 | "pred(facemodel, crpim, transform=False)\n", 572 | "pred(facemodel, crpim, transform=True)\n" 573 | ] 574 | }, 575 | { 576 | "cell_type": "code", 577 | "execution_count": 28, 578 | "metadata": { 579 | "collapsed": true 580 | }, 581 | "outputs": [], 582 | "source": [ 583 | "import copy" 584 | ] 585 | }, 586 | { 587 | "cell_type": "code", 588 | "execution_count": 34, 589 | "metadata": {}, 590 | "outputs": [ 591 | { 592 | "data": { 593 | "text/plain": [ 594 | "'Amy_Davidson'" 595 | ] 596 | }, 597 | "execution_count": 34, 598 | "metadata": {}, 599 | "output_type": "execute_result" 600 | } 601 | ], 602 | "source": [ 603 | "description[102,0][0]\n" 604 | ] 605 | }, 606 | { 607 | "cell_type": "code", 608 | "execution_count": 35, 609 | "metadata": {}, 610 | "outputs": [ 611 | { 612 | "data": { 613 | "text/plain": [ 614 | "array([[array(['A.J._Buckley'],\n", 615 | " dtype='" 674 | ] 675 | }, 676 | "execution_count": 29, 677 | "metadata": {}, 678 | "output_type": "execute_result" 679 | } 680 | ], 681 | "source": [ 682 | "layer_count\n", 683 | "facemodel.layers.pop()\n", 684 | "facemodel.layers.pop()\n", 685 | "facemodel.layers.pop()" 686 | ] 687 | }, 688 | { 689 | "cell_type": "code", 690 | "execution_count": 30, 691 | "metadata": {}, 692 | "outputs": [], 693 | "source": [ 694 | "facemodel.outputs = [facemodel.layers[-1].output]" 695 | ] 696 | }, 697 | { 698 | "cell_type": "code", 699 | "execution_count": 31, 700 | "metadata": {}, 701 | "outputs": [ 702 | { 703 | "data": { 704 | "text/plain": [ 705 | "" 706 | ] 707 | }, 708 | "execution_count": 31, 709 | "metadata": {}, 710 | "output_type": "execute_result" 711 | } 712 | ], 713 | "source": [ 714 | "facemodel.layers[-1]" 715 | ] 716 | }, 717 | { 718 | "cell_type": "code", 719 | "execution_count": 32, 720 | "metadata": {}, 721 | "outputs": [], 722 | "source": [ 723 | "facemodel.add( Convolution2D(7, kernel_size=(1, 1), activation='relu') ) # Keras 2\n", 724 | "facemodel.add( Flatten() )\n", 725 | "facemodel.add( Activation('softmax') )" 726 | ] 727 | }, 728 | { 729 | "cell_type": "code", 730 | "execution_count": 33, 731 | "metadata": {}, 732 | "outputs": [ 733 | { 734 | "name": "stdout", 735 | "output_type": "stream", 736 | "text": [ 737 | "_________________________________________________________________\n", 738 | "Layer (type) Output Shape Param # \n", 739 | "=================================================================\n", 740 | "permute_1 (Permute) (None, 224, 224, 3) 0 \n", 741 | "_________________________________________________________________\n", 742 | "conv1_1 (Conv2D) (None, 224, 224, 64) 1792 \n", 743 | "_________________________________________________________________\n", 744 | "conv1_2 (Conv2D) (None, 224, 224, 64) 36928 \n", 745 | "_________________________________________________________________\n", 746 | "max_pooling2d_1 (MaxPooling2 (None, 112, 112, 64) 0 \n", 747 | "_________________________________________________________________\n", 748 | "conv2_1 (Conv2D) (None, 112, 112, 128) 73856 \n", 749 | "_________________________________________________________________\n", 750 | "conv2_2 (Conv2D) (None, 112, 112, 128) 147584 \n", 751 | "_________________________________________________________________\n", 752 | "max_pooling2d_2 (MaxPooling2 (None, 56, 56, 128) 0 \n", 753 | "_________________________________________________________________\n", 754 | "conv3_1 (Conv2D) (None, 56, 56, 256) 295168 \n", 755 | "_________________________________________________________________\n", 756 | "conv3_2 (Conv2D) (None, 56, 56, 256) 590080 \n", 757 | "_________________________________________________________________\n", 758 | "conv3_3 (Conv2D) (None, 56, 56, 256) 590080 \n", 759 | "_________________________________________________________________\n", 760 | "max_pooling2d_3 (MaxPooling2 (None, 28, 28, 256) 0 \n", 761 | "_________________________________________________________________\n", 762 | "conv4_1 (Conv2D) (None, 28, 28, 512) 1180160 \n", 763 | "_________________________________________________________________\n", 764 | "conv4_2 (Conv2D) (None, 28, 28, 512) 2359808 \n", 765 | "_________________________________________________________________\n", 766 | "conv4_3 (Conv2D) (None, 28, 28, 512) 2359808 \n", 767 | "_________________________________________________________________\n", 768 | "max_pooling2d_4 (MaxPooling2 (None, 14, 14, 512) 0 \n", 769 | "_________________________________________________________________\n", 770 | "conv5_1 (Conv2D) (None, 14, 14, 512) 2359808 \n", 771 | "_________________________________________________________________\n", 772 | "conv5_2 (Conv2D) (None, 14, 14, 512) 2359808 \n", 773 | "_________________________________________________________________\n", 774 | "conv5_3 (Conv2D) (None, 14, 14, 512) 2359808 \n", 775 | "_________________________________________________________________\n", 776 | "max_pooling2d_5 (MaxPooling2 (None, 7, 7, 512) 0 \n", 777 | "_________________________________________________________________\n", 778 | "fc6 (Conv2D) (None, 1, 1, 4096) 102764544 \n", 779 | "_________________________________________________________________\n", 780 | "dropout_1 (Dropout) (None, 1, 1, 4096) 0 \n", 781 | "_________________________________________________________________\n", 782 | "fc7 (Conv2D) (None, 1, 1, 4096) 16781312 \n", 783 | "_________________________________________________________________\n", 784 | "dropout_2 (Dropout) (None, 1, 1, 4096) 0 \n", 785 | "_________________________________________________________________\n", 786 | "conv2d_1 (Conv2D) (None, 1, 1, 7) 28679 \n", 787 | "_________________________________________________________________\n", 788 | "flatten_2 (Flatten) (None, 7) 0 \n", 789 | "_________________________________________________________________\n", 790 | "activation_2 (Activation) (None, 7) 0 \n", 791 | "=================================================================\n", 792 | "Total params: 134,289,223\n", 793 | "Trainable params: 28,679\n", 794 | "Non-trainable params: 134,260,544\n", 795 | "_________________________________________________________________\n" 796 | ] 797 | } 798 | ], 799 | "source": [ 800 | "\n", 801 | "facemodel.summary()" 802 | ] 803 | }, 804 | { 805 | "cell_type": "markdown", 806 | "metadata": {}, 807 | "source": [ 808 | "# facemodel.compile(loss='categorical_crossentropy', optimizer=\"adam\", metrics=['accuracy'])" 809 | ] 810 | }, 811 | { 812 | "cell_type": "markdown", 813 | "metadata": {}, 814 | "source": [ 815 | "# optimizer.lr.set_value(0.02)" 816 | ] 817 | }, 818 | { 819 | "cell_type": "markdown", 820 | "metadata": {}, 821 | "source": [ 822 | "# facemodel.optimizer.lr.set_value(0.01)" 823 | ] 824 | }, 825 | { 826 | "cell_type": "markdown", 827 | "metadata": {}, 828 | "source": [ 829 | "# sgd = SGD(lr=0.1, decay=0, momentum=0.9, nesterov=True)" 830 | ] 831 | }, 832 | { 833 | "cell_type": "markdown", 834 | "metadata": {}, 835 | "source": [ 836 | "# opti=facemodel.optimizer" 837 | ] 838 | }, 839 | { 840 | "cell_type": "markdown", 841 | "metadata": {}, 842 | "source": [ 843 | "# opti.lr.get_value()" 844 | ] 845 | }, 846 | { 847 | "cell_type": "markdown", 848 | "metadata": {}, 849 | "source": [ 850 | "# from keras.callbacks import LearningRateScheduler" 851 | ] 852 | }, 853 | { 854 | "cell_type": "markdown", 855 | "metadata": {}, 856 | "source": [ 857 | "# def scheduler(epoch):\n", 858 | " lr = K.get_value(facemodel.optimizer.lr)\n", 859 | " print(lr)\n", 860 | " K.set_value(facemodel.optimizer.lr, 0.01)\n", 861 | " return K.get_value(facemodel.optimizer.lr)" 862 | ] 863 | }, 864 | { 865 | "cell_type": "markdown", 866 | "metadata": {}, 867 | "source": [ 868 | "# lr_decay = LearningRateScheduler(scheduler)" 869 | ] 870 | }, 871 | { 872 | "cell_type": "code", 873 | "execution_count": 33, 874 | "metadata": {}, 875 | "outputs": [], 876 | "source": [ 877 | "adam = ks.optimizers.Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)" 878 | ] 879 | }, 880 | { 881 | "cell_type": "raw", 882 | "metadata": {}, 883 | "source": [ 884 | "adam = ks.optimizers.Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)" 885 | ] 886 | }, 887 | { 888 | "cell_type": "markdown", 889 | "metadata": {}, 890 | "source": [ 891 | "# facemodel.compile(loss='categorical_crossentropy', optimizer=\"adam\", metrics=['accuracy'])" 892 | ] 893 | }, 894 | { 895 | "cell_type": "code", 896 | "execution_count": 34, 897 | "metadata": {}, 898 | "outputs": [], 899 | "source": [ 900 | "facemodel.compile(loss='categorical_crossentropy', optimizer=\"adam\", metrics=['accuracy'])" 901 | ] 902 | }, 903 | { 904 | "cell_type": "code", 905 | "execution_count": 35, 906 | "metadata": {}, 907 | "outputs": [], 908 | "source": [ 909 | "from time import time\n", 910 | "from keras.callbacks import TensorBoard\n", 911 | "tensorboard = TensorBoard(log_dir=\"logs/final/{}\".format(time()), histogram_freq=1, write_graph=True, write_images=True)\n" 912 | ] 913 | }, 914 | { 915 | "cell_type": "code", 916 | "execution_count": null, 917 | "metadata": { 918 | "scrolled": true 919 | }, 920 | "outputs": [ 921 | { 922 | "name": "stdout", 923 | "output_type": "stream", 924 | "text": [ 925 | "Train on 126 samples, validate on 14 samples\n", 926 | "Epoch 1/30\n", 927 | "126/126 [==============================] - 66s - loss: 5.0479 - acc: 0.1270 - val_loss: 1.8153 - val_acc: 0.4286\n", 928 | "Epoch 2/30\n", 929 | "126/126 [==============================] - 67s - loss: 2.1370 - acc: 0.4444 - val_loss: 0.6681 - val_acc: 0.7857\n", 930 | "Epoch 3/30\n", 931 | "126/126 [==============================] - 67s - loss: 0.8985 - acc: 0.6349 - val_loss: 0.3428 - val_acc: 0.8571\n", 932 | "Epoch 4/30\n", 933 | "126/126 [==============================] - 67s - loss: 0.5765 - acc: 0.7937 - val_loss: 0.2876 - val_acc: 0.8571\n", 934 | "Epoch 5/30\n", 935 | "126/126 [==============================] - 67s - loss: 0.4562 - acc: 0.8254 - val_loss: 0.2796 - val_acc: 0.8571\n", 936 | "Epoch 6/30\n", 937 | "126/126 [==============================] - 67s - loss: 0.3031 - acc: 0.8571 - val_loss: 0.2783 - val_acc: 0.8571\n", 938 | "Epoch 7/30\n", 939 | "126/126 [==============================] - 67s - loss: 0.3357 - acc: 0.8333 - val_loss: 0.2781 - val_acc: 0.8571\n", 940 | "Epoch 8/30\n", 941 | "126/126 [==============================] - 68s - loss: 0.2815 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 942 | "Epoch 9/30\n", 943 | "126/126 [==============================] - 67s - loss: 0.2781 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 944 | "Epoch 10/30\n", 945 | "126/126 [==============================] - 66s - loss: 0.2800 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 946 | "Epoch 11/30\n", 947 | "126/126 [==============================] - 67s - loss: 0.2789 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 948 | "Epoch 12/30\n", 949 | "126/126 [==============================] - 67s - loss: 0.2829 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 950 | "Epoch 13/30\n", 951 | "126/126 [==============================] - 67s - loss: 0.2782 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 952 | "Epoch 14/30\n", 953 | "126/126 [==============================] - 67s - loss: 0.2781 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 954 | "Epoch 15/30\n", 955 | "126/126 [==============================] - 67s - loss: 0.2654 - acc: 0.8651 - val_loss: 0.2780 - val_acc: 0.8571\n", 956 | "Epoch 16/30\n", 957 | "126/126 [==============================] - 67s - loss: 0.2807 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 958 | "Epoch 17/30\n", 959 | "126/126 [==============================] - 67s - loss: 0.2829 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 960 | "Epoch 18/30\n", 961 | "126/126 [==============================] - 66s - loss: 0.2781 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 962 | "Epoch 19/30\n", 963 | "126/126 [==============================] - 67s - loss: 0.2796 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 964 | "Epoch 20/30\n", 965 | "126/126 [==============================] - 67s - loss: 0.2781 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 966 | "Epoch 21/30\n", 967 | "126/126 [==============================] - 67s - loss: 0.2780 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 968 | "Epoch 22/30\n", 969 | "126/126 [==============================] - 67s - loss: 0.2780 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 970 | "Epoch 23/30\n", 971 | "126/126 [==============================] - 67s - loss: 0.2846 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 972 | "Epoch 24/30\n", 973 | "126/126 [==============================] - 67s - loss: 0.2781 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 974 | "Epoch 25/30\n", 975 | "126/126 [==============================] - 67s - loss: 0.2780 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 976 | "Epoch 26/30\n", 977 | "126/126 [==============================] - 67s - loss: 0.2753 - acc: 0.8651 - val_loss: 0.2780 - val_acc: 0.8571\n", 978 | "Epoch 27/30\n", 979 | "126/126 [==============================] - 67s - loss: 0.2780 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 980 | "Epoch 28/30\n", 981 | "126/126 [==============================] - 67s - loss: 0.2744 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 982 | "Epoch 29/30\n", 983 | "126/126 [==============================] - 67s - loss: 0.2780 - acc: 0.8571 - val_loss: 0.2780 - val_acc: 0.8571\n", 984 | "Epoch 30/30\n" 985 | ] 986 | } 987 | ], 988 | "source": [ 989 | "facemodel.fit(X_train, Y_train, validation_data=(X_test, Y_test), epochs=30, batch_size=100, verbose=1,callbacks=[tensorboard])" 990 | ] 991 | }, 992 | { 993 | "cell_type": "code", 994 | "execution_count": null, 995 | "metadata": {}, 996 | "outputs": [], 997 | "source": [ 998 | "model = Sequential()\n", 999 | "model.add(Dense(512,input_shape=(X_train.shape[1],)))\n", 1000 | "model.add(Activation('relu'))\n", 1001 | "model.add(Dropout(0.2))\n", 1002 | "model.add(Dense(512))\n", 1003 | "model.add(Activation('relu'))\n", 1004 | "model.add(Dropout(0.2))\n", 1005 | "model.add(Dense(nb_classes))\n", 1006 | "model.add(Activation('softmax'))" 1007 | ] 1008 | }, 1009 | { 1010 | "cell_type": "code", 1011 | "execution_count": null, 1012 | "metadata": { 1013 | "scrolled": false 1014 | }, 1015 | "outputs": [], 1016 | "source": [ 1017 | "model.summary()" 1018 | ] 1019 | }, 1020 | { 1021 | "cell_type": "code", 1022 | "execution_count": null, 1023 | "metadata": {}, 1024 | "outputs": [], 1025 | "source": [ 1026 | "adam = ks.optimizers.Adam(lr=0.1, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)" 1027 | ] 1028 | }, 1029 | { 1030 | "cell_type": "code", 1031 | "execution_count": null, 1032 | "metadata": {}, 1033 | "outputs": [], 1034 | "source": [ 1035 | "model.compile(loss='categorical_crossentropy', optimizer=\"adam\", metrics=['accuracy'])" 1036 | ] 1037 | }, 1038 | { 1039 | "cell_type": "code", 1040 | "execution_count": null, 1041 | "metadata": {}, 1042 | "outputs": [], 1043 | "source": [ 1044 | "model.fit(X_train, Y_train, batch_size=64, nb_epoch=50, verbose=1, validation_data=(X_test, Y_test))" 1045 | ] 1046 | }, 1047 | { 1048 | "cell_type": "code", 1049 | "execution_count": null, 1050 | "metadata": {}, 1051 | "outputs": [], 1052 | "source": [] 1053 | }, 1054 | { 1055 | "cell_type": "code", 1056 | "execution_count": null, 1057 | "metadata": {}, 1058 | "outputs": [], 1059 | "source": [] 1060 | } 1061 | ], 1062 | "metadata": { 1063 | "kernelspec": { 1064 | "display_name": "env_prj_3", 1065 | "language": "python", 1066 | "name": "env_prj_3" 1067 | }, 1068 | "language_info": { 1069 | "codemirror_mode": { 1070 | "name": "ipython", 1071 | "version": 3 1072 | }, 1073 | "file_extension": ".py", 1074 | "mimetype": "text/x-python", 1075 | "name": "python", 1076 | "nbconvert_exporter": "python", 1077 | "pygments_lexer": "ipython3", 1078 | "version": "3.5.4" 1079 | } 1080 | }, 1081 | "nbformat": 4, 1082 | "nbformat_minor": 2 1083 | } 1084 | -------------------------------------------------------------------------------- /Presentation.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DEBOJYOTI11/Automated-CCTV-surveillance/921b44b2873a47f27c57087eb92a5dc62c262503/Presentation.pdf -------------------------------------------------------------------------------- /Project Report.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DEBOJYOTI11/Automated-CCTV-surveillance/921b44b2873a47f27c57087eb92a5dc62c262503/Project Report.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Automated CCTV sureveillence 2 | 3 | The project is still under development. 4 | 5 | ## Introduction 6 | 7 | The issue of mass surveillance in CCTV camera feed is very important. Surveillance can be of 8 | different forms like malicious activity detection, identification of a particular entity particular 9 | individual in a CCTV video) or in general keeping tracks of movements of human beings. In our 10 | project, the focus has been given to find the trajectory/path of human through the grid of CCTV 11 | cameras also known as tracking. Also, manually doing tracking can be very difficult and 12 | therefore we present to you our AI based solution that is capable to do this on its own. This is 13 | done with the help of face recognition plus video processing. 14 | Current system in this field aims to search for an entity in video by extracting its face and 15 | matching (or running) it against a database of human faces that is in the interest. So, none of the 16 | systems solve the task if they do not have a predefined database against whom the matching is 17 | done. Our, Smart AI will do this in a smart way by first generating datasets from human faces 18 | taken from CCTV video and use it in a Face Recognition model we are using. 19 | The use of deep learning libraries like Keras along with some image processing tools like 20 | openCV with a cloud based solution is done to achieve this task. 21 | Keywords: Automated tracking, Convolutional-Neural-Network, face recognition. 22 | 23 | ### Prerequisites 24 | 25 | Please take a look at the slides and Report for more information. 26 | 27 | 28 | ### Required packages 29 | 30 | * Python3 31 | * OpenCV 32 | * Keras 33 | * Flask 34 | * SQlite or MySQL 35 | 36 | 37 | ### Using Face recognition model 38 | ``` 39 | Run FaceRecog.ipynb for looking at the original VGG model 40 | ``` 41 | 42 | ``` 43 | Run FaceRecog_TransfererLearning.ipynb for our model ( VGG model with transfer learning) 44 | ``` 45 | Both the model use a face dataset for experimentation. Please it here [Face94](http://cswww.essex.ac.uk/mv/allfaces/faces94.html) and place in the project folder where the model in kept. 46 | 47 | ### Running client side CCTV application 48 | 49 | ![alt text](https://raw.githubusercontent.com/DEBOJYOTI11/Automated-CCTV-surveillance/master/workflow%20diagram.PNG) 50 | 51 | Go to the ClientSideCCTV folder and Run 52 | ``` 53 | Python main.py 54 | ``` 55 | 56 | This should launch the client side system. 57 | By default it uses the footage form Computer webCam. 58 | 59 | ``` 60 | Images with unique identifier are generated in the RecognizedFaces folder. 61 | ``` 62 | 63 | ### Running the Server 64 | 65 | Configure flask in apache for Google Cloud or Aws and run 66 | 67 | Server/Server Code.py file. 68 | 69 | Configuring is required only for deplyment is cloud (Centralised server). If you are running locally then normal 70 | ``` 71 | python Server/Server Code.py is suffient 72 | ``` 73 | **Linking our Centralised server to the Face Recognition model, so that our main logic could work is unser progress.** 74 | **After the linking is done appropriate analytics can be generated.** 75 | 76 | ### Possible errors 77 | * Keras not installed ( Keras with Tensorflow) 78 | 79 | 80 | ## Deployment 81 | 82 | We have used Google cloud free tier service for deployment. 83 | 84 | ## Authors 85 | 86 | * **Debojyoti Paul** - *Initial work* - [PurpleBooth](https://github.com/debojyoti11) 87 | * **Bhaskar Sarkar** - *Initial work* 88 | 89 | 90 | -------------------------------------------------------------------------------- /Server/Server code.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template, request 2 | from werkzeug.exceptions import BadRequest 3 | import os 4 | from werkzeug import secure_filename 5 | import json 6 | from flask import send_from_directory 7 | from flask_restplus import abort 8 | 9 | import logging 10 | from logging.handlers import RotatingFileHandler 11 | import time 12 | import traceback 13 | app = Flask(__name__) 14 | 15 | app.config['UPLOAD_FOLDER'] = 'DatasetGenerated' 16 | 17 | 18 | @app.route('/') 19 | def index(): 20 | return render_template('index.html') 21 | 22 | 23 | 24 | @app.route('/upload', methods=['GET', 'POST']) 25 | def upload(): 26 | 27 | if request.method == 'POST': 28 | print '[Info] In /upload with method=Post' 29 | for f in request.files.getlist('images'): 30 | f.save(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(f.filename))) 31 | return json.dumps({'status':'success'}) 32 | else: 33 | return "This is for Post request only. Try a POst request" 34 | 35 | 36 | 37 | @app.after_request 38 | def after_request(response): 39 | if response.status_code != 500: 40 | ts = time.strftime('[%Y-%b-%d %H:%M]') 41 | logger.error('%s %s %s %s %s %s', 42 | ts, 43 | request.remote_addr, 44 | request.method, 45 | request.scheme, 46 | request.full_path, 47 | response.status) 48 | return response 49 | 50 | @app.errorhandler(Exception) 51 | def exceptions(e): 52 | ts = time.strftime('[%Y-%b-%d %H:%M]') 53 | tb = traceback.format_exc() 54 | logger.error('%s %s %s %s %s 5xx INTERNAL SERVER ERROR\n%s', 55 | ts, 56 | request.remote_addr, 57 | request.method, 58 | request.scheme, 59 | request.full_path, 60 | tb) 61 | return "Internal Server Error", 500 62 | 63 | @app.errorhandler(404) 64 | def Internalerror(e): 65 | return "page not found. %s"%(e.message) 66 | 67 | if __name__ == '__main__': 68 | handler = RotatingFileHandler('projectapp.log', maxBytes=10000, backupCount=3) 69 | logger = logging.getLogger('__name__') 70 | logger = logging.getLogger('werkzeug') 71 | logger.setLevel(logging.ERROR) 72 | logger.addHandler(handler) 73 | app.run(host='127.0.0.1', port=3000, debug = True) 74 | -------------------------------------------------------------------------------- /Server/projectapp.log: -------------------------------------------------------------------------------- 1 | [2017-Dec-01 08:43] 127.0.0.1 POST http /upload? 200 OK 2 | [2017-Dec-01 08:53] 127.0.0.1 POST http /upload? 200 OK 3 | [2017-Dec-01 08:56] 127.0.0.1 POST http /upload? 200 OK 4 | [2017-Dec-01 09:02] 127.0.0.1 POST http /upload? 5xx INTERNAL SERVER ERROR 5 | Traceback (most recent call last): 6 | File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1639, in full_dispatch_request 7 | File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1625, in dispatch_request 8 | File "Server code.py", line 29, in upload 9 | File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 343, in __getattr__ 10 | File "/usr/local/lib/python2.7/dist-packages/werkzeug/utils.py", line 73, in __get__ 11 | File "/usr/local/lib/python2.7/dist-packages/werkzeug/wrappers.py", line 520, in files 12 | File "/usr/local/lib/python2.7/dist-packages/flask/wrappers.py", line 184, in _load_form_data 13 | File "/usr/local/lib/python2.7/dist-packages/werkzeug/wrappers.py", line 361, in _load_form_data 14 | File "/usr/local/lib/python2.7/dist-packages/werkzeug/formparser.py", line 195, in parse 15 | File "/usr/local/lib/python2.7/dist-packages/werkzeug/formparser.py", line 100, in wrapper 16 | File "/usr/local/lib/python2.7/dist-packages/werkzeug/formparser.py", line 212, in _parse_multipart 17 | File "/usr/local/lib/python2.7/dist-packages/werkzeug/formparser.py", line 523, in parse 18 | File "/usr/local/lib/python2.7/dist-packages/werkzeug/datastructures.py", line 382, in __init__ 19 | File "/usr/local/lib/python2.7/dist-packages/werkzeug/formparser.py", line 521, in 20 | File "/usr/local/lib/python2.7/dist-packages/werkzeug/formparser.py", line 486, in parse_parts 21 | File "/usr/local/lib/python2.7/dist-packages/werkzeug/formparser.py", line 357, in start_file_streaming 22 | File "/usr/local/lib/python2.7/dist-packages/werkzeug/wrappers.py", line 316, in _get_file_stream 23 | File "/usr/local/lib/python2.7/dist-packages/werkzeug/formparser.py", line 42, in default_stream_factory 24 | File "/usr/lib/python2.7/tempfile.py", line 511, in TemporaryFile 25 | File "/usr/lib/python2.7/tempfile.py", line 244, in _mkstemp_inner 26 | OSError: [Errno 24] Too many open files: '/tmp/tmpZgUZdo' 27 | 28 | [2017-Dec-01 09:03] 127.0.0.1 POST http /upload? 200 OK 29 | -------------------------------------------------------------------------------- /Server/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | Welcome to our app 3 | -------------------------------------------------------------------------------- /flask debian setup.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DEBOJYOTI11/Automated-CCTV-surveillance/921b44b2873a47f27c57087eb92a5dc62c262503/flask debian setup.pdf -------------------------------------------------------------------------------- /workflow diagram.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DEBOJYOTI11/Automated-CCTV-surveillance/921b44b2873a47f27c57087eb92a5dc62c262503/workflow diagram.PNG --------------------------------------------------------------------------------