├── README.md ├── main.py ├── requirements.txt ├── detection.py ├── camera.py └── model.json /README.md: -------------------------------------------------------------------------------- 1 | # surveillance-system -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from camera import startapplication 2 | 3 | startapplication() -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | tensorflow==2.13.0 2 | numpy==1.24.3 3 | opencv-python==4.8.0.76 4 | -------------------------------------------------------------------------------- /detection.py: -------------------------------------------------------------------------------- 1 | from tensorflow.keras.models import model_from_json 2 | import numpy as np 3 | 4 | class AccidentDetectionModel(object): 5 | 6 | class_nums = ['Accident', "No Accident"] 7 | 8 | def __init__(self, model_json_file, model_weights_file): 9 | # load model from JSON file 10 | with open(model_json_file, "r") as json_file: 11 | loaded_model_json = json_file.read() 12 | self.loaded_model = model_from_json(loaded_model_json) 13 | 14 | # load weights into the new model 15 | self.loaded_model.load_weights(model_weights_file) 16 | self.loaded_model.make_predict_function() 17 | 18 | def predict_accident(self, img): 19 | self.preds = self.loaded_model.predict(img) 20 | return AccidentDetectionModel.class_nums[np.argmax(self.preds)], self.preds -------------------------------------------------------------------------------- /camera.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | from detection import AccidentDetectionModel 3 | import numpy as np 4 | import os 5 | 6 | model = AccidentDetectionModel("models.json", 'model_weights.h5') 7 | font = cv2.FONT_HERSHEY_SIMPLEX 8 | 9 | def startapplication(): 10 | video = cv2.VideoCapture('demos1 - Made with Clipchamp.mp4') # for camera use video = cv2.VideoCapture(0) 11 | while True: 12 | ret, frame = video.read() 13 | gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 14 | roi = cv2.resize(gray_frame, (250, 250)) 15 | 16 | pred, prob = model.predict_accident(roi[np.newaxis, :, :]) 17 | if(pred == "Accident"): 18 | prob = (round(prob[0][0]*100, 2)) 19 | 20 | # to beep when alert: 21 | # if(prob > 90): 22 | # os.system("say beep") 23 | 24 | cv2.rectangle(frame, (0, 0), (280, 40), (0, 0, 0), -1) 25 | cv2.putText(frame, pred+" "+str(prob), (20, 30), font, 1, (255, 255, 0), 2) 26 | 27 | if cv2.waitKey(33) & 0xFF == ord('q'): 28 | return 29 | cv2.imshow('Video', frame) 30 | 31 | 32 | if __name__ == '__main__': 33 | startapplication() -------------------------------------------------------------------------------- /model.json: -------------------------------------------------------------------------------- 1 | { 2 | "module": "keras", 3 | "class_name": "Sequential", 4 | "config": { 5 | "name": "sequential", 6 | "trainable": true, 7 | "dtype": { 8 | "module": "keras", 9 | "class_name": "DTypePolicy", 10 | "config": { "name": "float32" }, 11 | "registered_name": null 12 | }, 13 | "layers": [ 14 | { 15 | "module": "keras.layers", 16 | "class_name": "InputLayer", 17 | "config": { 18 | "batch_shape": [null, 250, 250, 3], 19 | "dtype": "float32", 20 | "sparse": false, 21 | "name": "input_layer" 22 | }, 23 | "registered_name": null 24 | }, 25 | { 26 | "module": "keras.layers", 27 | "class_name": "BatchNormalization", 28 | "config": { 29 | "name": "batch_normalization", 30 | "trainable": true, 31 | "dtype": { 32 | "module": "keras", 33 | "class_name": "DTypePolicy", 34 | "config": { "name": "float32" }, 35 | "registered_name": null 36 | }, 37 | "axis": -1, 38 | "momentum": 0.99, 39 | "epsilon": 0.001, 40 | "center": true, 41 | "scale": true, 42 | "beta_initializer": { 43 | "module": "keras.initializers", 44 | "class_name": "Zeros", 45 | "config": {}, 46 | "registered_name": null 47 | }, 48 | "gamma_initializer": { 49 | "module": "keras.initializers", 50 | "class_name": "Ones", 51 | "config": {}, 52 | "registered_name": null 53 | }, 54 | "moving_mean_initializer": { 55 | "module": "keras.initializers", 56 | "class_name": "Zeros", 57 | "config": {}, 58 | "registered_name": null 59 | }, 60 | "moving_variance_initializer": { 61 | "module": "keras.initializers", 62 | "class_name": "Ones", 63 | "config": {}, 64 | "registered_name": null 65 | }, 66 | "beta_regularizer": null, 67 | "gamma_regularizer": null, 68 | "beta_constraint": null, 69 | "gamma_constraint": null, 70 | "synchronized": false 71 | }, 72 | "registered_name": null, 73 | "build_config": { "input_shape": [null, 250, 250, 3] } 74 | }, 75 | { 76 | "module": "keras.layers", 77 | "class_name": "Conv2D", 78 | "config": { 79 | "name": "conv2d", 80 | "trainable": true, 81 | "dtype": { 82 | "module": "keras", 83 | "class_name": "DTypePolicy", 84 | "config": { "name": "float32" }, 85 | "registered_name": null 86 | }, 87 | "filters": 32, 88 | "kernel_size": [3, 3], 89 | "strides": [1, 1], 90 | "padding": "valid", 91 | "data_format": "channels_last", 92 | "dilation_rate": [1, 1], 93 | "groups": 1, 94 | "activation": "relu", 95 | "use_bias": true, 96 | "kernel_initializer": { 97 | "module": "keras.initializers", 98 | "class_name": "GlorotUniform", 99 | "config": { "seed": null }, 100 | "registered_name": null 101 | }, 102 | "bias_initializer": { 103 | "module": "keras.initializers", 104 | "class_name": "Zeros", 105 | "config": {}, 106 | "registered_name": null 107 | }, 108 | "kernel_regularizer": null, 109 | "bias_regularizer": null, 110 | "activity_regularizer": null, 111 | "kernel_constraint": null, 112 | "bias_constraint": null 113 | }, 114 | "registered_name": null, 115 | "build_config": { "input_shape": [null, 250, 250, 3] } 116 | }, 117 | { 118 | "module": "keras.layers", 119 | "class_name": "MaxPooling2D", 120 | "config": { 121 | "name": "max_pooling2d", 122 | "trainable": true, 123 | "dtype": { 124 | "module": "keras", 125 | "class_name": "DTypePolicy", 126 | "config": { "name": "float32" }, 127 | "registered_name": null 128 | }, 129 | "pool_size": [2, 2], 130 | "padding": "valid", 131 | "strides": [2, 2], 132 | "data_format": "channels_last" 133 | }, 134 | "registered_name": null 135 | }, 136 | { 137 | "module": "keras.layers", 138 | "class_name": "Conv2D", 139 | "config": { 140 | "name": "conv2d_1", 141 | "trainable": true, 142 | "dtype": { 143 | "module": "keras", 144 | "class_name": "DTypePolicy", 145 | "config": { "name": "float32" }, 146 | "registered_name": null 147 | }, 148 | "filters": 64, 149 | "kernel_size": [3, 3], 150 | "strides": [1, 1], 151 | "padding": "valid", 152 | "data_format": "channels_last", 153 | "dilation_rate": [1, 1], 154 | "groups": 1, 155 | "activation": "relu", 156 | "use_bias": true, 157 | "kernel_initializer": { 158 | "module": "keras.initializers", 159 | "class_name": "GlorotUniform", 160 | "config": { "seed": null }, 161 | "registered_name": null 162 | }, 163 | "bias_initializer": { 164 | "module": "keras.initializers", 165 | "class_name": "Zeros", 166 | "config": {}, 167 | "registered_name": null 168 | }, 169 | "kernel_regularizer": null, 170 | "bias_regularizer": null, 171 | "activity_regularizer": null, 172 | "kernel_constraint": null, 173 | "bias_constraint": null 174 | }, 175 | "registered_name": null, 176 | "build_config": { "input_shape": [null, 124, 124, 32] } 177 | }, 178 | { 179 | "module": "keras.layers", 180 | "class_name": "MaxPooling2D", 181 | "config": { 182 | "name": "max_pooling2d_1", 183 | "trainable": true, 184 | "dtype": { 185 | "module": "keras", 186 | "class_name": "DTypePolicy", 187 | "config": { "name": "float32" }, 188 | "registered_name": null 189 | }, 190 | "pool_size": [2, 2], 191 | "padding": "valid", 192 | "strides": [2, 2], 193 | "data_format": "channels_last" 194 | }, 195 | "registered_name": null 196 | }, 197 | { 198 | "module": "keras.layers", 199 | "class_name": "Conv2D", 200 | "config": { 201 | "name": "conv2d_2", 202 | "trainable": true, 203 | "dtype": { 204 | "module": "keras", 205 | "class_name": "DTypePolicy", 206 | "config": { "name": "float32" }, 207 | "registered_name": null 208 | }, 209 | "filters": 128, 210 | "kernel_size": [3, 3], 211 | "strides": [1, 1], 212 | "padding": "valid", 213 | "data_format": "channels_last", 214 | "dilation_rate": [1, 1], 215 | "groups": 1, 216 | "activation": "relu", 217 | "use_bias": true, 218 | "kernel_initializer": { 219 | "module": "keras.initializers", 220 | "class_name": "GlorotUniform", 221 | "config": { "seed": null }, 222 | "registered_name": null 223 | }, 224 | "bias_initializer": { 225 | "module": "keras.initializers", 226 | "class_name": "Zeros", 227 | "config": {}, 228 | "registered_name": null 229 | }, 230 | "kernel_regularizer": null, 231 | "bias_regularizer": null, 232 | "activity_regularizer": null, 233 | "kernel_constraint": null, 234 | "bias_constraint": null 235 | }, 236 | "registered_name": null, 237 | "build_config": { "input_shape": [null, 61, 61, 64] } 238 | }, 239 | { 240 | "module": "keras.layers", 241 | "class_name": "MaxPooling2D", 242 | "config": { 243 | "name": "max_pooling2d_2", 244 | "trainable": true, 245 | "dtype": { 246 | "module": "keras", 247 | "class_name": "DTypePolicy", 248 | "config": { "name": "float32" }, 249 | "registered_name": null 250 | }, 251 | "pool_size": [2, 2], 252 | "padding": "valid", 253 | "strides": [2, 2], 254 | "data_format": "channels_last" 255 | }, 256 | "registered_name": null 257 | }, 258 | { 259 | "module": "keras.layers", 260 | "class_name": "Conv2D", 261 | "config": { 262 | "name": "conv2d_3", 263 | "trainable": true, 264 | "dtype": { 265 | "module": "keras", 266 | "class_name": "DTypePolicy", 267 | "config": { "name": "float32" }, 268 | "registered_name": null 269 | }, 270 | "filters": 256, 271 | "kernel_size": [3, 3], 272 | "strides": [1, 1], 273 | "padding": "valid", 274 | "data_format": "channels_last", 275 | "dilation_rate": [1, 1], 276 | "groups": 1, 277 | "activation": "relu", 278 | "use_bias": true, 279 | "kernel_initializer": { 280 | "module": "keras.initializers", 281 | "class_name": "GlorotUniform", 282 | "config": { "seed": null }, 283 | "registered_name": null 284 | }, 285 | "bias_initializer": { 286 | "module": "keras.initializers", 287 | "class_name": "Zeros", 288 | "config": {}, 289 | "registered_name": null 290 | }, 291 | "kernel_regularizer": null, 292 | "bias_regularizer": null, 293 | "activity_regularizer": null, 294 | "kernel_constraint": null, 295 | "bias_constraint": null 296 | }, 297 | "registered_name": null, 298 | "build_config": { "input_shape": [null, 29, 29, 128] } 299 | }, 300 | { 301 | "module": "keras.layers", 302 | "class_name": "MaxPooling2D", 303 | "config": { 304 | "name": "max_pooling2d_3", 305 | "trainable": true, 306 | "dtype": { 307 | "module": "keras", 308 | "class_name": "DTypePolicy", 309 | "config": { "name": "float32" }, 310 | "registered_name": null 311 | }, 312 | "pool_size": [2, 2], 313 | "padding": "valid", 314 | "strides": [2, 2], 315 | "data_format": "channels_last" 316 | }, 317 | "registered_name": null 318 | }, 319 | { 320 | "module": "keras.layers", 321 | "class_name": "Flatten", 322 | "config": { 323 | "name": "flatten", 324 | "trainable": true, 325 | "dtype": { 326 | "module": "keras", 327 | "class_name": "DTypePolicy", 328 | "config": { "name": "float32" }, 329 | "registered_name": null 330 | }, 331 | "data_format": "channels_last" 332 | }, 333 | "registered_name": null, 334 | "build_config": { "input_shape": [null, 13, 13, 256] } 335 | }, 336 | { 337 | "module": "keras.layers", 338 | "class_name": "Dense", 339 | "config": { 340 | "name": "dense", 341 | "trainable": true, 342 | "dtype": { 343 | "module": "keras", 344 | "class_name": "DTypePolicy", 345 | "config": { "name": "float32" }, 346 | "registered_name": null 347 | }, 348 | "units": 512, 349 | "activation": "relu", 350 | "use_bias": true, 351 | "kernel_initializer": { 352 | "module": "keras.initializers", 353 | "class_name": "GlorotUniform", 354 | "config": { "seed": null }, 355 | "registered_name": null 356 | }, 357 | "bias_initializer": { 358 | "module": "keras.initializers", 359 | "class_name": "Zeros", 360 | "config": {}, 361 | "registered_name": null 362 | }, 363 | "kernel_regularizer": null, 364 | "bias_regularizer": null, 365 | "kernel_constraint": null, 366 | "bias_constraint": null 367 | }, 368 | "registered_name": null, 369 | "build_config": { "input_shape": [null, 43264] } 370 | }, 371 | { 372 | "module": "keras.layers", 373 | "class_name": "Dense", 374 | "config": { 375 | "name": "dense_1", 376 | "trainable": true, 377 | "dtype": { 378 | "module": "keras", 379 | "class_name": "DTypePolicy", 380 | "config": { "name": "float32" }, 381 | "registered_name": null 382 | }, 383 | "units": 2, 384 | "activation": "softmax", 385 | "use_bias": true, 386 | "kernel_initializer": { 387 | "module": "keras.initializers", 388 | "class_name": "GlorotUniform", 389 | "config": { "seed": null }, 390 | "registered_name": null 391 | }, 392 | "bias_initializer": { 393 | "module": "keras.initializers", 394 | "class_name": "Zeros", 395 | "config": {}, 396 | "registered_name": null 397 | }, 398 | "kernel_regularizer": null, 399 | "bias_regularizer": null, 400 | "kernel_constraint": null, 401 | "bias_constraint": null 402 | }, 403 | "registered_name": null, 404 | "build_config": { "input_shape": [null, 512] } 405 | } 406 | ], 407 | "build_input_shape": [null, 250, 250, 3] 408 | }, 409 | "registered_name": null, 410 | "build_config": { "input_shape": [null, 250, 250, 3] }, 411 | "compile_config": { 412 | "loss": "sparse_categorical_crossentropy", 413 | "loss_weights": null, 414 | "metrics": ["accuracy"], 415 | "weighted_metrics": null, 416 | "run_eagerly": false, 417 | "steps_per_execution": 1, 418 | "jit_compile": false 419 | } 420 | } 421 | --------------------------------------------------------------------------------