├── Class Names and Labels └── signnames.csv ├── Google Colab Notebook └── Traffic_Sign_Classification.ipynb ├── Model └── Traffic_Sign_Classifier_CNN.hdf5 ├── Procfile ├── README.md ├── Result Excel └── Predictions.xlsx ├── Streamlit App Output ├── Screenshot (1).png ├── Screenshot (2).png ├── Screenshot (3).png └── streamlit-upload-2020-05-11-13-0.gif ├── Test Random Images ├── 80 ends.jpg ├── Ahead only.jpg ├── Beware_of_Ice_or_snow_Road_Sign.jpg ├── Bicycles Crossing.jpg ├── Children Crossing.jpg ├── Dangerous curve to the left.jpg ├── Dangerous curve to the right.jpg ├── End of all speed and passing limits.jpg ├── End of no passing by vehicles over 3.5 metric tons.jpg ├── End of no passing.jpg ├── Go straight or left.jpg ├── Keep left.jpg ├── Keep right.jpg ├── No Entry.jpg ├── No Passing.jpg ├── No Vehicles.jpg ├── No passing for vehicles over 3.5 metric tons.jpg ├── Pedestrians.jpg ├── Road Work.jpg ├── Road narrows on the right.jpg ├── Roundabout mandatory.jpg ├── Traffic signals.jpg ├── Turn left ahead.jpg ├── Turn right ahead.jpg ├── Wild animals crossing.jpg ├── bumpy road.jpg ├── double_curve.jpg ├── general caution.jpg ├── go straight or right.jpg ├── priority_road.jpg ├── right of way at next intersection.jpg ├── slippery_road.jpg ├── speed limit 100.jpg ├── speed_limit_120.jpg ├── speed_limit_20.jpg ├── speed_limit_30.jpg ├── speed_limit_50.jpg ├── speed_limit_60.jpg ├── speed_limit_70.jpg ├── speed_limit_80.jpg ├── stop.jpg ├── vehicles over 3.5 metric tons prohibited.jpg └── yield.jpg ├── app.py ├── classify.py └── requirements.txt /Class Names and Labels/signnames.csv: -------------------------------------------------------------------------------- 1 | ClassId,SignName 2 | 0,Speed limit (20km/h) 3 | 1,Speed limit (30km/h) 4 | 2,Speed limit (50km/h) 5 | 3,Speed limit (60km/h) 6 | 4,Speed limit (70km/h) 7 | 5,Speed limit (80km/h) 8 | 6,End of speed limit (80km/h) 9 | 7,Speed limit (100km/h) 10 | 8,Speed limit (120km/h) 11 | 9,No passing 12 | 10,No passing for vehicles over 3.5 metric tons 13 | 11,Right-of-way at the next intersection 14 | 12,Priority road 15 | 13,Yield 16 | 14,Stop 17 | 15,No vehicles 18 | 16,Vehicles over 3.5 metric tons prohibited 19 | 17,No entry 20 | 18,General caution 21 | 19,Dangerous curve to the left 22 | 20,Dangerous curve to the right 23 | 21,Double curve 24 | 22,Bumpy road 25 | 23,Slippery road 26 | 24,Road narrows on the right 27 | 25,Road work 28 | 26,Traffic signals 29 | 27,Pedestrians 30 | 28,Children crossing 31 | 29,Bicycles crossing 32 | 30,Beware of ice/snow 33 | 31,Wild animals crossing 34 | 32,End of all speed and passing limits 35 | 33,Turn right ahead 36 | 34,Turn left ahead 37 | 35,Ahead only 38 | 36,Go straight or right 39 | 37,Go straight or left 40 | 38,Keep right 41 | 39,Keep left 42 | 40,Roundabout mandatory 43 | 41,End of no passing 44 | 42,End of no passing by vehicles over 3.5 metric tons 45 | -------------------------------------------------------------------------------- /Google Colab Notebook/Traffic_Sign_Classification.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Traffic Sign Classification.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": "c9JdYuaik6pc", 22 | "colab_type": "text" 23 | }, 24 | "source": [ 25 | "# Import the necessary dependencies " 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": { 31 | "id": "V08WnIZG446_", 32 | "colab_type": "text" 33 | }, 34 | "source": [ 35 | "### Setting TensorFlow 2.x as default version " 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "metadata": { 41 | "id": "Lzzsza-ylniV", 42 | "colab_type": "code", 43 | "colab": {} 44 | }, 45 | "source": [ 46 | "try:\n", 47 | " %tensorflow_version 2.x\n", 48 | "except Exception:\n", 49 | " pass\n", 50 | "\n", 51 | "import tensorflow as tf" 52 | ], 53 | "execution_count": 0, 54 | "outputs": [] 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "metadata": { 59 | "id": "V8_o8BrZ5Hna", 60 | "colab_type": "text" 61 | }, 62 | "source": [ 63 | "### Importing the Visualisation and Preprocessing packages" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "metadata": { 69 | "id": "PM-bq2prNTeq", 70 | "colab_type": "code", 71 | "colab": {} 72 | }, 73 | "source": [ 74 | "%matplotlib inline\n", 75 | "import matplotlib.pyplot as plt\n", 76 | "import matplotlib.image as mpimg\n", 77 | "\n", 78 | "import os\n", 79 | "import cv2\n", 80 | "\n", 81 | "import numpy as np\n", 82 | "import pandas as pd\n", 83 | "import pickle\n", 84 | "\n", 85 | "import random\n" 86 | ], 87 | "execution_count": 0, 88 | "outputs": [] 89 | }, 90 | { 91 | "cell_type": "markdown", 92 | "metadata": { 93 | "id": "4s24Ooy07DNB", 94 | "colab_type": "text" 95 | }, 96 | "source": [ 97 | "### Importing the TensorFlow dependencies" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "metadata": { 103 | "id": "TvGg5k5oNWIT", 104 | "colab_type": "code", 105 | "colab": {} 106 | }, 107 | "source": [ 108 | "from tensorflow.keras.models import Sequential \n", 109 | "from tensorflow.keras.layers import Dense,Dropout,Flatten\n", 110 | "from tensorflow.keras.layers import BatchNormalization,Conv2D,MaxPooling2D\n", 111 | "from tensorflow.keras.utils import to_categorical \n", 112 | "from tensorflow.keras.optimizers import Adam\n", 113 | "from tensorflow.keras.callbacks import ModelCheckpoint\n", 114 | "from tensorflow.keras.regularizers import l2\n", 115 | "from tensorflow.keras.preprocessing.image import ImageDataGenerator " 116 | ], 117 | "execution_count": 0, 118 | "outputs": [] 119 | }, 120 | { 121 | "cell_type": "markdown", 122 | "metadata": { 123 | "id": "kT2r-te9kyDE", 124 | "colab_type": "text" 125 | }, 126 | "source": [ 127 | "# Data loading and Visualisation " 128 | ] 129 | }, 130 | { 131 | "cell_type": "markdown", 132 | "metadata": { 133 | "id": "Rw3x3K3VlXbC", 134 | "colab_type": "text" 135 | }, 136 | "source": [ 137 | "### Loading the data" 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "metadata": { 143 | "id": "ratYoPLONYND", 144 | "colab_type": "code", 145 | "outputId": "702bf1e5-b366-47f3-e52c-ecc379ae9ad0", 146 | "colab": { 147 | "base_uri": "https://localhost:8080/", 148 | "height": 72 149 | } 150 | }, 151 | "source": [ 152 | "#data = pd.read_csv(\"german-traffic-signs / signnames.csv\") \n", 153 | " \n", 154 | "with open('/content/drive/My Drive/Traffic_sign_Dataset/train.p', 'rb') as f: \n", 155 | " train_data = pickle.load(f) \n", 156 | "with open('/content/drive/My Drive/Traffic_sign_Dataset/valid.p', 'rb') as f: \n", 157 | " val_data = pickle.load(f) \n", 158 | "with open('/content/drive/My Drive/Traffic_sign_Dataset/test.p', 'rb') as f: \n", 159 | " test_data = pickle.load(f) \n", 160 | "\n", 161 | "# Extracting the labels from the dictionaries \n", 162 | "x_train, y_train = train_data['features'], train_data['labels'] \n", 163 | "x_val, y_val = val_data['features'], val_data['labels'] \n", 164 | "x_test, y_test = test_data['features'], test_data['labels'] \n", 165 | "\n", 166 | "print(x_train.shape) \n", 167 | "print(x_val.shape) \n", 168 | "print(x_test.shape) " 169 | ], 170 | "execution_count": 0, 171 | "outputs": [ 172 | { 173 | "output_type": "stream", 174 | "text": [ 175 | "(34799, 32, 32, 3)\n", 176 | "(4410, 32, 32, 3)\n", 177 | "(12630, 32, 32, 3)\n" 178 | ], 179 | "name": "stdout" 180 | } 181 | ] 182 | }, 183 | { 184 | "cell_type": "markdown", 185 | "metadata": { 186 | "id": "N9Z2-7iellY6", 187 | "colab_type": "text" 188 | }, 189 | "source": [ 190 | "### Visualising the Image data" 191 | ] 192 | }, 193 | { 194 | "cell_type": "code", 195 | "metadata": { 196 | "id": "lBhvXPIgNYTB", 197 | "colab_type": "code", 198 | "outputId": "a137c686-79be-4449-a9db-71f37000a1fe", 199 | "colab": { 200 | "base_uri": "https://localhost:8080/", 201 | "height": 592 202 | } 203 | }, 204 | "source": [ 205 | "import seaborn as sns\n", 206 | "import matplotlib.pyplot as plt\n", 207 | "\n", 208 | "plt.figure(figsize=(15,10))\n", 209 | "sns.countplot(x=\"labels\", data=train_data)\n", 210 | "sns.despine()" 211 | ], 212 | "execution_count": 0, 213 | "outputs": [ 214 | { 215 | "output_type": "display_data", 216 | "data": { 217 | "image/png": "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\n", 218 | "text/plain": [ 219 | "
" 220 | ] 221 | }, 222 | "metadata": { 223 | "tags": [], 224 | "needs_background": "light" 225 | } 226 | } 227 | ] 228 | }, 229 | { 230 | "cell_type": "markdown", 231 | "metadata": { 232 | "id": "TfYNP0v54w4I", 233 | "colab_type": "text" 234 | }, 235 | "source": [ 236 | "# Image Processing & Image Augmentation" 237 | ] 238 | }, 239 | { 240 | "cell_type": "markdown", 241 | "metadata": { 242 | "id": "AjGV9p6vl47S", 243 | "colab_type": "text" 244 | }, 245 | "source": [ 246 | "### Pre-processing the images using OpenCV" 247 | ] 248 | }, 249 | { 250 | "cell_type": "code", 251 | "metadata": { 252 | "id": "mHM2g4w9NcqR", 253 | "colab_type": "code", 254 | "colab": {} 255 | }, 256 | "source": [ 257 | "def preprocessing(img): \n", 258 | " img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) \n", 259 | " img = cv2.equalizeHist(img) \n", 260 | " img = img / 255\n", 261 | " return img \n", 262 | " \n", 263 | "x_train_final = np.array(list(map(preprocessing, x_train))) \n", 264 | "x_val_final = np.array(list(map(preprocessing, x_val))) \n", 265 | "x_test_final = np.array(list(map(preprocessing, x_test))) \n", 266 | " \n", 267 | "x_train_final = x_train_final.reshape(34799, 32, 32, 1) \n", 268 | "x_val_final = x_val_final.reshape(4410, 32, 32, 1) \n", 269 | "x_test_final = x_test_final.reshape(12630, 32, 32, 1) \n" 270 | ], 271 | "execution_count": 0, 272 | "outputs": [] 273 | }, 274 | { 275 | "cell_type": "markdown", 276 | "metadata": { 277 | "id": "iPxFmAwhmAiB", 278 | "colab_type": "text" 279 | }, 280 | "source": [ 281 | "### Image Augmentation using ImageDataGenerator" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "metadata": { 287 | "id": "FzFRYvCXNekZ", 288 | "colab_type": "code", 289 | "outputId": "514926e7-6de1-4bbe-ab60-d33960620de8", 290 | "colab": { 291 | "base_uri": "https://localhost:8080/", 292 | "height": 192 293 | } 294 | }, 295 | "source": [ 296 | "\n", 297 | "datagen = ImageDataGenerator(width_shift_range = 0.1, \n", 298 | " height_shift_range = 0.1, \n", 299 | " zoom_range = 0.2, \n", 300 | " shear_range = 0.1, \n", 301 | " rotation_range = 10) \n", 302 | "\n", 303 | "datagen.fit(x_train_final) \n", 304 | "\n", 305 | "#os.makedirs('/content/drive/My Drive/Traffic_sign_Dataset/images')\n", 306 | "\n", 307 | "for x_batch,y_batch in datagen.flow(x_train_final,y_train,batch_size=6,save_to_dir='/content/drive/My Drive/Traffic_sign_Dataset/images',save_prefix='img', save_format='jpg'):\n", 308 | " for i in range(0, 6):\n", 309 | " plt.subplot(330 + 1 + i)\n", 310 | " plt.imshow(x_batch[i].reshape(32, 32), cmap=plt.get_cmap('gray'))\n", 311 | "\n", 312 | " plt.show()\n", 313 | " break\n", 314 | "\n", 315 | "y_train = to_categorical(y_train, 43) \n", 316 | "y_val = to_categorical(y_val, 43) \n", 317 | "y_test = to_categorical(y_test, 43) \n" 318 | ], 319 | "execution_count": 0, 320 | "outputs": [ 321 | { 322 | "output_type": "display_data", 323 | "data": { 324 | "image/png": "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\n", 325 | "text/plain": [ 326 | "
" 327 | ] 328 | }, 329 | "metadata": { 330 | "tags": [], 331 | "needs_background": "light" 332 | } 333 | } 334 | ] 335 | }, 336 | { 337 | "cell_type": "markdown", 338 | "metadata": { 339 | "id": "2RzYgcur4qyK", 340 | "colab_type": "text" 341 | }, 342 | "source": [ 343 | "# Model Building and Testing " 344 | ] 345 | }, 346 | { 347 | "cell_type": "markdown", 348 | "metadata": { 349 | "id": "DYp8FoCtmRO7", 350 | "colab_type": "text" 351 | }, 352 | "source": [ 353 | "### Implementing the CNN Model " 354 | ] 355 | }, 356 | { 357 | "cell_type": "code", 358 | "metadata": { 359 | "id": "TAmuD6XvNn9S", 360 | "colab_type": "code", 361 | "colab": {} 362 | }, 363 | "source": [ 364 | "def build_model(hp):\n", 365 | " model = Sequential()\n", 366 | "\n", 367 | " # Layer 1 \n", 368 | " model.add(Conv2D(filters=hp.Int('CONV_1_FILTER',min_value=32, max_value=64),\n", 369 | " kernel_size=hp.Choice('KERNEL_1_FILTER', values=[3,5]),\n", 370 | " activation='relu',\n", 371 | " input_shape=(32,32,1), \n", 372 | " padding='same',\n", 373 | " kernel_regularizer = l2(0.0005)\n", 374 | " ))\n", 375 | " model.add(MaxPooling2D(pool_size=(2, 2)))\n", 376 | " model.add(Dropout(hp.Float('DROPOUT_1', min_value=0.0,max_value=0.5,default=0.25,step=0.05)))\n", 377 | "\n", 378 | " \n", 379 | " # Layer 2 \n", 380 | " model.add(Conv2D(filters=hp.Int('CONV_2_FILTER',min_value=32, max_value=128),\n", 381 | " kernel_size=hp.Choice('KERNEL_2_FILTER', values=[3,5]),\n", 382 | " activation='relu',\n", 383 | " padding='same',\n", 384 | " kernel_regularizer = l2(0.0005)\n", 385 | " ))\n", 386 | " model.add(MaxPooling2D(pool_size=(2, 2)))\n", 387 | " model.add(Dropout(hp.Float('DROPOUT_2', min_value=0.0,max_value=0.5,default=0.25,step=0.05)))\n", 388 | "\n", 389 | "\n", 390 | " # Layer 3\n", 391 | " model.add(Conv2D(filters=hp.Int('CONV_3_FILTER',min_value=32, max_value=128),\n", 392 | " kernel_size=hp.Choice('KERNEL_3_FILTER', values=[3,5]),\n", 393 | " activation='relu',\n", 394 | " padding='same',\n", 395 | " kernel_regularizer = l2(0.0005)\n", 396 | " ))\n", 397 | " model.add(MaxPooling2D(pool_size=(2, 2)))\n", 398 | " model.add(Dropout(hp.Float('DROPOUT_3', min_value=0.0,max_value=0.5,default=0.25,step=0.05)))\n", 399 | "\n", 400 | " \n", 401 | " model.add(Flatten())\n", 402 | "\n", 403 | " \n", 404 | " model.add(Dense(hp.Int('DENSE_1_LAYER', \n", 405 | " min_value=32, \n", 406 | " max_value=512),\n", 407 | " \n", 408 | " activation = hp.Choice(\n", 409 | " 'dense_activation',\n", 410 | " values=['relu', 'tanh', 'sigmoid'],\n", 411 | " default='relu')\n", 412 | " ))\n", 413 | " model.add(Dropout(hp.Float('DROPOUT_2', min_value=0.0,max_value=0.5,default=0.25,step=0.05)))\n", 414 | "\n", 415 | " model.add(Dense(43, activation='softmax'))\n", 416 | "\n", 417 | " # Learning Rate set between 0.0001 to 0.01\n", 418 | " model.compile(Adam(hp.Float(\n", 419 | " 'learning_rate',\n", 420 | " min_value=1e-4,\n", 421 | " max_value=1e-2,\n", 422 | " sampling='LOG')),\n", 423 | " loss='categorical_crossentropy', metrics=['accuracy'])\n", 424 | " \n", 425 | " return model\n", 426 | " " 427 | ], 428 | "execution_count": 0, 429 | "outputs": [] 430 | }, 431 | { 432 | "cell_type": "markdown", 433 | "metadata": { 434 | "id": "_iAy7irdmXnE", 435 | "colab_type": "text" 436 | }, 437 | "source": [ 438 | "### Install Kerastuner" 439 | ] 440 | }, 441 | { 442 | "cell_type": "code", 443 | "metadata": { 444 | "id": "0NOnz_nWej7m", 445 | "colab_type": "code", 446 | "outputId": "c33dae2f-909d-422d-e486-354a0b1e4bd3", 447 | "colab": { 448 | "base_uri": "https://localhost:8080/", 449 | "height": 313 450 | } 451 | }, 452 | "source": [ 453 | "!pip install keras-tuner" 454 | ], 455 | "execution_count": 0, 456 | "outputs": [ 457 | { 458 | "output_type": "stream", 459 | "text": [ 460 | "Requirement already satisfied: keras-tuner in /usr/local/lib/python3.6/dist-packages (1.0.1)\n", 461 | "Requirement already satisfied: scipy in /usr/local/lib/python3.6/dist-packages (from keras-tuner) (1.4.1)\n", 462 | "Requirement already satisfied: terminaltables in /usr/local/lib/python3.6/dist-packages (from keras-tuner) (3.1.0)\n", 463 | "Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from keras-tuner) (2.23.0)\n", 464 | "Requirement already satisfied: colorama in /usr/local/lib/python3.6/dist-packages (from keras-tuner) (0.4.3)\n", 465 | "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.6/dist-packages (from keras-tuner) (0.22.2.post1)\n", 466 | "Requirement already satisfied: tabulate in /usr/local/lib/python3.6/dist-packages (from keras-tuner) (0.8.7)\n", 467 | "Requirement already satisfied: tqdm in /usr/local/lib/python3.6/dist-packages (from keras-tuner) (4.41.1)\n", 468 | "Requirement already satisfied: future in /usr/local/lib/python3.6/dist-packages (from keras-tuner) (0.16.0)\n", 469 | "Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from keras-tuner) (1.18.4)\n", 470 | "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->keras-tuner) (3.0.4)\n", 471 | "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->keras-tuner) (1.24.3)\n", 472 | "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->keras-tuner) (2.9)\n", 473 | "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->keras-tuner) (2020.4.5.1)\n", 474 | "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.6/dist-packages (from scikit-learn->keras-tuner) (0.14.1)\n" 475 | ], 476 | "name": "stdout" 477 | } 478 | ] 479 | }, 480 | { 481 | "cell_type": "markdown", 482 | "metadata": { 483 | "id": "Yt4Sbm9QmbzE", 484 | "colab_type": "text" 485 | }, 486 | "source": [ 487 | "### Use RandomSearch using keraatuner to find the best hyperparameters" 488 | ] 489 | }, 490 | { 491 | "cell_type": "code", 492 | "metadata": { 493 | "id": "sf0qjmbaec12", 494 | "colab_type": "code", 495 | "colab": {} 496 | }, 497 | "source": [ 498 | "from kerastuner import RandomSearch" 499 | ], 500 | "execution_count": 0, 501 | "outputs": [] 502 | }, 503 | { 504 | "cell_type": "code", 505 | "metadata": { 506 | "id": "gsRJmmZheopH", 507 | "colab_type": "code", 508 | "outputId": "196fd8a5-50df-4640-e1fa-449f3cf4a31c", 509 | "colab": { 510 | "base_uri": "https://localhost:8080/", 511 | "height": 74 512 | } 513 | }, 514 | "source": [ 515 | "tuner = RandomSearch(build_model, objective='val_accuracy',\n", 516 | " max_trials = 10, \n", 517 | " directory='/content/drive/My Drive/Traffic_sign_Dataset',\n", 518 | " project_name=\"Traffic_Sign_Classifier\")" 519 | ], 520 | "execution_count": 0, 521 | "outputs": [ 522 | { 523 | "output_type": "stream", 524 | "text": [ 525 | "INFO:tensorflow:Reloading Oracle from existing project /content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier/oracle.json\n", 526 | "INFO:tensorflow:Reloading Tuner from /content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier/tuner0.json\n" 527 | ], 528 | "name": "stdout" 529 | } 530 | ] 531 | }, 532 | { 533 | "cell_type": "code", 534 | "metadata": { 535 | "id": "vyB3qo7Nh15E", 536 | "colab_type": "code", 537 | "outputId": "11eeefa3-c1b8-4d7e-a0ef-f89990956b16", 538 | "colab": { 539 | "base_uri": "https://localhost:8080/", 540 | "height": 1000 541 | } 542 | }, 543 | "source": [ 544 | "tuner.search_space_summary()" 545 | ], 546 | "execution_count": 0, 547 | "outputs": [ 548 | { 549 | "output_type": "display_data", 550 | "data": { 551 | "text/html": [ 552 | "

Search space summary

" 553 | ], 554 | "text/plain": [ 555 | "" 556 | ] 557 | }, 558 | "metadata": { 559 | "tags": [] 560 | } 561 | }, 562 | { 563 | "output_type": "display_data", 564 | "data": { 565 | "text/html": [ 566 | " |-Default search space size: 12" 567 | ], 568 | "text/plain": [ 569 | "" 570 | ] 571 | }, 572 | "metadata": { 573 | "tags": [] 574 | } 575 | }, 576 | { 577 | "output_type": "display_data", 578 | "data": { 579 | "text/html": [ 580 | "

CONV_1_FILTER (Int)

" 581 | ], 582 | "text/plain": [ 583 | "" 584 | ] 585 | }, 586 | "metadata": { 587 | "tags": [] 588 | } 589 | }, 590 | { 591 | "output_type": "display_data", 592 | "data": { 593 | "text/html": [ 594 | " |-default: None" 595 | ], 596 | "text/plain": [ 597 | "" 598 | ] 599 | }, 600 | "metadata": { 601 | "tags": [] 602 | } 603 | }, 604 | { 605 | "output_type": "display_data", 606 | "data": { 607 | "text/html": [ 608 | " |-max_value: 64" 609 | ], 610 | "text/plain": [ 611 | "" 612 | ] 613 | }, 614 | "metadata": { 615 | "tags": [] 616 | } 617 | }, 618 | { 619 | "output_type": "display_data", 620 | "data": { 621 | "text/html": [ 622 | " |-min_value: 32" 623 | ], 624 | "text/plain": [ 625 | "" 626 | ] 627 | }, 628 | "metadata": { 629 | "tags": [] 630 | } 631 | }, 632 | { 633 | "output_type": "display_data", 634 | "data": { 635 | "text/html": [ 636 | " |-sampling: None" 637 | ], 638 | "text/plain": [ 639 | "" 640 | ] 641 | }, 642 | "metadata": { 643 | "tags": [] 644 | } 645 | }, 646 | { 647 | "output_type": "display_data", 648 | "data": { 649 | "text/html": [ 650 | " |-step: 1" 651 | ], 652 | "text/plain": [ 653 | "" 654 | ] 655 | }, 656 | "metadata": { 657 | "tags": [] 658 | } 659 | }, 660 | { 661 | "output_type": "display_data", 662 | "data": { 663 | "text/html": [ 664 | "

KERNEL_1_FILTER (Choice)

" 665 | ], 666 | "text/plain": [ 667 | "" 668 | ] 669 | }, 670 | "metadata": { 671 | "tags": [] 672 | } 673 | }, 674 | { 675 | "output_type": "display_data", 676 | "data": { 677 | "text/html": [ 678 | " |-default: 3" 679 | ], 680 | "text/plain": [ 681 | "" 682 | ] 683 | }, 684 | "metadata": { 685 | "tags": [] 686 | } 687 | }, 688 | { 689 | "output_type": "display_data", 690 | "data": { 691 | "text/html": [ 692 | " |-ordered: True" 693 | ], 694 | "text/plain": [ 695 | "" 696 | ] 697 | }, 698 | "metadata": { 699 | "tags": [] 700 | } 701 | }, 702 | { 703 | "output_type": "display_data", 704 | "data": { 705 | "text/html": [ 706 | " |-values: [3, 5]" 707 | ], 708 | "text/plain": [ 709 | "" 710 | ] 711 | }, 712 | "metadata": { 713 | "tags": [] 714 | } 715 | }, 716 | { 717 | "output_type": "display_data", 718 | "data": { 719 | "text/html": [ 720 | "

DROPOUT_1 (Float)

" 721 | ], 722 | "text/plain": [ 723 | "" 724 | ] 725 | }, 726 | "metadata": { 727 | "tags": [] 728 | } 729 | }, 730 | { 731 | "output_type": "display_data", 732 | "data": { 733 | "text/html": [ 734 | " |-default: 0.25" 735 | ], 736 | "text/plain": [ 737 | "" 738 | ] 739 | }, 740 | "metadata": { 741 | "tags": [] 742 | } 743 | }, 744 | { 745 | "output_type": "display_data", 746 | "data": { 747 | "text/html": [ 748 | " |-max_value: 0.5" 749 | ], 750 | "text/plain": [ 751 | "" 752 | ] 753 | }, 754 | "metadata": { 755 | "tags": [] 756 | } 757 | }, 758 | { 759 | "output_type": "display_data", 760 | "data": { 761 | "text/html": [ 762 | " |-min_value: 0.0" 763 | ], 764 | "text/plain": [ 765 | "" 766 | ] 767 | }, 768 | "metadata": { 769 | "tags": [] 770 | } 771 | }, 772 | { 773 | "output_type": "display_data", 774 | "data": { 775 | "text/html": [ 776 | " |-sampling: None" 777 | ], 778 | "text/plain": [ 779 | "" 780 | ] 781 | }, 782 | "metadata": { 783 | "tags": [] 784 | } 785 | }, 786 | { 787 | "output_type": "display_data", 788 | "data": { 789 | "text/html": [ 790 | " |-step: 0.05" 791 | ], 792 | "text/plain": [ 793 | "" 794 | ] 795 | }, 796 | "metadata": { 797 | "tags": [] 798 | } 799 | }, 800 | { 801 | "output_type": "display_data", 802 | "data": { 803 | "text/html": [ 804 | "

CONV_2_FILTER (Int)

" 805 | ], 806 | "text/plain": [ 807 | "" 808 | ] 809 | }, 810 | "metadata": { 811 | "tags": [] 812 | } 813 | }, 814 | { 815 | "output_type": "display_data", 816 | "data": { 817 | "text/html": [ 818 | " |-default: None" 819 | ], 820 | "text/plain": [ 821 | "" 822 | ] 823 | }, 824 | "metadata": { 825 | "tags": [] 826 | } 827 | }, 828 | { 829 | "output_type": "display_data", 830 | "data": { 831 | "text/html": [ 832 | " |-max_value: 128" 833 | ], 834 | "text/plain": [ 835 | "" 836 | ] 837 | }, 838 | "metadata": { 839 | "tags": [] 840 | } 841 | }, 842 | { 843 | "output_type": "display_data", 844 | "data": { 845 | "text/html": [ 846 | " |-min_value: 32" 847 | ], 848 | "text/plain": [ 849 | "" 850 | ] 851 | }, 852 | "metadata": { 853 | "tags": [] 854 | } 855 | }, 856 | { 857 | "output_type": "display_data", 858 | "data": { 859 | "text/html": [ 860 | " |-sampling: None" 861 | ], 862 | "text/plain": [ 863 | "" 864 | ] 865 | }, 866 | "metadata": { 867 | "tags": [] 868 | } 869 | }, 870 | { 871 | "output_type": "display_data", 872 | "data": { 873 | "text/html": [ 874 | " |-step: 1" 875 | ], 876 | "text/plain": [ 877 | "" 878 | ] 879 | }, 880 | "metadata": { 881 | "tags": [] 882 | } 883 | }, 884 | { 885 | "output_type": "display_data", 886 | "data": { 887 | "text/html": [ 888 | "

KERNEL_2_FILTER (Choice)

" 889 | ], 890 | "text/plain": [ 891 | "" 892 | ] 893 | }, 894 | "metadata": { 895 | "tags": [] 896 | } 897 | }, 898 | { 899 | "output_type": "display_data", 900 | "data": { 901 | "text/html": [ 902 | " |-default: 3" 903 | ], 904 | "text/plain": [ 905 | "" 906 | ] 907 | }, 908 | "metadata": { 909 | "tags": [] 910 | } 911 | }, 912 | { 913 | "output_type": "display_data", 914 | "data": { 915 | "text/html": [ 916 | " |-ordered: True" 917 | ], 918 | "text/plain": [ 919 | "" 920 | ] 921 | }, 922 | "metadata": { 923 | "tags": [] 924 | } 925 | }, 926 | { 927 | "output_type": "display_data", 928 | "data": { 929 | "text/html": [ 930 | " |-values: [3, 5]" 931 | ], 932 | "text/plain": [ 933 | "" 934 | ] 935 | }, 936 | "metadata": { 937 | "tags": [] 938 | } 939 | }, 940 | { 941 | "output_type": "display_data", 942 | "data": { 943 | "text/html": [ 944 | "

DROPOUT_2 (Float)

" 945 | ], 946 | "text/plain": [ 947 | "" 948 | ] 949 | }, 950 | "metadata": { 951 | "tags": [] 952 | } 953 | }, 954 | { 955 | "output_type": "display_data", 956 | "data": { 957 | "text/html": [ 958 | " |-default: 0.25" 959 | ], 960 | "text/plain": [ 961 | "" 962 | ] 963 | }, 964 | "metadata": { 965 | "tags": [] 966 | } 967 | }, 968 | { 969 | "output_type": "display_data", 970 | "data": { 971 | "text/html": [ 972 | " |-max_value: 0.5" 973 | ], 974 | "text/plain": [ 975 | "" 976 | ] 977 | }, 978 | "metadata": { 979 | "tags": [] 980 | } 981 | }, 982 | { 983 | "output_type": "display_data", 984 | "data": { 985 | "text/html": [ 986 | " |-min_value: 0.0" 987 | ], 988 | "text/plain": [ 989 | "" 990 | ] 991 | }, 992 | "metadata": { 993 | "tags": [] 994 | } 995 | }, 996 | { 997 | "output_type": "display_data", 998 | "data": { 999 | "text/html": [ 1000 | " |-sampling: None" 1001 | ], 1002 | "text/plain": [ 1003 | "" 1004 | ] 1005 | }, 1006 | "metadata": { 1007 | "tags": [] 1008 | } 1009 | }, 1010 | { 1011 | "output_type": "display_data", 1012 | "data": { 1013 | "text/html": [ 1014 | " |-step: 0.05" 1015 | ], 1016 | "text/plain": [ 1017 | "" 1018 | ] 1019 | }, 1020 | "metadata": { 1021 | "tags": [] 1022 | } 1023 | }, 1024 | { 1025 | "output_type": "display_data", 1026 | "data": { 1027 | "text/html": [ 1028 | "

CONV_3_FILTER (Int)

" 1029 | ], 1030 | "text/plain": [ 1031 | "" 1032 | ] 1033 | }, 1034 | "metadata": { 1035 | "tags": [] 1036 | } 1037 | }, 1038 | { 1039 | "output_type": "display_data", 1040 | "data": { 1041 | "text/html": [ 1042 | " |-default: None" 1043 | ], 1044 | "text/plain": [ 1045 | "" 1046 | ] 1047 | }, 1048 | "metadata": { 1049 | "tags": [] 1050 | } 1051 | }, 1052 | { 1053 | "output_type": "display_data", 1054 | "data": { 1055 | "text/html": [ 1056 | " |-max_value: 128" 1057 | ], 1058 | "text/plain": [ 1059 | "" 1060 | ] 1061 | }, 1062 | "metadata": { 1063 | "tags": [] 1064 | } 1065 | }, 1066 | { 1067 | "output_type": "display_data", 1068 | "data": { 1069 | "text/html": [ 1070 | " |-min_value: 32" 1071 | ], 1072 | "text/plain": [ 1073 | "" 1074 | ] 1075 | }, 1076 | "metadata": { 1077 | "tags": [] 1078 | } 1079 | }, 1080 | { 1081 | "output_type": "display_data", 1082 | "data": { 1083 | "text/html": [ 1084 | " |-sampling: None" 1085 | ], 1086 | "text/plain": [ 1087 | "" 1088 | ] 1089 | }, 1090 | "metadata": { 1091 | "tags": [] 1092 | } 1093 | }, 1094 | { 1095 | "output_type": "display_data", 1096 | "data": { 1097 | "text/html": [ 1098 | " |-step: 1" 1099 | ], 1100 | "text/plain": [ 1101 | "" 1102 | ] 1103 | }, 1104 | "metadata": { 1105 | "tags": [] 1106 | } 1107 | }, 1108 | { 1109 | "output_type": "display_data", 1110 | "data": { 1111 | "text/html": [ 1112 | "

KERNEL_3_FILTER (Choice)

" 1113 | ], 1114 | "text/plain": [ 1115 | "" 1116 | ] 1117 | }, 1118 | "metadata": { 1119 | "tags": [] 1120 | } 1121 | }, 1122 | { 1123 | "output_type": "display_data", 1124 | "data": { 1125 | "text/html": [ 1126 | " |-default: 3" 1127 | ], 1128 | "text/plain": [ 1129 | "" 1130 | ] 1131 | }, 1132 | "metadata": { 1133 | "tags": [] 1134 | } 1135 | }, 1136 | { 1137 | "output_type": "display_data", 1138 | "data": { 1139 | "text/html": [ 1140 | " |-ordered: True" 1141 | ], 1142 | "text/plain": [ 1143 | "" 1144 | ] 1145 | }, 1146 | "metadata": { 1147 | "tags": [] 1148 | } 1149 | }, 1150 | { 1151 | "output_type": "display_data", 1152 | "data": { 1153 | "text/html": [ 1154 | " |-values: [3, 5]" 1155 | ], 1156 | "text/plain": [ 1157 | "" 1158 | ] 1159 | }, 1160 | "metadata": { 1161 | "tags": [] 1162 | } 1163 | }, 1164 | { 1165 | "output_type": "display_data", 1166 | "data": { 1167 | "text/html": [ 1168 | "

DROPOUT_3 (Float)

" 1169 | ], 1170 | "text/plain": [ 1171 | "" 1172 | ] 1173 | }, 1174 | "metadata": { 1175 | "tags": [] 1176 | } 1177 | }, 1178 | { 1179 | "output_type": "display_data", 1180 | "data": { 1181 | "text/html": [ 1182 | " |-default: 0.25" 1183 | ], 1184 | "text/plain": [ 1185 | "" 1186 | ] 1187 | }, 1188 | "metadata": { 1189 | "tags": [] 1190 | } 1191 | }, 1192 | { 1193 | "output_type": "display_data", 1194 | "data": { 1195 | "text/html": [ 1196 | " |-max_value: 0.5" 1197 | ], 1198 | "text/plain": [ 1199 | "" 1200 | ] 1201 | }, 1202 | "metadata": { 1203 | "tags": [] 1204 | } 1205 | }, 1206 | { 1207 | "output_type": "display_data", 1208 | "data": { 1209 | "text/html": [ 1210 | " |-min_value: 0.0" 1211 | ], 1212 | "text/plain": [ 1213 | "" 1214 | ] 1215 | }, 1216 | "metadata": { 1217 | "tags": [] 1218 | } 1219 | }, 1220 | { 1221 | "output_type": "display_data", 1222 | "data": { 1223 | "text/html": [ 1224 | " |-sampling: None" 1225 | ], 1226 | "text/plain": [ 1227 | "" 1228 | ] 1229 | }, 1230 | "metadata": { 1231 | "tags": [] 1232 | } 1233 | }, 1234 | { 1235 | "output_type": "display_data", 1236 | "data": { 1237 | "text/html": [ 1238 | " |-step: 0.05" 1239 | ], 1240 | "text/plain": [ 1241 | "" 1242 | ] 1243 | }, 1244 | "metadata": { 1245 | "tags": [] 1246 | } 1247 | }, 1248 | { 1249 | "output_type": "display_data", 1250 | "data": { 1251 | "text/html": [ 1252 | "

DENSE_1_LAYER (Int)

" 1253 | ], 1254 | "text/plain": [ 1255 | "" 1256 | ] 1257 | }, 1258 | "metadata": { 1259 | "tags": [] 1260 | } 1261 | }, 1262 | { 1263 | "output_type": "display_data", 1264 | "data": { 1265 | "text/html": [ 1266 | " |-default: None" 1267 | ], 1268 | "text/plain": [ 1269 | "" 1270 | ] 1271 | }, 1272 | "metadata": { 1273 | "tags": [] 1274 | } 1275 | }, 1276 | { 1277 | "output_type": "display_data", 1278 | "data": { 1279 | "text/html": [ 1280 | " |-max_value: 512" 1281 | ], 1282 | "text/plain": [ 1283 | "" 1284 | ] 1285 | }, 1286 | "metadata": { 1287 | "tags": [] 1288 | } 1289 | }, 1290 | { 1291 | "output_type": "display_data", 1292 | "data": { 1293 | "text/html": [ 1294 | " |-min_value: 32" 1295 | ], 1296 | "text/plain": [ 1297 | "" 1298 | ] 1299 | }, 1300 | "metadata": { 1301 | "tags": [] 1302 | } 1303 | }, 1304 | { 1305 | "output_type": "display_data", 1306 | "data": { 1307 | "text/html": [ 1308 | " |-sampling: None" 1309 | ], 1310 | "text/plain": [ 1311 | "" 1312 | ] 1313 | }, 1314 | "metadata": { 1315 | "tags": [] 1316 | } 1317 | }, 1318 | { 1319 | "output_type": "display_data", 1320 | "data": { 1321 | "text/html": [ 1322 | " |-step: 1" 1323 | ], 1324 | "text/plain": [ 1325 | "" 1326 | ] 1327 | }, 1328 | "metadata": { 1329 | "tags": [] 1330 | } 1331 | }, 1332 | { 1333 | "output_type": "display_data", 1334 | "data": { 1335 | "text/html": [ 1336 | "

dense_activation (Choice)

" 1337 | ], 1338 | "text/plain": [ 1339 | "" 1340 | ] 1341 | }, 1342 | "metadata": { 1343 | "tags": [] 1344 | } 1345 | }, 1346 | { 1347 | "output_type": "display_data", 1348 | "data": { 1349 | "text/html": [ 1350 | " |-default: relu" 1351 | ], 1352 | "text/plain": [ 1353 | "" 1354 | ] 1355 | }, 1356 | "metadata": { 1357 | "tags": [] 1358 | } 1359 | }, 1360 | { 1361 | "output_type": "display_data", 1362 | "data": { 1363 | "text/html": [ 1364 | " |-ordered: False" 1365 | ], 1366 | "text/plain": [ 1367 | "" 1368 | ] 1369 | }, 1370 | "metadata": { 1371 | "tags": [] 1372 | } 1373 | }, 1374 | { 1375 | "output_type": "display_data", 1376 | "data": { 1377 | "text/html": [ 1378 | " |-values: ['relu', 'tanh', 'sigmoid']" 1379 | ], 1380 | "text/plain": [ 1381 | "" 1382 | ] 1383 | }, 1384 | "metadata": { 1385 | "tags": [] 1386 | } 1387 | }, 1388 | { 1389 | "output_type": "display_data", 1390 | "data": { 1391 | "text/html": [ 1392 | "

learning_rate (Float)

" 1393 | ], 1394 | "text/plain": [ 1395 | "" 1396 | ] 1397 | }, 1398 | "metadata": { 1399 | "tags": [] 1400 | } 1401 | }, 1402 | { 1403 | "output_type": "display_data", 1404 | "data": { 1405 | "text/html": [ 1406 | " |-default: 0.0001" 1407 | ], 1408 | "text/plain": [ 1409 | "" 1410 | ] 1411 | }, 1412 | "metadata": { 1413 | "tags": [] 1414 | } 1415 | }, 1416 | { 1417 | "output_type": "display_data", 1418 | "data": { 1419 | "text/html": [ 1420 | " |-max_value: 0.01" 1421 | ], 1422 | "text/plain": [ 1423 | "" 1424 | ] 1425 | }, 1426 | "metadata": { 1427 | "tags": [] 1428 | } 1429 | }, 1430 | { 1431 | "output_type": "display_data", 1432 | "data": { 1433 | "text/html": [ 1434 | " |-min_value: 0.0001" 1435 | ], 1436 | "text/plain": [ 1437 | "" 1438 | ] 1439 | }, 1440 | "metadata": { 1441 | "tags": [] 1442 | } 1443 | }, 1444 | { 1445 | "output_type": "display_data", 1446 | "data": { 1447 | "text/html": [ 1448 | " |-sampling: log" 1449 | ], 1450 | "text/plain": [ 1451 | "" 1452 | ] 1453 | }, 1454 | "metadata": { 1455 | "tags": [] 1456 | } 1457 | }, 1458 | { 1459 | "output_type": "display_data", 1460 | "data": { 1461 | "text/html": [ 1462 | " |-step: None" 1463 | ], 1464 | "text/plain": [ 1465 | "" 1466 | ] 1467 | }, 1468 | "metadata": { 1469 | "tags": [] 1470 | } 1471 | } 1472 | ] 1473 | }, 1474 | { 1475 | "cell_type": "code", 1476 | "metadata": { 1477 | "id": "3Jo_89zTfyWK", 1478 | "colab_type": "code", 1479 | "outputId": "c5555bec-56bf-4183-887d-800638f8b6c5", 1480 | "colab": { 1481 | "base_uri": "https://localhost:8080/", 1482 | "height": 35 1483 | } 1484 | }, 1485 | "source": [ 1486 | "tuner.search(x_train_final,y_train,epochs=10, validation_data=(x_val_final,y_val))" 1487 | ], 1488 | "execution_count": 0, 1489 | "outputs": [ 1490 | { 1491 | "output_type": "stream", 1492 | "text": [ 1493 | "INFO:tensorflow:Oracle triggered exit\n" 1494 | ], 1495 | "name": "stdout" 1496 | } 1497 | ] 1498 | }, 1499 | { 1500 | "cell_type": "markdown", 1501 | "metadata": { 1502 | "id": "YXaYxv7ImoB0", 1503 | "colab_type": "text" 1504 | }, 1505 | "source": [ 1506 | "### Get the best model" 1507 | ] 1508 | }, 1509 | { 1510 | "cell_type": "code", 1511 | "metadata": { 1512 | "id": "TTZsL2SoiPm4", 1513 | "colab_type": "code", 1514 | "colab": {} 1515 | }, 1516 | "source": [ 1517 | "final_model = tuner.get_best_models(num_models=1)[0]" 1518 | ], 1519 | "execution_count": 0, 1520 | "outputs": [] 1521 | }, 1522 | { 1523 | "cell_type": "code", 1524 | "metadata": { 1525 | "id": "x--itczLkUzm", 1526 | "colab_type": "code", 1527 | "outputId": "1544c40a-20d0-4827-e3c8-4104b73dc12e", 1528 | "colab": { 1529 | "base_uri": "https://localhost:8080/", 1530 | "height": 641 1531 | } 1532 | }, 1533 | "source": [ 1534 | "final_model.summary()" 1535 | ], 1536 | "execution_count": 0, 1537 | "outputs": [ 1538 | { 1539 | "output_type": "stream", 1540 | "text": [ 1541 | "Model: \"sequential\"\n", 1542 | "_________________________________________________________________\n", 1543 | "Layer (type) Output Shape Param # \n", 1544 | "=================================================================\n", 1545 | "conv2d (Conv2D) (None, 32, 32, 48) 480 \n", 1546 | "_________________________________________________________________\n", 1547 | "max_pooling2d (MaxPooling2D) (None, 16, 16, 48) 0 \n", 1548 | "_________________________________________________________________\n", 1549 | "dropout (Dropout) (None, 16, 16, 48) 0 \n", 1550 | "_________________________________________________________________\n", 1551 | "conv2d_1 (Conv2D) (None, 16, 16, 92) 110492 \n", 1552 | "_________________________________________________________________\n", 1553 | "max_pooling2d_1 (MaxPooling2 (None, 8, 8, 92) 0 \n", 1554 | "_________________________________________________________________\n", 1555 | "dropout_1 (Dropout) (None, 8, 8, 92) 0 \n", 1556 | "_________________________________________________________________\n", 1557 | "conv2d_2 (Conv2D) (None, 8, 8, 127) 292227 \n", 1558 | "_________________________________________________________________\n", 1559 | "max_pooling2d_2 (MaxPooling2 (None, 4, 4, 127) 0 \n", 1560 | "_________________________________________________________________\n", 1561 | "dropout_2 (Dropout) (None, 4, 4, 127) 0 \n", 1562 | "_________________________________________________________________\n", 1563 | "flatten (Flatten) (None, 2032) 0 \n", 1564 | "_________________________________________________________________\n", 1565 | "dense (Dense) (None, 217) 441161 \n", 1566 | "_________________________________________________________________\n", 1567 | "dropout_3 (Dropout) (None, 217) 0 \n", 1568 | "_________________________________________________________________\n", 1569 | "dense_1 (Dense) (None, 43) 9374 \n", 1570 | "=================================================================\n", 1571 | "Total params: 853,734\n", 1572 | "Trainable params: 853,734\n", 1573 | "Non-trainable params: 0\n", 1574 | "_________________________________________________________________\n" 1575 | ], 1576 | "name": "stdout" 1577 | } 1578 | ] 1579 | }, 1580 | { 1581 | "cell_type": "markdown", 1582 | "metadata": { 1583 | "id": "E4GNcwTamsYS", 1584 | "colab_type": "text" 1585 | }, 1586 | "source": [ 1587 | "### Creating a Model Checkpoint" 1588 | ] 1589 | }, 1590 | { 1591 | "cell_type": "code", 1592 | "metadata": { 1593 | "id": "lLQ5vs52k44x", 1594 | "colab_type": "code", 1595 | "colab": {} 1596 | }, 1597 | "source": [ 1598 | "filepath=\"/content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5\"\n", 1599 | "checkpoint_conv = ModelCheckpoint(filepath, monitor='val_accuracy', verbose=1, save_best_only=True, mode='max')\n", 1600 | "callbacks_list_conv = [checkpoint_conv]" 1601 | ], 1602 | "execution_count": 0, 1603 | "outputs": [] 1604 | }, 1605 | { 1606 | "cell_type": "markdown", 1607 | "metadata": { 1608 | "id": "lQeDIaB3m_Ld", 1609 | "colab_type": "text" 1610 | }, 1611 | "source": [ 1612 | "### Fit the model" 1613 | ] 1614 | }, 1615 | { 1616 | "cell_type": "code", 1617 | "metadata": { 1618 | "id": "PI3l1opFHPCG", 1619 | "colab_type": "code", 1620 | "colab": {} 1621 | }, 1622 | "source": [ 1623 | "BATCH_SIZE = 100\n", 1624 | "EPOCHS = 40" 1625 | ], 1626 | "execution_count": 0, 1627 | "outputs": [] 1628 | }, 1629 | { 1630 | "cell_type": "code", 1631 | "metadata": { 1632 | "id": "FVrscWrJkZfp", 1633 | "colab_type": "code", 1634 | "outputId": "5becc57e-f8bb-4b26-adec-fee393a45b41", 1635 | "colab": { 1636 | "base_uri": "https://localhost:8080/", 1637 | "height": 1000 1638 | } 1639 | }, 1640 | "source": [ 1641 | "history = final_model.fit(\n", 1642 | " datagen.flow(x_train_final, y_train, batch_size=BATCH_SIZE), \n", 1643 | " steps_per_epoch = int(np.ceil(len(x_train_final)/float(BATCH_SIZE))), \n", 1644 | " epochs = EPOCHS, \n", 1645 | " validation_data =(x_val_final, y_val),\n", 1646 | " shuffle = True,\n", 1647 | " callbacks=callbacks_list_conv\n", 1648 | " )\n" 1649 | ], 1650 | "execution_count": 0, 1651 | "outputs": [ 1652 | { 1653 | "output_type": "stream", 1654 | "text": [ 1655 | "Epoch 1/40\n", 1656 | "348/348 [==============================] - ETA: 0s - loss: 0.8921 - accuracy: 0.7859\n", 1657 | "Epoch 00001: val_accuracy improved from -inf to 0.96463, saving model to /content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5\n", 1658 | "348/348 [==============================] - 15s 42ms/step - loss: 0.8921 - accuracy: 0.7859 - val_loss: 0.2930 - val_accuracy: 0.9646\n", 1659 | "Epoch 2/40\n", 1660 | "347/348 [============================>.] - ETA: 0s - loss: 0.6854 - accuracy: 0.8429\n", 1661 | "Epoch 00002: val_accuracy did not improve from 0.96463\n", 1662 | "348/348 [==============================] - 12s 36ms/step - loss: 0.6854 - accuracy: 0.8429 - val_loss: 0.2885 - val_accuracy: 0.9637\n", 1663 | "Epoch 3/40\n", 1664 | "348/348 [==============================] - ETA: 0s - loss: 0.6061 - accuracy: 0.8646\n", 1665 | "Epoch 00003: val_accuracy improved from 0.96463 to 0.96735, saving model to /content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5\n", 1666 | "348/348 [==============================] - 14s 41ms/step - loss: 0.6061 - accuracy: 0.8646 - val_loss: 0.2792 - val_accuracy: 0.9673\n", 1667 | "Epoch 4/40\n", 1668 | "348/348 [==============================] - ETA: 0s - loss: 0.5596 - accuracy: 0.8811\n", 1669 | "Epoch 00004: val_accuracy improved from 0.96735 to 0.97438, saving model to /content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5\n", 1670 | "348/348 [==============================] - 14s 41ms/step - loss: 0.5596 - accuracy: 0.8811 - val_loss: 0.2707 - val_accuracy: 0.9744\n", 1671 | "Epoch 5/40\n", 1672 | "348/348 [==============================] - ETA: 0s - loss: 0.5243 - accuracy: 0.8916\n", 1673 | "Epoch 00005: val_accuracy improved from 0.97438 to 0.97914, saving model to /content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5\n", 1674 | "348/348 [==============================] - 14s 42ms/step - loss: 0.5243 - accuracy: 0.8916 - val_loss: 0.2604 - val_accuracy: 0.9791\n", 1675 | "Epoch 6/40\n", 1676 | "347/348 [============================>.] - ETA: 0s - loss: 0.4975 - accuracy: 0.9009\n", 1677 | "Epoch 00006: val_accuracy did not improve from 0.97914\n", 1678 | "348/348 [==============================] - 13s 38ms/step - loss: 0.4972 - accuracy: 0.9011 - val_loss: 0.2525 - val_accuracy: 0.9785\n", 1679 | "Epoch 7/40\n", 1680 | "348/348 [==============================] - ETA: 0s - loss: 0.4719 - accuracy: 0.9098\n", 1681 | "Epoch 00007: val_accuracy improved from 0.97914 to 0.98095, saving model to /content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5\n", 1682 | "348/348 [==============================] - 14s 40ms/step - loss: 0.4719 - accuracy: 0.9098 - val_loss: 0.2545 - val_accuracy: 0.9810\n", 1683 | "Epoch 8/40\n", 1684 | "347/348 [============================>.] - ETA: 0s - loss: 0.4649 - accuracy: 0.9105\n", 1685 | "Epoch 00008: val_accuracy did not improve from 0.98095\n", 1686 | "348/348 [==============================] - 12s 36ms/step - loss: 0.4648 - accuracy: 0.9105 - val_loss: 0.2660 - val_accuracy: 0.9730\n", 1687 | "Epoch 9/40\n", 1688 | "347/348 [============================>.] - ETA: 0s - loss: 0.4422 - accuracy: 0.9183\n", 1689 | "Epoch 00009: val_accuracy did not improve from 0.98095\n", 1690 | "348/348 [==============================] - 12s 36ms/step - loss: 0.4419 - accuracy: 0.9184 - val_loss: 0.2515 - val_accuracy: 0.9766\n", 1691 | "Epoch 10/40\n", 1692 | "347/348 [============================>.] - ETA: 0s - loss: 0.4289 - accuracy: 0.9203\n", 1693 | "Epoch 00010: val_accuracy did not improve from 0.98095\n", 1694 | "348/348 [==============================] - 12s 36ms/step - loss: 0.4291 - accuracy: 0.9203 - val_loss: 0.2447 - val_accuracy: 0.9789\n", 1695 | "Epoch 11/40\n", 1696 | "347/348 [============================>.] - ETA: 0s - loss: 0.4171 - accuracy: 0.9240\n", 1697 | "Epoch 00011: val_accuracy improved from 0.98095 to 0.98322, saving model to /content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5\n", 1698 | "348/348 [==============================] - 14s 41ms/step - loss: 0.4171 - accuracy: 0.9240 - val_loss: 0.2319 - val_accuracy: 0.9832\n", 1699 | "Epoch 12/40\n", 1700 | "348/348 [==============================] - ETA: 0s - loss: 0.4154 - accuracy: 0.9236\n", 1701 | "Epoch 00012: val_accuracy did not improve from 0.98322\n", 1702 | "348/348 [==============================] - 12s 35ms/step - loss: 0.4154 - accuracy: 0.9236 - val_loss: 0.2504 - val_accuracy: 0.9753\n", 1703 | "Epoch 13/40\n", 1704 | "348/348 [==============================] - ETA: 0s - loss: 0.3990 - accuracy: 0.9295\n", 1705 | "Epoch 00013: val_accuracy did not improve from 0.98322\n", 1706 | "348/348 [==============================] - 12s 35ms/step - loss: 0.3990 - accuracy: 0.9295 - val_loss: 0.2319 - val_accuracy: 0.9830\n", 1707 | "Epoch 14/40\n", 1708 | "348/348 [==============================] - ETA: 0s - loss: 0.3945 - accuracy: 0.9309\n", 1709 | "Epoch 00014: val_accuracy improved from 0.98322 to 0.98503, saving model to /content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5\n", 1710 | "348/348 [==============================] - 14s 41ms/step - loss: 0.3945 - accuracy: 0.9309 - val_loss: 0.2297 - val_accuracy: 0.9850\n", 1711 | "Epoch 15/40\n", 1712 | "348/348 [==============================] - ETA: 0s - loss: 0.3858 - accuracy: 0.9328\n", 1713 | "Epoch 00015: val_accuracy did not improve from 0.98503\n", 1714 | "348/348 [==============================] - 12s 35ms/step - loss: 0.3858 - accuracy: 0.9328 - val_loss: 0.2244 - val_accuracy: 0.9837\n", 1715 | "Epoch 16/40\n", 1716 | "348/348 [==============================] - ETA: 0s - loss: 0.3733 - accuracy: 0.9358\n", 1717 | "Epoch 00016: val_accuracy did not improve from 0.98503\n", 1718 | "348/348 [==============================] - 12s 35ms/step - loss: 0.3733 - accuracy: 0.9358 - val_loss: 0.2214 - val_accuracy: 0.9848\n", 1719 | "Epoch 17/40\n", 1720 | "347/348 [============================>.] - ETA: 0s - loss: 0.3769 - accuracy: 0.9349\n", 1721 | "Epoch 00017: val_accuracy improved from 0.98503 to 0.98571, saving model to /content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5\n", 1722 | "348/348 [==============================] - 14s 41ms/step - loss: 0.3766 - accuracy: 0.9350 - val_loss: 0.2185 - val_accuracy: 0.9857\n", 1723 | "Epoch 18/40\n", 1724 | "348/348 [==============================] - ETA: 0s - loss: 0.3674 - accuracy: 0.9378\n", 1725 | "Epoch 00018: val_accuracy did not improve from 0.98571\n", 1726 | "348/348 [==============================] - 13s 37ms/step - loss: 0.3674 - accuracy: 0.9378 - val_loss: 0.2238 - val_accuracy: 0.9857\n", 1727 | "Epoch 19/40\n", 1728 | "348/348 [==============================] - ETA: 0s - loss: 0.3619 - accuracy: 0.9392\n", 1729 | "Epoch 00019: val_accuracy did not improve from 0.98571\n", 1730 | "348/348 [==============================] - 12s 35ms/step - loss: 0.3619 - accuracy: 0.9392 - val_loss: 0.2215 - val_accuracy: 0.9839\n", 1731 | "Epoch 20/40\n", 1732 | "347/348 [============================>.] - ETA: 0s - loss: 0.3533 - accuracy: 0.9406\n", 1733 | "Epoch 00020: val_accuracy did not improve from 0.98571\n", 1734 | "348/348 [==============================] - 12s 35ms/step - loss: 0.3539 - accuracy: 0.9405 - val_loss: 0.2162 - val_accuracy: 0.9853\n", 1735 | "Epoch 21/40\n", 1736 | "347/348 [============================>.] - ETA: 0s - loss: 0.3485 - accuracy: 0.9433\n", 1737 | "Epoch 00021: val_accuracy did not improve from 0.98571\n", 1738 | "348/348 [==============================] - 12s 35ms/step - loss: 0.3484 - accuracy: 0.9433 - val_loss: 0.2167 - val_accuracy: 0.9855\n", 1739 | "Epoch 22/40\n", 1740 | "348/348 [==============================] - ETA: 0s - loss: 0.3477 - accuracy: 0.9430\n", 1741 | "Epoch 00022: val_accuracy improved from 0.98571 to 0.98798, saving model to /content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5\n", 1742 | "348/348 [==============================] - 14s 40ms/step - loss: 0.3477 - accuracy: 0.9430 - val_loss: 0.2078 - val_accuracy: 0.9880\n", 1743 | "Epoch 23/40\n", 1744 | "348/348 [==============================] - ETA: 0s - loss: 0.3442 - accuracy: 0.9436\n", 1745 | "Epoch 00023: val_accuracy did not improve from 0.98798\n", 1746 | "348/348 [==============================] - 13s 37ms/step - loss: 0.3442 - accuracy: 0.9436 - val_loss: 0.2105 - val_accuracy: 0.9862\n", 1747 | "Epoch 24/40\n", 1748 | "348/348 [==============================] - ETA: 0s - loss: 0.3382 - accuracy: 0.9445\n", 1749 | "Epoch 00024: val_accuracy did not improve from 0.98798\n", 1750 | "348/348 [==============================] - 12s 35ms/step - loss: 0.3382 - accuracy: 0.9445 - val_loss: 0.2074 - val_accuracy: 0.9878\n", 1751 | "Epoch 25/40\n", 1752 | "348/348 [==============================] - ETA: 0s - loss: 0.3338 - accuracy: 0.9467\n", 1753 | "Epoch 00025: val_accuracy did not improve from 0.98798\n", 1754 | "348/348 [==============================] - 12s 35ms/step - loss: 0.3338 - accuracy: 0.9467 - val_loss: 0.2103 - val_accuracy: 0.9848\n", 1755 | "Epoch 26/40\n", 1756 | "348/348 [==============================] - ETA: 0s - loss: 0.3313 - accuracy: 0.9470\n", 1757 | "Epoch 00026: val_accuracy did not improve from 0.98798\n", 1758 | "348/348 [==============================] - 12s 35ms/step - loss: 0.3313 - accuracy: 0.9470 - val_loss: 0.2072 - val_accuracy: 0.9868\n", 1759 | "Epoch 27/40\n", 1760 | "347/348 [============================>.] - ETA: 0s - loss: 0.3268 - accuracy: 0.9486\n", 1761 | "Epoch 00027: val_accuracy improved from 0.98798 to 0.98844, saving model to /content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5\n", 1762 | "348/348 [==============================] - 14s 41ms/step - loss: 0.3268 - accuracy: 0.9486 - val_loss: 0.2055 - val_accuracy: 0.9884\n", 1763 | "Epoch 28/40\n", 1764 | "348/348 [==============================] - ETA: 0s - loss: 0.3245 - accuracy: 0.9479\n", 1765 | "Epoch 00028: val_accuracy did not improve from 0.98844\n", 1766 | "348/348 [==============================] - 12s 35ms/step - loss: 0.3245 - accuracy: 0.9479 - val_loss: 0.2082 - val_accuracy: 0.9853\n", 1767 | "Epoch 29/40\n", 1768 | "347/348 [============================>.] - ETA: 0s - loss: 0.3267 - accuracy: 0.9475\n", 1769 | "Epoch 00029: val_accuracy did not improve from 0.98844\n", 1770 | "348/348 [==============================] - 12s 35ms/step - loss: 0.3265 - accuracy: 0.9475 - val_loss: 0.2071 - val_accuracy: 0.9853\n", 1771 | "Epoch 30/40\n", 1772 | "347/348 [============================>.] - ETA: 0s - loss: 0.3229 - accuracy: 0.9488\n", 1773 | "Epoch 00030: val_accuracy did not improve from 0.98844\n", 1774 | "348/348 [==============================] - 12s 35ms/step - loss: 0.3227 - accuracy: 0.9489 - val_loss: 0.2030 - val_accuracy: 0.9875\n", 1775 | "Epoch 31/40\n", 1776 | "348/348 [==============================] - ETA: 0s - loss: 0.3157 - accuracy: 0.9509\n", 1777 | "Epoch 00031: val_accuracy did not improve from 0.98844\n", 1778 | "348/348 [==============================] - 12s 35ms/step - loss: 0.3157 - accuracy: 0.9509 - val_loss: 0.2080 - val_accuracy: 0.9832\n", 1779 | "Epoch 32/40\n", 1780 | "348/348 [==============================] - ETA: 0s - loss: 0.3132 - accuracy: 0.9516\n", 1781 | "Epoch 00032: val_accuracy did not improve from 0.98844\n", 1782 | "348/348 [==============================] - 13s 36ms/step - loss: 0.3132 - accuracy: 0.9516 - val_loss: 0.2009 - val_accuracy: 0.9884\n", 1783 | "Epoch 33/40\n", 1784 | "348/348 [==============================] - ETA: 0s - loss: 0.3119 - accuracy: 0.9507\n", 1785 | "Epoch 00033: val_accuracy improved from 0.98844 to 0.99116, saving model to /content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5\n", 1786 | "348/348 [==============================] - 14s 40ms/step - loss: 0.3119 - accuracy: 0.9507 - val_loss: 0.1913 - val_accuracy: 0.9912\n", 1787 | "Epoch 34/40\n", 1788 | "348/348 [==============================] - ETA: 0s - loss: 0.3112 - accuracy: 0.9511\n", 1789 | "Epoch 00034: val_accuracy did not improve from 0.99116\n", 1790 | "348/348 [==============================] - 12s 35ms/step - loss: 0.3112 - accuracy: 0.9511 - val_loss: 0.1986 - val_accuracy: 0.9875\n", 1791 | "Epoch 35/40\n", 1792 | "348/348 [==============================] - ETA: 0s - loss: 0.3103 - accuracy: 0.9507\n", 1793 | "Epoch 00035: val_accuracy did not improve from 0.99116\n", 1794 | "348/348 [==============================] - 12s 36ms/step - loss: 0.3103 - accuracy: 0.9507 - val_loss: 0.2022 - val_accuracy: 0.9864\n", 1795 | "Epoch 36/40\n", 1796 | "347/348 [============================>.] - ETA: 0s - loss: 0.3118 - accuracy: 0.9520\n", 1797 | "Epoch 00036: val_accuracy did not improve from 0.99116\n", 1798 | "348/348 [==============================] - 12s 36ms/step - loss: 0.3117 - accuracy: 0.9520 - val_loss: 0.1965 - val_accuracy: 0.9862\n", 1799 | "Epoch 37/40\n", 1800 | "348/348 [==============================] - ETA: 0s - loss: 0.3066 - accuracy: 0.9522\n", 1801 | "Epoch 00037: val_accuracy did not improve from 0.99116\n", 1802 | "348/348 [==============================] - 13s 37ms/step - loss: 0.3066 - accuracy: 0.9522 - val_loss: 0.1990 - val_accuracy: 0.9875\n", 1803 | "Epoch 38/40\n", 1804 | "348/348 [==============================] - ETA: 0s - loss: 0.3009 - accuracy: 0.9542\n", 1805 | "Epoch 00038: val_accuracy did not improve from 0.99116\n", 1806 | "348/348 [==============================] - 13s 37ms/step - loss: 0.3009 - accuracy: 0.9542 - val_loss: 0.1963 - val_accuracy: 0.9891\n", 1807 | "Epoch 39/40\n", 1808 | "348/348 [==============================] - ETA: 0s - loss: 0.3011 - accuracy: 0.9544\n", 1809 | "Epoch 00039: val_accuracy improved from 0.99116 to 0.99161, saving model to /content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5\n", 1810 | "348/348 [==============================] - 15s 42ms/step - loss: 0.3011 - accuracy: 0.9544 - val_loss: 0.1890 - val_accuracy: 0.9916\n", 1811 | "Epoch 40/40\n", 1812 | "347/348 [============================>.] - ETA: 0s - loss: 0.3025 - accuracy: 0.9536\n", 1813 | "Epoch 00040: val_accuracy did not improve from 0.99161\n", 1814 | "348/348 [==============================] - 13s 37ms/step - loss: 0.3025 - accuracy: 0.9537 - val_loss: 0.1948 - val_accuracy: 0.9866\n" 1815 | ], 1816 | "name": "stdout" 1817 | } 1818 | ] 1819 | }, 1820 | { 1821 | "cell_type": "code", 1822 | "metadata": { 1823 | "id": "gHNIDh_ScyAH", 1824 | "colab_type": "code", 1825 | "outputId": "76ce4903-437f-4e98-c654-e6a57cc6539f", 1826 | "colab": { 1827 | "base_uri": "https://localhost:8080/", 1828 | "height": 499 1829 | } 1830 | }, 1831 | "source": [ 1832 | "acc = history.history['accuracy']\n", 1833 | "val_acc = history.history['val_accuracy']\n", 1834 | "\n", 1835 | "loss = history.history['loss']\n", 1836 | "val_loss = history.history['val_loss']\n", 1837 | "\n", 1838 | "epochs_range = range(EPOCHS)\n", 1839 | "\n", 1840 | "plt.figure(figsize=(8, 8))\n", 1841 | "plt.subplot(1, 2, 1)\n", 1842 | "plt.plot(epochs_range, acc, label='Training Accuracy')\n", 1843 | "plt.plot(epochs_range, val_acc, label='Validation Accuracy')\n", 1844 | "plt.legend(loc='lower right')\n", 1845 | "plt.title('Training and Validation Accuracy')\n", 1846 | "\n", 1847 | "plt.subplot(1, 2, 2)\n", 1848 | "plt.plot(epochs_range, loss, label='Training Loss')\n", 1849 | "plt.plot(epochs_range, val_loss, label='Validation Loss')\n", 1850 | "plt.legend(loc='upper right')\n", 1851 | "plt.title('Training and Validation Loss')\n", 1852 | "plt.show()" 1853 | ], 1854 | "execution_count": 0, 1855 | "outputs": [ 1856 | { 1857 | "output_type": "display_data", 1858 | "data": { 1859 | "image/png": "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\n", 1860 | "text/plain": [ 1861 | "
" 1862 | ] 1863 | }, 1864 | "metadata": { 1865 | "tags": [], 1866 | "needs_background": "light" 1867 | } 1868 | } 1869 | ] 1870 | }, 1871 | { 1872 | "cell_type": "markdown", 1873 | "metadata": { 1874 | "id": "--iQkw_ynDl5", 1875 | "colab_type": "text" 1876 | }, 1877 | "source": [ 1878 | "### Load the model's weights and biases for evaluation on Test set" 1879 | ] 1880 | }, 1881 | { 1882 | "cell_type": "code", 1883 | "metadata": { 1884 | "id": "BMMCe9iWmva5", 1885 | "colab_type": "code", 1886 | "colab": {} 1887 | }, 1888 | "source": [ 1889 | "final_model.load_weights(\"/content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5\")\n", 1890 | "final_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])" 1891 | ], 1892 | "execution_count": 0, 1893 | "outputs": [] 1894 | }, 1895 | { 1896 | "cell_type": "code", 1897 | "metadata": { 1898 | "id": "kZ1wzyHCm00z", 1899 | "colab_type": "code", 1900 | "outputId": "6001978d-cc30-4e02-ffb7-5310d09375e4", 1901 | "colab": { 1902 | "base_uri": "https://localhost:8080/", 1903 | "height": 90 1904 | } 1905 | }, 1906 | "source": [ 1907 | "Pred_conv = final_model.evaluate(x_test_final, y_test, verbose=0)\n", 1908 | "print(\"Results on the test data\")\n", 1909 | "print(\" \")\n", 1910 | "print(\"%s- %.2f\" % (final_model.metrics_names[0], Pred_conv[0]))\n", 1911 | "print(\"%s- %.2f\" % (final_model.metrics_names[1], Pred_conv[1]))" 1912 | ], 1913 | "execution_count": 0, 1914 | "outputs": [ 1915 | { 1916 | "output_type": "stream", 1917 | "text": [ 1918 | "Results on the test data\n", 1919 | " \n", 1920 | "loss- 0.28\n", 1921 | "accuracy- 0.97\n" 1922 | ], 1923 | "name": "stdout" 1924 | } 1925 | ] 1926 | }, 1927 | { 1928 | "cell_type": "markdown", 1929 | "metadata": { 1930 | "id": "vel7XAkunRuw", 1931 | "colab_type": "text" 1932 | }, 1933 | "source": [ 1934 | "### Testing the model on the test dataset" 1935 | ] 1936 | }, 1937 | { 1938 | "cell_type": "code", 1939 | "metadata": { 1940 | "id": "lfqA1LFem4z5", 1941 | "colab_type": "code", 1942 | "outputId": "97859b01-960f-44b9-bde5-665e8706c7e1", 1943 | "colab": { 1944 | "base_uri": "https://localhost:8080/", 1945 | "height": 505 1946 | } 1947 | }, 1948 | "source": [ 1949 | "\n", 1950 | "plt.imshow(x_test[990]) \n", 1951 | "print(\"Predicted sign: \"+ str( \n", 1952 | " final_model.predict(x_test_final[1700].reshape(1, 32, 32, 1))))\n", 1953 | "\n", 1954 | "print('---------------------------------------------------------------------------')\n", 1955 | "\n", 1956 | "print(\"Predicted Sign\" + str(final_model.predict_classes(x_test_final[990].reshape(1, 32, 32, 1))))\n" 1957 | ], 1958 | "execution_count": 0, 1959 | "outputs": [ 1960 | { 1961 | "output_type": "stream", 1962 | "text": [ 1963 | "Predicted sign: [[5.95169203e-09 1.33304857e-05 4.64417589e-08 8.22311179e-08\n", 1964 | " 1.00793041e-10 1.53776520e-04 9.99824703e-01 1.95149958e-08\n", 1965 | " 9.73634437e-11 8.61657005e-14 1.12300655e-10 1.48708246e-08\n", 1966 | " 1.76557158e-10 6.37280367e-11 4.33579648e-12 4.28027941e-14\n", 1967 | " 4.16811075e-09 4.14768914e-13 1.11137002e-10 2.02223966e-13\n", 1968 | " 8.41277603e-11 2.09324294e-11 1.93099575e-14 1.83566842e-11\n", 1969 | " 1.35439901e-12 2.13375024e-08 3.83618638e-15 9.25231853e-12\n", 1970 | " 1.41590586e-10 1.22658272e-10 1.58779621e-08 3.06943387e-10\n", 1971 | " 1.85403493e-07 4.32619947e-11 1.45089789e-12 2.15373902e-13\n", 1972 | " 8.96582461e-12 1.05680924e-11 1.87089766e-09 6.98752445e-11\n", 1973 | " 7.32631733e-10 4.96747754e-09 7.83890482e-06]]\n", 1974 | "---------------------------------------------------------------------------\n", 1975 | "Predicted Sign[0]\n" 1976 | ], 1977 | "name": "stdout" 1978 | }, 1979 | { 1980 | "output_type": "display_data", 1981 | "data": { 1982 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD5CAYAAADhukOtAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAeSUlEQVR4nO2dW4xc15We/3XOqerqK8lmk1STokhZki8aW5ZkQvFgDMeZyQw0xgSykcCwHxw9CMNBMAZiYPIgOEjsAHnwBLENPyQO6FgYTeDYVsY2LCSGxx5hAGPyIIlSJFq2LFkXyiLV7Oalr9V1PysPVQQoYf+7W2x2Ne39fwDB6r1qnbNr91l1qvdfay1zdwghfvvJdnoCQojhoGAXIhEU7EIkgoJdiERQsAuRCAp2IRKh2Iqzmd0L4KsAcgD/3d2/GHv+nj0zfvDQ0fCxvOSO3gkOt5tr1KXZaPDDlfxc9fo6tXU6veB4UR2jPpXaKLVlOX+vNTNqi+FleK0aLf66PHIZVEf4a4tMH1kZXqtOu019miWXgYtajdoqllNbbuyY/FxZ5FrstZvU1mxE1rjHj2lFNTieV/hr3j21Nzh+fvEcVteWghfPVQe7meUA/guAPwRwBsCTZvaou/+C+Rw8dBTfeeTJoC3r8kXMe2eD46+98H+pz4unnqO21jp/I3jyiZPUNje3Ehzfe+Od1OfAu++gtonpCWorIpGUOX8jaK0vBMeff/Vp6tOw8IUDADcf+QC1TY3xgBltLQXH53/9OvX5ZaNFbftu/R1qu2GUr+NEFg6y3Pm5ql1+E1l9/SVqe/EUv3aaq/x8o9MHg+OTs7dTn3/2x/8yOP7vvvQA9dnKx/h7ALzk7q+4exvAtwHct4XjCSG2ka0E+yEAV75NnxmMCSGuQ7Z9g87MjpvZSTM7uXjp/HafTghB2EqwnwVw+IqfbxyMvQl3P+Hux9z92J7pfVs4nRBiK2wl2J8EcJuZ3WxmVQCfBPDotZmWEOJac9W78e7eNbPPAPhb9KW3h9z95zEfA5ATSclthJ8rC9uazS71aTXDu8EA8MqLz1PbxfkL1JbV9gfHx/YcoD4TE5PUVnDFCGVE/mk0w7IWADQbYVVj9+5p6jOZ76K2IrJrXUGF2lCEf2cHbuJrVUTkwWaL75BXwReyKMLraEQaBICyzY83Mc7nPznB17G98ga1NVcXw8fby8Pzwmr4uuqWkbWglk3g7j8E8MOtHEMIMRz0DTohEkHBLkQiKNiFSAQFuxCJoGAXIhG2tBv/dikdaJCkpypJWAAAePg9qZLxjKz1ZZ7scmEu8k0+rshgdCycwTbKE9vQaVyktnYrnKEGAD2PTCSSCGO9sHxVAffJiA8AdFZeo7YLizyDreyFbd7lUl6vy9ej7PL70vkuT8jxbngeZYfPoyTZjQDQi8y/U69TWxHJsms0wwlWFxd40s355bB83OnxhDLd2YVIBAW7EImgYBciERTsQiSCgl2IRBjqbnynBOba4V3J2XHuV5ByRStzPLlg9ddnqK29zJMqih5PyBlphnetl17mJbBWI9kuPVJbDwBakd3ibpcnAHXJ7nOH7I4DQC9yPI8kjKDHbc4SeSJ15qKdyK62TRnxi1X446sB9Aqe/FNEahuOO78OLA8fs9Hiu/tvzL0YHO90tBsvRPIo2IVIBAW7EImgYBciERTsQiSCgl2IRBiq9NYFcKEbliemWlzwmGxdCh+vfpr6rF+c4/NoR2rXdSIJC+fDcp7b1b1nlpHkCETbP3Ebz5Hh54qdKYvMI4+0XYKF5aSiwi+5vBKRtSISZjX2CkgSVSfjv7NWbO3HePIVyLUNALWSS7qX1sOvbffBW6lPZSLcRcYyvoa6swuRCAp2IRJBwS5EIijYhUgEBbsQiaBgFyIRtiS9mdlpAKvoV27ruvux2PMbzTpOvfB00Lb7IG/6WGmEa8a1W5E6YlVeGK7YFWmRE0nyQhZeLo/IOJ5zm2V8Hll2NfIa4FktfDwLjwOA9yK130pu67b5+ucFed0Flz0ru/kcbzl6mNr2kkxKAHjtlXANwLlIu7FWJMMukrSHvMp/16VxyW6VSIfZ6G7qM3bwXWGfCl/Da6Gz/xN35w3ShBDXBfoYL0QibDXYHcCPzewpMzt+LSYkhNgetvox/kPuftbM9gP4iZn90t1/euUTBm8CxwFgcu8NWzydEOJq2dKd3d3PDv5fAPB9APcEnnPC3Y+5+7GxSb7hIITYXq462M1s3MwmLz8G8EcAeDE2IcSOspWP8QcAfN/6GUIFgP/p7j+KOSwvncePf/Bfw8b3c9Xu9v2TwfHxPe/hkzvMC+9113m7o2qk0GObFGZsRwoNthEpQjhepbbd41w6bLb4/FfXwllPY9VD1GeCq1BoNBeprb7OW1shC8+xOsqLKL7j/dPU9r7bd1Fb+5e8RdULL8wHxy90+PGWelxfyyLSW+zOaRZu8QQAHZIh2FrZQ32WGmG5LjL1qw92d38FwPuv1l8IMVwkvQmRCAp2IRJBwS5EIijYhUgEBbsQiTDUgpNlq4GVV08FbT+qc4ln4QP/KDj+j/fNUh+rhuU6AIi0NkOTZLYBQMvCcl4j0l+rV/AspInxvdRW5jzbbBdXjWiPte7KMvVprnA5bKkekdcqXFa0Iixhjo7x+8tagx9vaZ2v42h2gNqAcLFSJ4UoAcAiBUStiIRMLCUuZiNzyYkkBwCdHsnAjKRE6s4uRCIo2IVIBAW7EImgYBciERTsQiTCUHfjveyhV18N2pbPv079XnwhnBp7oMHP1Wjz3eylDrfVI36tRviEWcF3kUcrfOu8bPK6ZJ1yidp63bPUtvD6Qvh4dV7vLo+sR6uMSBex2nsWXpP6Bb5W9Trffb74cvh1AcANxte4OnY0OD5Z5a/LIvdAMx4yMb/MeNLTynp4LuOjvC5jrwyfK7Lnrzu7EKmgYBciERTsQiSCgl2IRFCwC5EICnYhEmGo0hvckZWkv9I6T8ZYeyNcY+yJZV7XazTnL83zSNuliF+NtJSqVbhPJZJU0VsL10cDgPU13mRndYHLlN4KJ0JUMEV9sozLQtVKpKVR2aY2MNtaWHoFgPWXTlNbq8J11kZEohqfCdtqNV7jrxWp8dfuRPTeSOJK13htw0qF1JNrr1GfHis2d5U18oQQv0Uo2IVIBAW7EImgYBciERTsQiSCgl2IRNhQejOzhwD8CYAFd3/vYGwawHcAHAVwGsAn3J0Xkbt8LBgyUiOr7BJJDkB9OZzxZBEZZHJihtrGx7gMlUeksrwI90lqN/nc19fOUVtr9Q1qa6xxKbJW422Bdh26KTi+/8Bt1Gf/DbyG2+gIlykrkTp58+deDY4vzL9AfS6de4Xa6itcpmy3uVTW6oWz7PI9vNWUOZd0W82ILBepawdeGg55wfwmqE+XxItvUXr7KwD3vmXsQQCPufttAB4b/CyEuI7ZMNgH/dbfWqLzPgAPDx4/DOBj13heQohrzNX+zX7A3ecGj8+h39FVCHEds+Wvy7q7mxn9S8HMjgM4DgB55KuoQojt5Wrv7PNmNgsAg/9pzSB3P+Hux9z9WB75TroQYnu52mB/FMD9g8f3A/jBtZmOEGK72Iz09i0AHwEwY2ZnAHwewBcBPGJmDwB4DcAnNnMyM6DIw+8v7Yj0xmS59TbPuip6XBaq9HixwUpkSTIi43gr3GIIAGydt10qIwlUe2ZuprZ9h7mMNnngxuD49L5D1CfSMQhd8AKRvZLLUBNHw/Mfu5G37Dqy8j5qe+0XJ6lt/vVwViQAdNbnwoaMt+waneAZcc1I+6dOpHBnrC1Ttx2+vgueRIduN5xFx9p/AZsIdnf/FDH9wUa+QojrB32DTohEULALkQgKdiESQcEuRCIo2IVIhOH2enNHlxWctIj+UxLJKyJ1rK9xyavV5H4TtXBfOQCYJtlJnQbvy9ZY48mA03tvobZDN72T2ipTfI5WhItHXlw+T30wWqOmmRFuq0WqG9YbYWmr3uTSkEd6to3fwtdjd49LgMvnwrJot83vc6POpbfxSHHOXs7XoxG5vnskJPKIT9khBSwjaW+6swuRCAp2IRJBwS5EIijYhUgEBbsQiaBgFyIRhiu9maGMSWwEY5lXHskyimS9dYxnPPVKXmyw2whnyzVWePpadYTLSfv230BtyHkW4PwCL8x4qRGe//walwdrM+FMOQD43XffTW2LF89S29kLZ4Lj51d4/7JLTZ7FODvL1+qWw3dSW695Kji+ssR7zqHL6y5MTfJin+0Wf22dSCHTkkiYlWq4wCkA9Lrha84jWYq6swuRCAp2IRJBwS5EIijYhUgEBbsQiTDU3Xhzh9Ev6vNd+iwL27Is0qopi7UtitgiddXKFqn7VfJiYSNT+6ittmsvtfUyvquaR863ZzzcMqi2ix9vYYkrEAtzPIGmE0nyQRFe4/2zvMXAZCRBqdPmCShrY1zxyGb2h8dX+c55u06STABUJvm1s3sqMg+W7QKg2wnHRBG5F/c8rAy5EmGEEAp2IRJBwS5EIijYhUgEBbsQiaBgFyIRNtP+6SEAfwJgwd3fOxj7AoA/BXBZl/mcu/9wE8fCSCUsG3W6vCVTloWnWRQ8UaBShCWovo37FRlPkCjJHPNsnPrUJnkCx8jUDLVVxrjUVGnyZIwsD0uHq41z1Kddcrlm8RJP8qlZpFHn+GR4eDeXIvd0+TxWFnnyUjPSWskmw9dBPsLnXra5LNftRNp5EYkYAMpupFUZkYl7LX4Nd0gtR76Cm7uz/xWAewPjX3H3Owf/Ngx0IcTOsmGwu/tPAfDOhUKI3wi28jf7Z8zslJk9ZGb8c6UQ4rrgaoP9awBuAXAngDkAX2JPNLPjZnbSzE72Il8ZFEJsL1cV7O4+7+497zeD/jqAeyLPPeHux9z9WB75TroQYnu5qmA3s9krfvw4gOeuzXSEENvFZqS3bwH4CIAZMzsD4PMAPmJmd6K/038awJ9t5mQOoNsLZ19lkSw11tLGeCIXeh1uLDMuUOQRG2u5U+RT1KdSG6O2osbbDNXGuW1igttay3PB8VcXuGS01OHS4ZFdYQkNAGyZy0kNEHkzUpMva3LZ09b5uTDC55+RNa5M8t9Lc5lfO50elyI7kdZWjSb3c/KJ1zHNfUjrs1jW24bB7u6fCgx/YyM/IcT1hb5BJ0QiKNiFSAQFuxCJoGAXIhEU7EIkwnDbP7mjSzLHLJIxxNQEA5frMvAsKfT4uToZL3pYlOG5j1b58UZH+RzzgsskZnwe6+sXqe3cuXB2W6fLpab9+3gRyAMRmW95jb+2xfXwmkyU3Kfbi61HpEhoJOutQoqSNiMFTiOHi+KRY8ZCrdMlfqRoJwB0yLdRVXBSCKFgFyIVFOxCJIKCXYhEULALkQgKdiESYajSGwCUpLihxSrlWVia6IFnGXnJpavMea80i+guRRl+bywbvD9co86zzXptLg92ItLhufPhzDYAmF8n8uDkzdRncpQXNpyo8bWqF7wYiTXDRRu9zbPoqhO8EGg71geuzrPlvB7uR1eN9AlsRmQ+B1+P2K3T8kg2ZZdkgpLrHgC65Pr2SMlJ3dmFSAQFuxCJoGAXIhEU7EIkgoJdiEQYciIM0CM7j3nBdzlzkiTTL25LzgW+e+vgraZKj7QF8vBytVq8PlonUnus2+I77vV17jdHkl0AoGvhpJb6Ek9omZk9SG2X1vjOf3eEr+PESFihWF97g/os8pcMb/HrYzZST84a4WtncZUrKN7ldfKqGT8XMr4eecGv1Qn20iIKlZMCjKbdeCGEgl2IRFCwC5EICnYhEkHBLkQiKNiFSITNtH86DOCvARxAXww44e5fNbNpAN8BcBT9FlCfcPdw1sHlYw3+heiR2nR9wu9JRSSZgZ8JMON+tRpP1JjcFV6u1fPnqc/KIq8Xt7YaSdap1ajtwvklfr71cFJIN1/hPm0uhx3ax1tb7ZncS21zr4Ylu+W1S9SnGalPd+PsTdSGnEuf9VWyHk3uM8aXHhULtwADgNpYldrynB/UyrAE21iqU58yDychRUo5burO3gXwF+5+O4APAvhzM7sdwIMAHnP32wA8NvhZCHGdsmGwu/ucuz89eLwK4HkAhwDcB+DhwdMeBvCx7ZqkEGLrvK2/2c3sKIC7ADwO4IC7X/6sdg79j/lCiOuUTQe7mU0A+C6Az7r7m/4A9H6x6uD39MzsuJmdNLOTZcmLHQghtpdNBbuZVdAP9G+6+/cGw/NmNjuwzwJYCPm6+wl3P+bux6I92IUQ28qGwW5mhn4/9ufd/ctXmB4FcP/g8f0AfnDtpyeEuFZsJuvt9wB8GsDPzOyZwdjnAHwRwCNm9gCA1wB8YqMDOQAndbVibWt6pNVNNFMu8j5Wi2S21cDroBlRVvIRrnc0VrjUdO40l+UOvuMwtd11xzFqq7fDklInUjutzPhrnprYQ217d/Hadbt37Q/Po8OzzQqSyQUA3uJ+63OvUVtzNVwDsBPJmByrRerFGZ9HfZVLou2Cy6yT4+T68di9mGVM8te1YbC7+z+Ai9Z/sJG/EOL6QN+gEyIRFOxCJIKCXYhEULALkQgKdiESYejtn5z0eYp94aYowsUSx0Z5hlqecfmk6lwGyXs806gYDc+xOsGX0Vs822x14RlqO18Nt08CgCPvuYPa9h4Ir0lWROQk8LXPIvcDi8g8tQrJ8uIuMNKqCQCWF1+ntu4lnrXXqYezKSujPGNvZIrLjUUkYjLnmZujJEsNACqkjVaxa5r6XMTb/zaq7uxCJIKCXYhEULALkQgKdiESQcEuRCIo2IVIhKFKbwagIFlv3UjxyHwiLEHcctM7qU/VuYR24RLvlWaVSIMtIr2NFVyqKds8S6q5yvuoXfw1L4hoPd637ch7wmtSm+S/6kqV23Ly+wIAkGxEAEA3PP92nWf6XTjzErVdWuCZbcukqCQAWHVfcHzPft7frjYZkSLziKQbWSqL+JVECvYal94uGFt79XoTInkU7EIkgoJdiERQsAuRCAp2IRJhuLvxZqjk4VponZy3zpnYdzQ4fuvNd1Gfon6W2lrNBrX1Kvz9ryRZEGNjfDd+rMLbJy1Fdp9bi+HaaQAwf/oJalte/lVwfHo/T/yojo1R21ikDVXZ4YpBSWrGrS5eoD5rS7xeX7sbUUnGwjvuADC1/2hwfHKGr8fEVOQeSHfBgVYr0sKs5LZ2GV7HbslVl5JkFEVWSXd2IVJBwS5EIijYhUgEBbsQiaBgFyIRFOxCJMKG0puZHQbw1+i3ZHYAJ9z9q2b2BQB/CuD84Kmfc/cfxo5VKao4sPemoO3VFmtnA+w58q7g+O+8i9dia73K68ydfuMV7lflSRBG6uR1Si4bZhPctucmLuPUszPUlq9wyau1FpYc51fCkhwAGOtrBQDOW0NFIRpQlvP7ixNZFgCqkzPUNnHwCLVVJsOyqI9zSbFdRNpQdVvUth5R3jxyX+32wtdVr4y0RDN2Mu6zGZ29C+Av3P1pM5sE8JSZ/WRg+4q7/+dNHEMIscNsptfbHIC5weNVM3sewKHtnpgQ4trytv5mN7OjAO4C8Phg6DNmdsrMHjIz/jUyIcSOs+lgN7MJAN8F8Fl3XwHwNQC3ALgT/Tv/l4jfcTM7aWYnO6SggRBi+9lUsJtZBf1A/6a7fw8A3H3e3XvuXgL4OoB7Qr7ufsLdj7n7sUoR2QgSQmwrGwa7mRmAbwB43t2/fMX47BVP+ziA56799IQQ14rN7Mb/HoBPA/iZmV3uV/Q5AJ8yszvR3+s/DeDPNjrQ2OgU7n7fPw3aRiLtfe68473B8SP7x6nPwln+PlaNtJpqRtKGMpD6eT0u1XQix5sa5dlae2/kra0m27zYWcfC9fVmJuapz5lf8rpwDp4d1u7weeTV8PyLSBadVfknv9HdE9Q2NcvnWEyErxGP/F7asazITqyNU6QNWMbXqtcmk7HIvbhk19wWpDd3/wcgeJVHNXUhxPWFvkEnRCIo2IVIBAW7EImgYBciERTsQiTCUAtOjtXGcNd7PhC0vbO4jfrtv3E2OD6dc8lrJfLKahGJpBWRSIqRcAZYz7mPx9onxZSVjGeb9fZy+Wr/HbcGx//5h/dTn1P/51lqe/aZFWq7cJHbalPhLDXPI62mInqYRQo9lj2e4ThOWluN1Hgxx26Vr29jcYnaRqo8a8+52oul9fDrXu/yC6TSCb9mU/snIYSCXYhEULALkQgKdiESQcEuRCIo2IVIhKFKb9XaCI7eenPQltfq1K9SCU+zUl/lJ8u4BJEX/D0uz7h8khdhW26RAoXUAsC5X7PHM6+6OS8CstYMFyJc7UxTn/NNLl0Ve3hmXtHjr65ehnu9tdu8KuNYlcuNnRZfq/olLm+uNcOSXXWEy2tFGbkHrvPrtFXj1w5qb79/3EiFy43jefh3lkWue93ZhUgEBbsQiaBgFyIRFOxCJIKCXYhEULALkQhDld5ghnI0LK+MVngPrRrJHCtLLk10YwX+jMsTnvFjdsqwbNRs8XN1SXYSAGS0X1e81mAWkfpWX1oMjv9o8Snqs7YYyfSrjFHbrtlw3z4AsCw8x17JM+Vy4gMAZrzXW55PRY7JjsdfczUSFl7wrLflBpeCu5HMyJFKWLIbr3ApcjfJiswzfuHozi5EIijYhUgEBbsQiaBgFyIRFOxCJMKGu/FmVgPwUwAjg+f/jbt/3sxuBvBtAHsBPAXg0+4ebdNawtHoki/953wXnG1Ne2Tn0YtI0a88kiyQ8x3yHlmuouBJJjPTvJP16GjsNfOd6SySrGPktRWRne7RmchagdtiST7eawbHe12+Y11fW6C2lVU+j+n9B6ltdIIkL4GvR8FNyHM+j5Uev3YQSb4qRsPHHBnhSog3WKhtLRGmBeD33f396LdnvtfMPgjgLwF8xd1vBbAI4IFNHEsIsUNsGOzeZ23wY2XwzwH8PoC/GYw/DOBj2zJDIcQ1YbP92fNBB9cFAD8B8DKAJXe//LnlDIBD2zNFIcS1YFPB7u49d78TwI0A7gHw7s2ewMyOm9lJMzu5snzpKqcphNgqb2s33t2XAPw9gN8FsNvMLu9Y3QjgLPE54e7H3P3Y1C6+kSWE2F42DHYz22dmuwePRwH8IYDn0Q/6fzF42v0AfrBdkxRCbJ3NJMLMAnjYzHL03xwecff/bWa/APBtM/uPAP4fgG9sdCCHoUtkNKLI9SFykkeSXcqIDRH5JIvIcl6GNZnaWJX6jI3xZIZqhUs1OcvgAJBlsV9b+HVHcn9giCimxhN5epEaejlJKOr0+FrlLW5bnHuF2s7OX6C2o7e+Lzh+cOYA9Yl17PLI76WM+HUiSVslkVKbkfVtdcPXTkQ13DjY3f0UgLsC46+g//e7EOI3AH2DTohEULALkQgKdiESQcEuRCIo2IVIBHOPNii6ticzOw/gtcGPMwC4ZjI8NI83o3m8md+0eRxx92DPrqEG+5tObHbS3Y/tyMk1D80jwXnoY7wQiaBgFyIRdjLYT+zgua9E83gzmseb+a2Zx479zS6EGC76GC9EIuxIsJvZvWb2gpm9ZGYP7sQcBvM4bWY/M7NnzOzkEM/7kJktmNlzV4xNm9lPzOxXg/95pcrtnccXzOzsYE2eMbOPDmEeh83s783sF2b2czP714Pxoa5JZB5DXRMzq5nZE2b27GAe/2EwfrOZPT6Im++YGU8TDOHuQ/2HfrnSlwG8A0AVwLMAbh/2PAZzOQ1gZgfO+2EAdwN47oqx/wTgwcHjBwH85Q7N4wsA/s2Q12MWwN2Dx5MAXgRw+7DXJDKPoa4J+nnKE4PHFQCPA/gggEcAfHIw/t8A/Ku3c9yduLPfA+Ald3/F+6Wnvw3gvh2Yx47h7j8F8NYaXfehX7gTGFIBTzKPoePuc+7+9ODxKvrFUQ5hyGsSmcdQ8T7XvMjrTgT7IQCvX/HzThardAA/NrOnzOz4Ds3hMgfcfW7w+BwAXl1h+/mMmZ0afMzf9j8nrsTMjqJfP+Fx7OCavGUewJDXZDuKvKa+Qfchd78bwB8D+HMz+/BOTwjov7Mj3oNhO/kagFvQ7xEwB+BLwzqxmU0A+C6Az7r7m3o7D3NNAvMY+pr4Foq8MnYi2M8COHzFz7RY5Xbj7mcH/y8A+D52tvLOvJnNAsDgf94eZRtx9/nBhVYC+DqGtCZmVkE/wL7p7t8bDA99TULz2Kk1GZz7bRd5ZexEsD8J4LbBzmIVwCcBPDrsSZjZuJlNXn4M4I8APBf32lYeRb9wJ7CDBTwvB9eAj2MIa2Jmhn4Nw+fd/ctXmIa6Jmwew16TbSvyOqwdxrfsNn4U/Z3OlwH82x2awzvQVwKeBfDzYc4DwLfQ/zjYQf9vrwfQ75n3GIBfAfg7ANM7NI//AeBnAE6hH2yzQ5jHh9D/iH4KwDODfx8d9ppE5jHUNQFwB/pFXE+h/8by76+4Zp8A8BKA/wVg5O0cV9+gEyIRUt+gEyIZFOxCJIKCXYhEULALkQgKdiESQcEuRCIo2IVIBAW7EInw/wFCS0Q22DmwHgAAAABJRU5ErkJggg==\n", 1983 | "text/plain": [ 1984 | "
" 1985 | ] 1986 | }, 1987 | "metadata": { 1988 | "tags": [], 1989 | "needs_background": "light" 1990 | } 1991 | } 1992 | ] 1993 | }, 1994 | { 1995 | "cell_type": "markdown", 1996 | "metadata": { 1997 | "id": "mrbxLqyovv0f", 1998 | "colab_type": "text" 1999 | }, 2000 | "source": [ 2001 | "### Save the model" 2002 | ] 2003 | }, 2004 | { 2005 | "cell_type": "code", 2006 | "metadata": { 2007 | "id": "ygfiDJ0pnVxv", 2008 | "colab_type": "code", 2009 | "colab": {} 2010 | }, 2011 | "source": [ 2012 | "final_model.save('/content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5')" 2013 | ], 2014 | "execution_count": 0, 2015 | "outputs": [] 2016 | }, 2017 | { 2018 | "cell_type": "markdown", 2019 | "metadata": { 2020 | "id": "DN7YN0GwvyoA", 2021 | "colab_type": "text" 2022 | }, 2023 | "source": [ 2024 | "### Loading the saved model " 2025 | ] 2026 | }, 2027 | { 2028 | "cell_type": "code", 2029 | "metadata": { 2030 | "id": "UdkbTnFqncvc", 2031 | "colab_type": "code", 2032 | "outputId": "352a767d-5316-4bfc-fa28-c54ac97c7645", 2033 | "colab": { 2034 | "base_uri": "https://localhost:8080/", 2035 | "height": 641 2036 | } 2037 | }, 2038 | "source": [ 2039 | "loaded_model = tf.keras.models.load_model('/content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5')\n", 2040 | "\n", 2041 | "loaded_model.summary()" 2042 | ], 2043 | "execution_count": 0, 2044 | "outputs": [ 2045 | { 2046 | "output_type": "stream", 2047 | "text": [ 2048 | "Model: \"sequential\"\n", 2049 | "_________________________________________________________________\n", 2050 | "Layer (type) Output Shape Param # \n", 2051 | "=================================================================\n", 2052 | "conv2d (Conv2D) (None, 32, 32, 48) 480 \n", 2053 | "_________________________________________________________________\n", 2054 | "max_pooling2d (MaxPooling2D) (None, 16, 16, 48) 0 \n", 2055 | "_________________________________________________________________\n", 2056 | "dropout (Dropout) (None, 16, 16, 48) 0 \n", 2057 | "_________________________________________________________________\n", 2058 | "conv2d_1 (Conv2D) (None, 16, 16, 92) 110492 \n", 2059 | "_________________________________________________________________\n", 2060 | "max_pooling2d_1 (MaxPooling2 (None, 8, 8, 92) 0 \n", 2061 | "_________________________________________________________________\n", 2062 | "dropout_1 (Dropout) (None, 8, 8, 92) 0 \n", 2063 | "_________________________________________________________________\n", 2064 | "conv2d_2 (Conv2D) (None, 8, 8, 127) 292227 \n", 2065 | "_________________________________________________________________\n", 2066 | "max_pooling2d_2 (MaxPooling2 (None, 4, 4, 127) 0 \n", 2067 | "_________________________________________________________________\n", 2068 | "dropout_2 (Dropout) (None, 4, 4, 127) 0 \n", 2069 | "_________________________________________________________________\n", 2070 | "flatten (Flatten) (None, 2032) 0 \n", 2071 | "_________________________________________________________________\n", 2072 | "dense (Dense) (None, 217) 441161 \n", 2073 | "_________________________________________________________________\n", 2074 | "dropout_3 (Dropout) (None, 217) 0 \n", 2075 | "_________________________________________________________________\n", 2076 | "dense_1 (Dense) (None, 43) 9374 \n", 2077 | "=================================================================\n", 2078 | "Total params: 853,734\n", 2079 | "Trainable params: 853,734\n", 2080 | "Non-trainable params: 0\n", 2081 | "_________________________________________________________________\n" 2082 | ], 2083 | "name": "stdout" 2084 | } 2085 | ] 2086 | }, 2087 | { 2088 | "cell_type": "markdown", 2089 | "metadata": { 2090 | "id": "T02omtWWv22P", 2091 | "colab_type": "text" 2092 | }, 2093 | "source": [ 2094 | "### Making predictions with the loaded model " 2095 | ] 2096 | }, 2097 | { 2098 | "cell_type": "code", 2099 | "metadata": { 2100 | "id": "eH6japacnc1B", 2101 | "colab_type": "code", 2102 | "outputId": "0ced043a-6325-4c4a-f3bc-2219298a144c", 2103 | "colab": { 2104 | "base_uri": "https://localhost:8080/", 2105 | "height": 468 2106 | } 2107 | }, 2108 | "source": [ 2109 | "plt.imshow(x_test[1832]) \n", 2110 | "print(\"Predicted sign: \"+ str( \n", 2111 | " loaded_model.predict(x_test_final[1832].reshape(1, 32, 32, 1))))\n", 2112 | "\n", 2113 | "print('---------------------------------------------------------------------------')\n", 2114 | "\n", 2115 | "print(\"Predicted Sign\" + str(loaded_model.predict_classes(x_test_final[1832].reshape(1, 32, 32, 1))))" 2116 | ], 2117 | "execution_count": 0, 2118 | "outputs": [ 2119 | { 2120 | "output_type": "stream", 2121 | "text": [ 2122 | "Predicted sign: [[3.4522889e-09 3.0688585e-05 1.5866694e-04 6.6440302e-04 9.7419296e-08\n", 2123 | " 9.9902177e-01 2.3465546e-07 1.2172624e-04 3.9090730e-07 6.0086491e-10\n", 2124 | " 1.9281763e-06 3.9314019e-10 1.6360911e-10 1.6927328e-11 9.1467207e-12\n", 2125 | " 4.2105062e-09 1.8575383e-09 6.3886010e-14 8.1647151e-13 6.6127317e-13\n", 2126 | " 1.0216057e-11 8.7105871e-11 6.1265622e-14 1.7995303e-12 1.5983633e-12\n", 2127 | " 4.2088120e-09 1.9983780e-13 1.0291361e-13 1.2473573e-11 3.9872386e-10\n", 2128 | " 1.2319692e-08 1.6544118e-09 1.6150135e-11 5.6740823e-10 4.3921977e-11\n", 2129 | " 3.0515163e-11 2.1255560e-12 2.0931132e-12 7.5120399e-09 3.6280859e-12\n", 2130 | " 1.9607171e-09 3.6935528e-15 8.9487511e-09]]\n", 2131 | "---------------------------------------------------------------------------\n", 2132 | "Predicted Sign[5]\n" 2133 | ], 2134 | "name": "stdout" 2135 | }, 2136 | { 2137 | "output_type": "display_data", 2138 | "data": { 2139 | "image/png": "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\n", 2140 | "text/plain": [ 2141 | "
" 2142 | ] 2143 | }, 2144 | "metadata": { 2145 | "tags": [], 2146 | "needs_background": "light" 2147 | } 2148 | } 2149 | ] 2150 | }, 2151 | { 2152 | "cell_type": "markdown", 2153 | "metadata": { 2154 | "id": "qPc0G00_v7wW", 2155 | "colab_type": "text" 2156 | }, 2157 | "source": [ 2158 | "### Testing our saved model on random traffic sign images\n", 2159 | "\n", 2160 | "\n", 2161 | "\n" 2162 | ] 2163 | }, 2164 | { 2165 | "cell_type": "code", 2166 | "metadata": { 2167 | "id": "29o5hhOLnwCa", 2168 | "colab_type": "code", 2169 | "outputId": "5a6bbd45-602c-48dc-ca2f-66f30acece8e", 2170 | "colab": { 2171 | "base_uri": "https://localhost:8080/", 2172 | "height": 35 2173 | } 2174 | }, 2175 | "source": [ 2176 | "from tensorflow.keras.models import load_model\n", 2177 | "\n", 2178 | "import cv2\n", 2179 | "\n", 2180 | "import numpy as np\n", 2181 | "\n", 2182 | "final_model = load_model('/content/drive/My Drive/Traffic_sign_Dataset/Traffic_Sign_Classifier_CNN.hdf5')\n", 2183 | "\n", 2184 | "img = cv2.imread('/content/drive/My Drive/Traffic_sign_Dataset/Test Random Images/go straight or right.png')\n", 2185 | "\n", 2186 | "img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) \n", 2187 | "\n", 2188 | "img = img / 255\n", 2189 | "\n", 2190 | "img = cv2.resize(img,(32,32))\n", 2191 | "\n", 2192 | "img = np.reshape(img,[1,32,32,1])\n", 2193 | "\n", 2194 | "classes = final_model.predict_classes(img)\n", 2195 | "\n", 2196 | "print(classes)" 2197 | ], 2198 | "execution_count": 0, 2199 | "outputs": [ 2200 | { 2201 | "output_type": "stream", 2202 | "text": [ 2203 | "[36]\n" 2204 | ], 2205 | "name": "stdout" 2206 | } 2207 | ] 2208 | }, 2209 | { 2210 | "cell_type": "code", 2211 | "metadata": { 2212 | "id": "hBPbatbDRj4x", 2213 | "colab_type": "code", 2214 | "colab": {} 2215 | }, 2216 | "source": [ 2217 | "" 2218 | ], 2219 | "execution_count": 0, 2220 | "outputs": [] 2221 | } 2222 | ] 2223 | } -------------------------------------------------------------------------------- /Model/Traffic_Sign_Classifier_CNN.hdf5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Model/Traffic_Sign_Classifier_CNN.hdf5 -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: streamlit run --server.enableCORS false --server.port $PORT app.py 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Traffic_Sign_Classifier-with-Streamlit 2 | 3 | ## App: 4 | - Link: https://traffic-sign-classification.herokuapp.com/ 5 | 6 | 7 | 8 | ## App Output 9 | ![alt text](https://github.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/blob/master/Streamlit%20App%20Output/streamlit-upload-2020-05-11-13-0.gif) 10 | 11 | 12 | ## Project overview 13 | - The aim of this project is to focus on the first fundamental features of the decision making ability of an autonomous vehicle, 14 | i.e., to develop a deep learning model that reads traffic signs and classifies them correctly using Convolutional Neural Networks(CNNs). 15 | 16 | - The traffic sign classifier uses a German traffic dataset. The German traffic dataset consists of 17 | 34,799 32*32 pixels colored images that is used for the training dataset, 12,630 images are used 18 | for the testing dataset and 4410 images are used in the validation dataset where each images is a 19 | photo of a traffic sign belonging to one of the 43 classes i.e., traffic sign types. 20 | 21 | 22 | ## Dataset: 23 | Train Data: https://drive.google.com/open?id=1ZrJJvIbZ5vUHjyzUGNXGl4sRS7zlU5Db 24 | 25 | Validation Data: https://drive.google.com/open?id=1bLWaYJZHroOyfPVscVdBjh9atjvHDdFj 26 | 27 | Test Data: https://drive.google.com/open?id=127Usik6jjD_oBhr5hDojgLARW9XYxWdr 28 | 29 | ## Folders Description 30 | ### Google Colab Notebook 31 | #### Contains the whole process of building the CNN Model 32 | - Load the Pickled dataset 33 | - Use Seaborn to visualise the data. 34 | - Preprocess the images using OpenCV. 35 | - Use ImageDataGenerator for image augmentation and help the model generalise it's results. 36 | - build_model() function takes hyperparameter(hp) as input and we start building our CNN model using KerasTuner and then compile our model. 37 | - KerasTuner gives us the best hyperparameter combinations using RandomSearch method. 38 | - We now create a model checkpoint and then fit the model and run it for 40 epochs. 39 | - Now Load the model's weights and biases and evaluate it on our test dataset. 40 | - Save our model in Keras HDF5 format. 41 | - Use the saved model to test on random images. 42 | 43 | ### Test Random Images 44 | - This contains images from the internet. A total of 43 images belonging to each class. 45 | - Our model will be tested using this unseen data 46 | 47 | ### Streamlit App Output 48 | - Contains the App's final output 49 | 50 | ### Class Names and Labels 51 | - Contains the signnames.csv file 52 | 53 | ### Result Excel 54 | - Conatins a exccel sheet having the results of our test results on random images from the internet 55 | - Also contains the accuracy of our model on unseen data 56 | - Accuracy on unseen data : 79.06% 57 | ### Model 58 | Contains the saved keras model named 59 | - ###### Traffic_sign_classifier_CNN.hdf5 60 | 61 | ## Files for our Streamlit App 62 | 63 | #### classify.py 64 | - get_model(): Loads the saved model into cache using streamlit's "@st.cache" feature. 65 | - predict(): Takes an image as input from the function parameter, preprocesses it and feeds it to the model for results. 66 | 67 | #### app.py 68 | - Contains the front-end code for the streamlit app. 69 | - Imports the predict() function fetches the result and displays it. 70 | 71 | #### Procfile 72 | A Procfile is a file which describes how to run your application. 73 | 74 | #### requirements.txt 75 | This has all the dependencies required to deploy our application on Heroku 76 | 77 | ## Run this app on your system. 78 | ### Requirements 79 | - Python 3.6+ 80 | - NumPy 81 | - Pillow 82 | - TensorFlow 2.x 83 | - Streamlit 84 | 85 | ### To run it on your system 86 | - Install all the dependencies 87 | - Clone this repository 88 | - You need the Streamlit App folder to run this application. 89 | - In your Command line/Terminal go to the directory where you have upload.py file then type 90 | #### streamlit run app.py 91 | 92 | 93 | -------------------------------------------------------------------------------- /Result Excel/Predictions.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Result Excel/Predictions.xlsx -------------------------------------------------------------------------------- /Streamlit App Output/Screenshot (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Streamlit App Output/Screenshot (1).png -------------------------------------------------------------------------------- /Streamlit App Output/Screenshot (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Streamlit App Output/Screenshot (2).png -------------------------------------------------------------------------------- /Streamlit App Output/Screenshot (3).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Streamlit App Output/Screenshot (3).png -------------------------------------------------------------------------------- /Streamlit App Output/streamlit-upload-2020-05-11-13-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Streamlit App Output/streamlit-upload-2020-05-11-13-0.gif -------------------------------------------------------------------------------- /Test Random Images/80 ends.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/80 ends.jpg -------------------------------------------------------------------------------- /Test Random Images/Ahead only.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Ahead only.jpg -------------------------------------------------------------------------------- /Test Random Images/Beware_of_Ice_or_snow_Road_Sign.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Beware_of_Ice_or_snow_Road_Sign.jpg -------------------------------------------------------------------------------- /Test Random Images/Bicycles Crossing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Bicycles Crossing.jpg -------------------------------------------------------------------------------- /Test Random Images/Children Crossing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Children Crossing.jpg -------------------------------------------------------------------------------- /Test Random Images/Dangerous curve to the left.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Dangerous curve to the left.jpg -------------------------------------------------------------------------------- /Test Random Images/Dangerous curve to the right.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Dangerous curve to the right.jpg -------------------------------------------------------------------------------- /Test Random Images/End of all speed and passing limits.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/End of all speed and passing limits.jpg -------------------------------------------------------------------------------- /Test Random Images/End of no passing by vehicles over 3.5 metric tons.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/End of no passing by vehicles over 3.5 metric tons.jpg -------------------------------------------------------------------------------- /Test Random Images/End of no passing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/End of no passing.jpg -------------------------------------------------------------------------------- /Test Random Images/Go straight or left.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Go straight or left.jpg -------------------------------------------------------------------------------- /Test Random Images/Keep left.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Keep left.jpg -------------------------------------------------------------------------------- /Test Random Images/Keep right.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Keep right.jpg -------------------------------------------------------------------------------- /Test Random Images/No Entry.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/No Entry.jpg -------------------------------------------------------------------------------- /Test Random Images/No Passing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/No Passing.jpg -------------------------------------------------------------------------------- /Test Random Images/No Vehicles.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/No Vehicles.jpg -------------------------------------------------------------------------------- /Test Random Images/No passing for vehicles over 3.5 metric tons.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/No passing for vehicles over 3.5 metric tons.jpg -------------------------------------------------------------------------------- /Test Random Images/Pedestrians.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Pedestrians.jpg -------------------------------------------------------------------------------- /Test Random Images/Road Work.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Road Work.jpg -------------------------------------------------------------------------------- /Test Random Images/Road narrows on the right.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Road narrows on the right.jpg -------------------------------------------------------------------------------- /Test Random Images/Roundabout mandatory.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Roundabout mandatory.jpg -------------------------------------------------------------------------------- /Test Random Images/Traffic signals.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Traffic signals.jpg -------------------------------------------------------------------------------- /Test Random Images/Turn left ahead.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Turn left ahead.jpg -------------------------------------------------------------------------------- /Test Random Images/Turn right ahead.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Turn right ahead.jpg -------------------------------------------------------------------------------- /Test Random Images/Wild animals crossing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/Wild animals crossing.jpg -------------------------------------------------------------------------------- /Test Random Images/bumpy road.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/bumpy road.jpg -------------------------------------------------------------------------------- /Test Random Images/double_curve.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/double_curve.jpg -------------------------------------------------------------------------------- /Test Random Images/general caution.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/general caution.jpg -------------------------------------------------------------------------------- /Test Random Images/go straight or right.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/go straight or right.jpg -------------------------------------------------------------------------------- /Test Random Images/priority_road.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/priority_road.jpg -------------------------------------------------------------------------------- /Test Random Images/right of way at next intersection.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/right of way at next intersection.jpg -------------------------------------------------------------------------------- /Test Random Images/slippery_road.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/slippery_road.jpg -------------------------------------------------------------------------------- /Test Random Images/speed limit 100.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/speed limit 100.jpg -------------------------------------------------------------------------------- /Test Random Images/speed_limit_120.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/speed_limit_120.jpg -------------------------------------------------------------------------------- /Test Random Images/speed_limit_20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/speed_limit_20.jpg -------------------------------------------------------------------------------- /Test Random Images/speed_limit_30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/speed_limit_30.jpg -------------------------------------------------------------------------------- /Test Random Images/speed_limit_50.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/speed_limit_50.jpg -------------------------------------------------------------------------------- /Test Random Images/speed_limit_60.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/speed_limit_60.jpg -------------------------------------------------------------------------------- /Test Random Images/speed_limit_70.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/speed_limit_70.jpg -------------------------------------------------------------------------------- /Test Random Images/speed_limit_80.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/speed_limit_80.jpg -------------------------------------------------------------------------------- /Test Random Images/stop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/stop.jpg -------------------------------------------------------------------------------- /Test Random Images/vehicles over 3.5 metric tons prohibited.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/vehicles over 3.5 metric tons prohibited.jpg -------------------------------------------------------------------------------- /Test Random Images/yield.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dD2405/Traffic_Sign_Classifier-with-Streamlit/be837a4f7da60531e863f595ef78449672f2f89d/Test Random Images/yield.jpg -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | from PIL import Image 3 | import classify 4 | import numpy as np 5 | 6 | sign_names = { 7 | 0: 'Speed limit (20km/h)', 8 | 1: 'Speed limit (30km/h)', 9 | 2: 'Speed limit (50km/h)', 10 | 3: 'Speed limit (60km/h)', 11 | 4: 'Speed limit (70km/h)', 12 | 5: 'Speed limit (80km/h)', 13 | 6: 'End of speed limit (80km/h)', 14 | 7: 'Speed limit (100km/h)', 15 | 8: 'Speed limit (120km/h)', 16 | 9: 'No passing', 17 | 10: 'No passing for vehicles over 3.5 metric tons', 18 | 11: 'Right-of-way at the next intersection', 19 | 12: 'Priority road', 20 | 13: 'Yield', 21 | 14: 'Stop', 22 | 15: 'No vehicles', 23 | 16: 'Vehicles over 3.5 metric tons prohibited', 24 | 17: 'No entry', 25 | 18: 'General caution', 26 | 19: 'Dangerous curve to the left', 27 | 20: 'Dangerous curve to the right', 28 | 21: 'Double curve', 29 | 22: 'Bumpy road', 30 | 23: 'Slippery road', 31 | 24: 'Road narrows on the right', 32 | 25: 'Road work', 33 | 26: 'Traffic signals', 34 | 27: 'Pedestrians', 35 | 28: 'Children crossing', 36 | 29: 'Bicycles crossing', 37 | 30: 'Beware of ice/snow', 38 | 31: 'Wild animals crossing', 39 | 32: 'End of all speed and passing limits', 40 | 33: 'Turn right ahead', 41 | 34: 'Turn left ahead', 42 | 35: 'Ahead only', 43 | 36: 'Go straight or right', 44 | 37: 'Go straight or left', 45 | 38: 'Keep right', 46 | 39: 'Keep left', 47 | 40: 'Roundabout mandatory', 48 | 41: 'End of no passing', 49 | 42: 'End of no passing by vehicles over 3.5 metric tons'} 50 | 51 | st.title("Traffic Sign Classifier") 52 | 53 | uploaded_file = st.file_uploader("Choose an image...", type="jpg") 54 | if uploaded_file is not None: 55 | 56 | image = Image.open(uploaded_file) 57 | st.image(image, caption='Uploaded Image', use_column_width=True) 58 | 59 | st.write("") 60 | 61 | if st.button('predict'): 62 | st.write("Result...") 63 | label = classify.predict(uploaded_file) 64 | label = label.item() 65 | 66 | res = sign_names.get(label) 67 | st.markdown(res) 68 | -------------------------------------------------------------------------------- /classify.py: -------------------------------------------------------------------------------- 1 | from tensorflow.keras.models import load_model 2 | from tensorflow.keras.preprocessing.image import img_to_array, load_img 3 | import numpy as np 4 | import streamlit as st 5 | 6 | @st.cache(allow_output_mutation=True) 7 | def get_model(): 8 | model = load_model('Model/Traffic_Sign_Classifier_CNN.hdf5') 9 | print('Model Loaded') 10 | return model 11 | 12 | 13 | def predict(image): 14 | loaded_model = get_model() 15 | image = load_img(image, target_size=(32, 32), color_mode = "grayscale") 16 | image = img_to_array(image) 17 | image = image/255.0 18 | image = np.reshape(image,[1,32,32,1]) 19 | 20 | classes = loaded_model.predict_classes(image) 21 | 22 | return classes 23 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | cachetools==4.1.0 2 | decorator==4.3.0 3 | grpcio==1.25.0 4 | gunicorn==20.0.4 5 | h5py==2.9.0 6 | Keras==2.3.1 7 | Keras-Applications==1.0.8 8 | Keras-Preprocessing==1.1.0 9 | numpy==1.18.3 10 | opencv-python==4.2.0.34 11 | packaging==20.3 12 | Pillow==7.1.1 13 | requests==2.23.0 14 | requests-file==1.4.3 15 | scikit-learn==0.22.2.post1 16 | scipy==1.4.1 17 | sklearn==0.0 18 | streamlit==0.58.0 19 | tensorflow==2.0.0 20 | --------------------------------------------------------------------------------