Cainvas
Model Files
Car_damage_prediction.h5
keras
Model
deepSea Compiled Models
Car_damage_prediction.exe
deepSea
Ubuntu

Car Damage Detection using Deep Learning

Credit: AITS Cainvas Community

Photo by Guillaume Kurkdjian on Dribbble

In [1]:
!wget -N "https://cainvas-static.s3.amazonaws.com/media/user_data/cainvas-admin/data_final.zip"
!unzip -qo data_final.zip 
!rm data_final.zip
--2021-08-10 10:34:26--  https://cainvas-static.s3.amazonaws.com/media/user_data/cainvas-admin/data_final.zip
Resolving cainvas-static.s3.amazonaws.com (cainvas-static.s3.amazonaws.com)... 52.219.156.59
Connecting to cainvas-static.s3.amazonaws.com (cainvas-static.s3.amazonaws.com)|52.219.156.59|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 128654048 (123M) [application/x-zip-compressed]
Saving to: ‘data_final.zip’

data_final.zip      100%[===================>] 122.69M  69.0MB/s    in 1.8s    

2021-08-10 10:34:28 (69.0 MB/s) - ‘data_final.zip’ saved [128654048/128654048]

Importing prerequisites

In [2]:
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping,ReduceLROnPlateau,LearningRateScheduler
from tensorflow.keras.preprocessing import image as ig
from tensorflow.keras.preprocessing.image import img_to_array
import random

Defining train and test data and performing image augmentation

In [3]:
train_dir = 'data1a/training'
test_dir = 'data1a/validation'
In [4]:
train_data = ImageDataGenerator(rescale = 1./255,shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True)

#defining training set, here size of image is reduced to 150x150, batch of images is kept as 128 and class is defined as 'categorical'.
training_set = train_data.flow_from_directory(train_dir, batch_size = 32, target_size = (64,64), class_mode = 'categorical')
Found 1840 images belonging to 2 classes.
In [5]:
#applying same scale as training set, but only feature scaling is applied. image augmentation is avoided to prevent leakage of testing data.
test_data = ImageDataGenerator(rescale = 1./255)

#defining testing set
testing_set = test_data.flow_from_directory(test_dir, batch_size = 32, target_size = (64,64), class_mode = 'categorical')
Found 460 images belonging to 2 classes.

Defining model callbacks

In [6]:
checkpoint = ModelCheckpoint(
    './base.model',
    monitor='val_accuracy',
    verbose=1,
    save_best_only=True,
    mode='max',
    save_weights_only=False,
    save_frequency=1
)
earlystop = EarlyStopping(
    monitor='val_loss',
    min_delta=0.001,
    patience=50,
    verbose=1,
    mode='auto'
)

opt1 = tf.keras.optimizers.Adam()

callbacks = [checkpoint,earlystop]

Model architecture

Using the Adam optimizer and categorical cross entropy as a loss function. The model was trained for 100 epochs and achieved a validation accuracy of 87%.

In [7]:
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu', input_shape=(64,64,3)),
    tf.keras.layers.MaxPool2D(pool_size=(2,2)),
    tf.keras.layers.Dropout(0.3),
    tf.keras.layers.Conv2D(32, 3, activation='relu'),
    tf.keras.layers.MaxPool2D(pool_size=(2,2)),
    tf.keras.layers.Dropout(0.3),
    tf.keras.layers.Conv2D(32, 3, activation='relu'),
    tf.keras.layers.MaxPool2D(pool_size=(2,2)),
    tf.keras.layers.Dropout(0.3),
    tf.keras.layers.Conv2D(32, 3, activation='relu'),
    tf.keras.layers.MaxPool2D(pool_size=(2,2)),
    tf.keras.layers.Dropout(0.3),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(2, activation='softmax')
])

model.summary()

# Compile the model
model.compile(loss=tf.keras.losses.CategoricalCrossentropy(),
              optimizer=opt1,
              metrics=['accuracy'])

# Fit the model
history = model.fit(training_set,
                    epochs=100,
                    steps_per_epoch=len(training_set),
                    validation_data=testing_set,
                    validation_steps=len(testing_set),
                    callbacks=callbacks)
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 62, 62, 32)        896       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 31, 31, 32)        0         
_________________________________________________________________
dropout (Dropout)            (None, 31, 31, 32)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 29, 29, 32)        9248      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 14, 14, 32)        0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 14, 14, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 12, 12, 32)        9248      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 6, 6, 32)          0         
_________________________________________________________________
dropout_2 (Dropout)          (None, 6, 6, 32)          0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 4, 4, 32)          9248      
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 2, 2, 32)          0         
_________________________________________________________________
dropout_3 (Dropout)          (None, 2, 2, 32)          0         
_________________________________________________________________
flatten (Flatten)            (None, 128)               0         
_________________________________________________________________
dense (Dense)                (None, 64)                8256      
_________________________________________________________________
dropout_4 (Dropout)          (None, 64)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 2)                 130       
=================================================================
Total params: 37,026
Trainable params: 37,026
Non-trainable params: 0
_________________________________________________________________
Epoch 1/100
58/58 [==============================] - ETA: 0s - loss: 0.7020 - accuracy: 0.5071
Epoch 00001: val_accuracy improved from -inf to 0.50000, saving model to ./base.model
WARNING:tensorflow:From /opt/tljh/user/lib/python3.7/site-packages/tensorflow/python/training/tracking/tracking.py:111: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
WARNING:tensorflow:From /opt/tljh/user/lib/python3.7/site-packages/tensorflow/python/training/tracking/tracking.py:111: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 10s 165ms/step - loss: 0.7020 - accuracy: 0.5071 - val_loss: 0.6924 - val_accuracy: 0.5000
Epoch 2/100
58/58 [==============================] - ETA: 0s - loss: 0.6936 - accuracy: 0.5114
Epoch 00002: val_accuracy improved from 0.50000 to 0.50435, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 158ms/step - loss: 0.6936 - accuracy: 0.5114 - val_loss: 0.6927 - val_accuracy: 0.5043
Epoch 3/100
58/58 [==============================] - ETA: 0s - loss: 0.6892 - accuracy: 0.5451
Epoch 00003: val_accuracy improved from 0.50435 to 0.55217, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 161ms/step - loss: 0.6892 - accuracy: 0.5451 - val_loss: 0.6848 - val_accuracy: 0.5522
Epoch 4/100
58/58 [==============================] - ETA: 0s - loss: 0.6754 - accuracy: 0.5701
Epoch 00004: val_accuracy improved from 0.55217 to 0.58261, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 159ms/step - loss: 0.6754 - accuracy: 0.5701 - val_loss: 0.6734 - val_accuracy: 0.5826
Epoch 5/100
58/58 [==============================] - ETA: 0s - loss: 0.6488 - accuracy: 0.6522
Epoch 00005: val_accuracy improved from 0.58261 to 0.68043, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 162ms/step - loss: 0.6488 - accuracy: 0.6522 - val_loss: 0.6251 - val_accuracy: 0.6804
Epoch 6/100
58/58 [==============================] - ETA: 0s - loss: 0.6217 - accuracy: 0.6641
Epoch 00006: val_accuracy did not improve from 0.68043
58/58 [==============================] - 8s 141ms/step - loss: 0.6217 - accuracy: 0.6641 - val_loss: 0.6173 - val_accuracy: 0.6804
Epoch 7/100
58/58 [==============================] - ETA: 0s - loss: 0.6004 - accuracy: 0.6864
Epoch 00007: val_accuracy improved from 0.68043 to 0.68478, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 158ms/step - loss: 0.6004 - accuracy: 0.6864 - val_loss: 0.5948 - val_accuracy: 0.6848
Epoch 8/100
58/58 [==============================] - ETA: 0s - loss: 0.5976 - accuracy: 0.6772
Epoch 00008: val_accuracy improved from 0.68478 to 0.70652, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 159ms/step - loss: 0.5976 - accuracy: 0.6772 - val_loss: 0.5770 - val_accuracy: 0.7065
Epoch 9/100
58/58 [==============================] - ETA: 0s - loss: 0.5987 - accuracy: 0.6967
Epoch 00009: val_accuracy did not improve from 0.70652
58/58 [==============================] - 8s 141ms/step - loss: 0.5987 - accuracy: 0.6967 - val_loss: 0.5696 - val_accuracy: 0.7065
Epoch 10/100
58/58 [==============================] - ETA: 0s - loss: 0.5829 - accuracy: 0.6929
Epoch 00010: val_accuracy improved from 0.70652 to 0.71087, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 161ms/step - loss: 0.5829 - accuracy: 0.6929 - val_loss: 0.5598 - val_accuracy: 0.7109
Epoch 11/100
58/58 [==============================] - ETA: 0s - loss: 0.5767 - accuracy: 0.7016
Epoch 00011: val_accuracy did not improve from 0.71087
58/58 [==============================] - 8s 139ms/step - loss: 0.5767 - accuracy: 0.7016 - val_loss: 0.5626 - val_accuracy: 0.7065
Epoch 12/100
58/58 [==============================] - ETA: 0s - loss: 0.5718 - accuracy: 0.7022
Epoch 00012: val_accuracy improved from 0.71087 to 0.72391, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 159ms/step - loss: 0.5718 - accuracy: 0.7022 - val_loss: 0.5386 - val_accuracy: 0.7239
Epoch 13/100
58/58 [==============================] - ETA: 0s - loss: 0.5651 - accuracy: 0.7266
Epoch 00013: val_accuracy improved from 0.72391 to 0.72826, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 161ms/step - loss: 0.5651 - accuracy: 0.7266 - val_loss: 0.5302 - val_accuracy: 0.7283
Epoch 14/100
58/58 [==============================] - ETA: 0s - loss: 0.5651 - accuracy: 0.7016
Epoch 00014: val_accuracy improved from 0.72826 to 0.75217, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 159ms/step - loss: 0.5651 - accuracy: 0.7016 - val_loss: 0.5210 - val_accuracy: 0.7522
Epoch 15/100
58/58 [==============================] - ETA: 0s - loss: 0.5405 - accuracy: 0.7310
Epoch 00015: val_accuracy improved from 0.75217 to 0.76739, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 161ms/step - loss: 0.5405 - accuracy: 0.7310 - val_loss: 0.5000 - val_accuracy: 0.7674
Epoch 16/100
58/58 [==============================] - ETA: 0s - loss: 0.5559 - accuracy: 0.7201
Epoch 00016: val_accuracy did not improve from 0.76739
58/58 [==============================] - 8s 141ms/step - loss: 0.5559 - accuracy: 0.7201 - val_loss: 0.5094 - val_accuracy: 0.7609
Epoch 17/100
58/58 [==============================] - ETA: 0s - loss: 0.5399 - accuracy: 0.7299
Epoch 00017: val_accuracy improved from 0.76739 to 0.77826, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 160ms/step - loss: 0.5399 - accuracy: 0.7299 - val_loss: 0.4993 - val_accuracy: 0.7783
Epoch 18/100
58/58 [==============================] - ETA: 0s - loss: 0.5329 - accuracy: 0.7391
Epoch 00018: val_accuracy did not improve from 0.77826
58/58 [==============================] - 8s 140ms/step - loss: 0.5329 - accuracy: 0.7391 - val_loss: 0.5205 - val_accuracy: 0.7609
Epoch 19/100
58/58 [==============================] - ETA: 0s - loss: 0.5353 - accuracy: 0.7370
Epoch 00019: val_accuracy did not improve from 0.77826
58/58 [==============================] - 8s 137ms/step - loss: 0.5353 - accuracy: 0.7370 - val_loss: 0.4972 - val_accuracy: 0.7696
Epoch 20/100
58/58 [==============================] - ETA: 0s - loss: 0.5178 - accuracy: 0.7451
Epoch 00020: val_accuracy did not improve from 0.77826
58/58 [==============================] - 8s 141ms/step - loss: 0.5178 - accuracy: 0.7451 - val_loss: 0.4899 - val_accuracy: 0.7717
Epoch 21/100
58/58 [==============================] - ETA: 0s - loss: 0.5243 - accuracy: 0.7413
Epoch 00021: val_accuracy did not improve from 0.77826
58/58 [==============================] - 8s 140ms/step - loss: 0.5243 - accuracy: 0.7413 - val_loss: 0.4744 - val_accuracy: 0.7761
Epoch 22/100
58/58 [==============================] - ETA: 0s - loss: 0.5084 - accuracy: 0.7576
Epoch 00022: val_accuracy improved from 0.77826 to 0.79130, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 158ms/step - loss: 0.5084 - accuracy: 0.7576 - val_loss: 0.4628 - val_accuracy: 0.7913
Epoch 23/100
58/58 [==============================] - ETA: 0s - loss: 0.5052 - accuracy: 0.7679
Epoch 00023: val_accuracy did not improve from 0.79130
58/58 [==============================] - 8s 141ms/step - loss: 0.5052 - accuracy: 0.7679 - val_loss: 0.4962 - val_accuracy: 0.7391
Epoch 24/100
58/58 [==============================] - ETA: 0s - loss: 0.5040 - accuracy: 0.7571
Epoch 00024: val_accuracy improved from 0.79130 to 0.80217, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 161ms/step - loss: 0.5040 - accuracy: 0.7571 - val_loss: 0.4567 - val_accuracy: 0.8022
Epoch 25/100
58/58 [==============================] - ETA: 0s - loss: 0.5036 - accuracy: 0.7652
Epoch 00025: val_accuracy did not improve from 0.80217
58/58 [==============================] - 8s 140ms/step - loss: 0.5036 - accuracy: 0.7652 - val_loss: 0.4828 - val_accuracy: 0.7739
Epoch 26/100
58/58 [==============================] - ETA: 0s - loss: 0.4846 - accuracy: 0.7723
Epoch 00026: val_accuracy did not improve from 0.80217
58/58 [==============================] - 8s 141ms/step - loss: 0.4846 - accuracy: 0.7723 - val_loss: 0.4715 - val_accuracy: 0.7913
Epoch 27/100
58/58 [==============================] - ETA: 0s - loss: 0.4819 - accuracy: 0.7772
Epoch 00027: val_accuracy improved from 0.80217 to 0.80870, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 159ms/step - loss: 0.4819 - accuracy: 0.7772 - val_loss: 0.4569 - val_accuracy: 0.8087
Epoch 28/100
58/58 [==============================] - ETA: 0s - loss: 0.5042 - accuracy: 0.7679
Epoch 00028: val_accuracy did not improve from 0.80870
58/58 [==============================] - 8s 141ms/step - loss: 0.5042 - accuracy: 0.7679 - val_loss: 0.4529 - val_accuracy: 0.8087
Epoch 29/100
58/58 [==============================] - ETA: 0s - loss: 0.4784 - accuracy: 0.7832
Epoch 00029: val_accuracy did not improve from 0.80870
58/58 [==============================] - 8s 140ms/step - loss: 0.4784 - accuracy: 0.7832 - val_loss: 0.5091 - val_accuracy: 0.7543
Epoch 30/100
58/58 [==============================] - ETA: 0s - loss: 0.4804 - accuracy: 0.7837
Epoch 00030: val_accuracy did not improve from 0.80870
58/58 [==============================] - 8s 140ms/step - loss: 0.4804 - accuracy: 0.7837 - val_loss: 0.4640 - val_accuracy: 0.7913
Epoch 31/100
58/58 [==============================] - ETA: 0s - loss: 0.4664 - accuracy: 0.7935
Epoch 00031: val_accuracy improved from 0.80870 to 0.82826, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 161ms/step - loss: 0.4664 - accuracy: 0.7935 - val_loss: 0.4335 - val_accuracy: 0.8283
Epoch 32/100
58/58 [==============================] - ETA: 0s - loss: 0.4621 - accuracy: 0.7935
Epoch 00032: val_accuracy did not improve from 0.82826
58/58 [==============================] - 8s 140ms/step - loss: 0.4621 - accuracy: 0.7935 - val_loss: 0.4248 - val_accuracy: 0.8283
Epoch 33/100
58/58 [==============================] - ETA: 0s - loss: 0.4881 - accuracy: 0.7717
Epoch 00033: val_accuracy did not improve from 0.82826
58/58 [==============================] - 8s 141ms/step - loss: 0.4881 - accuracy: 0.7717 - val_loss: 0.4479 - val_accuracy: 0.8043
Epoch 34/100
58/58 [==============================] - ETA: 0s - loss: 0.4571 - accuracy: 0.7978
Epoch 00034: val_accuracy improved from 0.82826 to 0.83478, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 160ms/step - loss: 0.4571 - accuracy: 0.7978 - val_loss: 0.4239 - val_accuracy: 0.8348
Epoch 35/100
58/58 [==============================] - ETA: 0s - loss: 0.4524 - accuracy: 0.7940
Epoch 00035: val_accuracy did not improve from 0.83478
58/58 [==============================] - 8s 140ms/step - loss: 0.4524 - accuracy: 0.7940 - val_loss: 0.4817 - val_accuracy: 0.7826
Epoch 36/100
58/58 [==============================] - ETA: 0s - loss: 0.4478 - accuracy: 0.8005
Epoch 00036: val_accuracy did not improve from 0.83478
58/58 [==============================] - 8s 141ms/step - loss: 0.4478 - accuracy: 0.8005 - val_loss: 0.4585 - val_accuracy: 0.8022
Epoch 37/100
58/58 [==============================] - ETA: 0s - loss: 0.4493 - accuracy: 0.7940
Epoch 00037: val_accuracy did not improve from 0.83478
58/58 [==============================] - 8s 141ms/step - loss: 0.4493 - accuracy: 0.7940 - val_loss: 0.4595 - val_accuracy: 0.8000
Epoch 38/100
58/58 [==============================] - ETA: 0s - loss: 0.4602 - accuracy: 0.7935
Epoch 00038: val_accuracy did not improve from 0.83478
58/58 [==============================] - 8s 141ms/step - loss: 0.4602 - accuracy: 0.7935 - val_loss: 0.4566 - val_accuracy: 0.7978
Epoch 39/100
58/58 [==============================] - ETA: 0s - loss: 0.4312 - accuracy: 0.8011
Epoch 00039: val_accuracy did not improve from 0.83478
58/58 [==============================] - 8s 141ms/step - loss: 0.4312 - accuracy: 0.8011 - val_loss: 0.4259 - val_accuracy: 0.8239
Epoch 40/100
58/58 [==============================] - ETA: 0s - loss: 0.4388 - accuracy: 0.7978
Epoch 00040: val_accuracy did not improve from 0.83478
58/58 [==============================] - 8s 141ms/step - loss: 0.4388 - accuracy: 0.7978 - val_loss: 0.4826 - val_accuracy: 0.7826
Epoch 41/100
58/58 [==============================] - ETA: 0s - loss: 0.4494 - accuracy: 0.8033
Epoch 00041: val_accuracy improved from 0.83478 to 0.84565, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 161ms/step - loss: 0.4494 - accuracy: 0.8033 - val_loss: 0.3944 - val_accuracy: 0.8457
Epoch 42/100
58/58 [==============================] - ETA: 0s - loss: 0.4140 - accuracy: 0.8174
Epoch 00042: val_accuracy did not improve from 0.84565
58/58 [==============================] - 8s 140ms/step - loss: 0.4140 - accuracy: 0.8174 - val_loss: 0.4058 - val_accuracy: 0.8326
Epoch 43/100
58/58 [==============================] - ETA: 0s - loss: 0.4202 - accuracy: 0.8130
Epoch 00043: val_accuracy did not improve from 0.84565
58/58 [==============================] - 8s 141ms/step - loss: 0.4202 - accuracy: 0.8130 - val_loss: 0.4116 - val_accuracy: 0.8261
Epoch 44/100
58/58 [==============================] - ETA: 0s - loss: 0.4246 - accuracy: 0.8125
Epoch 00044: val_accuracy did not improve from 0.84565
58/58 [==============================] - 8s 142ms/step - loss: 0.4246 - accuracy: 0.8125 - val_loss: 0.4087 - val_accuracy: 0.8283
Epoch 45/100
58/58 [==============================] - ETA: 0s - loss: 0.4157 - accuracy: 0.8168
Epoch 00045: val_accuracy did not improve from 0.84565
58/58 [==============================] - 8s 140ms/step - loss: 0.4157 - accuracy: 0.8168 - val_loss: 0.4046 - val_accuracy: 0.8413
Epoch 46/100
58/58 [==============================] - ETA: 0s - loss: 0.4216 - accuracy: 0.8092
Epoch 00046: val_accuracy did not improve from 0.84565
58/58 [==============================] - 8s 141ms/step - loss: 0.4216 - accuracy: 0.8092 - val_loss: 0.4137 - val_accuracy: 0.8304
Epoch 47/100
58/58 [==============================] - ETA: 0s - loss: 0.3976 - accuracy: 0.8332
Epoch 00047: val_accuracy did not improve from 0.84565
58/58 [==============================] - 8s 141ms/step - loss: 0.3976 - accuracy: 0.8332 - val_loss: 0.4497 - val_accuracy: 0.7935
Epoch 48/100
58/58 [==============================] - ETA: 0s - loss: 0.4101 - accuracy: 0.8239
Epoch 00048: val_accuracy did not improve from 0.84565
58/58 [==============================] - 8s 141ms/step - loss: 0.4101 - accuracy: 0.8239 - val_loss: 0.3929 - val_accuracy: 0.8435
Epoch 49/100
58/58 [==============================] - ETA: 0s - loss: 0.4161 - accuracy: 0.8136
Epoch 00049: val_accuracy improved from 0.84565 to 0.84783, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 159ms/step - loss: 0.4161 - accuracy: 0.8136 - val_loss: 0.3777 - val_accuracy: 0.8478
Epoch 50/100
58/58 [==============================] - ETA: 0s - loss: 0.4066 - accuracy: 0.8190
Epoch 00050: val_accuracy did not improve from 0.84783
58/58 [==============================] - 8s 142ms/step - loss: 0.4066 - accuracy: 0.8190 - val_loss: 0.3827 - val_accuracy: 0.8370
Epoch 51/100
58/58 [==============================] - ETA: 0s - loss: 0.4053 - accuracy: 0.8196
Epoch 00051: val_accuracy improved from 0.84783 to 0.85652, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 160ms/step - loss: 0.4053 - accuracy: 0.8196 - val_loss: 0.3707 - val_accuracy: 0.8565
Epoch 52/100
58/58 [==============================] - ETA: 0s - loss: 0.4009 - accuracy: 0.8272
Epoch 00052: val_accuracy did not improve from 0.85652
58/58 [==============================] - 8s 140ms/step - loss: 0.4009 - accuracy: 0.8272 - val_loss: 0.4127 - val_accuracy: 0.8413
Epoch 53/100
58/58 [==============================] - ETA: 0s - loss: 0.3985 - accuracy: 0.8283
Epoch 00053: val_accuracy did not improve from 0.85652
58/58 [==============================] - 8s 142ms/step - loss: 0.3985 - accuracy: 0.8283 - val_loss: 0.3895 - val_accuracy: 0.8457
Epoch 54/100
58/58 [==============================] - ETA: 0s - loss: 0.4029 - accuracy: 0.8321
Epoch 00054: val_accuracy did not improve from 0.85652
58/58 [==============================] - 8s 143ms/step - loss: 0.4029 - accuracy: 0.8321 - val_loss: 0.3775 - val_accuracy: 0.8500
Epoch 55/100
58/58 [==============================] - ETA: 0s - loss: 0.4075 - accuracy: 0.8190
Epoch 00055: val_accuracy did not improve from 0.85652
58/58 [==============================] - 8s 142ms/step - loss: 0.4075 - accuracy: 0.8190 - val_loss: 0.3792 - val_accuracy: 0.8522
Epoch 56/100
58/58 [==============================] - ETA: 0s - loss: 0.3907 - accuracy: 0.8261
Epoch 00056: val_accuracy did not improve from 0.85652
58/58 [==============================] - 8s 141ms/step - loss: 0.3907 - accuracy: 0.8261 - val_loss: 0.4018 - val_accuracy: 0.8239
Epoch 57/100
58/58 [==============================] - ETA: 0s - loss: 0.3830 - accuracy: 0.8353
Epoch 00057: val_accuracy did not improve from 0.85652
58/58 [==============================] - 8s 142ms/step - loss: 0.3830 - accuracy: 0.8353 - val_loss: 0.4276 - val_accuracy: 0.8239
Epoch 58/100
58/58 [==============================] - ETA: 0s - loss: 0.3824 - accuracy: 0.8310
Epoch 00058: val_accuracy did not improve from 0.85652
58/58 [==============================] - 8s 142ms/step - loss: 0.3824 - accuracy: 0.8310 - val_loss: 0.3590 - val_accuracy: 0.8565
Epoch 59/100
58/58 [==============================] - ETA: 0s - loss: 0.3714 - accuracy: 0.8283
Epoch 00059: val_accuracy did not improve from 0.85652
58/58 [==============================] - 8s 141ms/step - loss: 0.3714 - accuracy: 0.8283 - val_loss: 0.3567 - val_accuracy: 0.8435
Epoch 60/100
58/58 [==============================] - ETA: 0s - loss: 0.3981 - accuracy: 0.8283
Epoch 00060: val_accuracy did not improve from 0.85652
58/58 [==============================] - 8s 141ms/step - loss: 0.3981 - accuracy: 0.8283 - val_loss: 0.3699 - val_accuracy: 0.8565
Epoch 61/100
58/58 [==============================] - ETA: 0s - loss: 0.3871 - accuracy: 0.8429
Epoch 00061: val_accuracy did not improve from 0.85652
58/58 [==============================] - 8s 141ms/step - loss: 0.3871 - accuracy: 0.8429 - val_loss: 0.3784 - val_accuracy: 0.8565
Epoch 62/100
58/58 [==============================] - ETA: 0s - loss: 0.3897 - accuracy: 0.8364
Epoch 00062: val_accuracy did not improve from 0.85652
58/58 [==============================] - 8s 141ms/step - loss: 0.3897 - accuracy: 0.8364 - val_loss: 0.3703 - val_accuracy: 0.8543
Epoch 63/100
58/58 [==============================] - ETA: 0s - loss: 0.3681 - accuracy: 0.8435
Epoch 00063: val_accuracy improved from 0.85652 to 0.86087, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 159ms/step - loss: 0.3681 - accuracy: 0.8435 - val_loss: 0.3618 - val_accuracy: 0.8609
Epoch 64/100
58/58 [==============================] - ETA: 0s - loss: 0.3721 - accuracy: 0.8424
Epoch 00064: val_accuracy did not improve from 0.86087
58/58 [==============================] - 8s 138ms/step - loss: 0.3721 - accuracy: 0.8424 - val_loss: 0.4078 - val_accuracy: 0.8348
Epoch 65/100
58/58 [==============================] - ETA: 0s - loss: 0.3916 - accuracy: 0.8337
Epoch 00065: val_accuracy did not improve from 0.86087
58/58 [==============================] - 8s 140ms/step - loss: 0.3916 - accuracy: 0.8337 - val_loss: 0.4044 - val_accuracy: 0.8326
Epoch 66/100
58/58 [==============================] - ETA: 0s - loss: 0.3858 - accuracy: 0.8359
Epoch 00066: val_accuracy did not improve from 0.86087
58/58 [==============================] - 8s 141ms/step - loss: 0.3858 - accuracy: 0.8359 - val_loss: 0.3903 - val_accuracy: 0.8261
Epoch 67/100
58/58 [==============================] - ETA: 0s - loss: 0.3653 - accuracy: 0.8543
Epoch 00067: val_accuracy did not improve from 0.86087
58/58 [==============================] - 8s 141ms/step - loss: 0.3653 - accuracy: 0.8543 - val_loss: 0.3675 - val_accuracy: 0.8565
Epoch 68/100
58/58 [==============================] - ETA: 0s - loss: 0.3898 - accuracy: 0.8359
Epoch 00068: val_accuracy did not improve from 0.86087
58/58 [==============================] - 8s 141ms/step - loss: 0.3898 - accuracy: 0.8359 - val_loss: 0.3576 - val_accuracy: 0.8565
Epoch 69/100
58/58 [==============================] - ETA: 0s - loss: 0.3753 - accuracy: 0.8440
Epoch 00069: val_accuracy improved from 0.86087 to 0.86304, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 159ms/step - loss: 0.3753 - accuracy: 0.8440 - val_loss: 0.3522 - val_accuracy: 0.8630
Epoch 70/100
58/58 [==============================] - ETA: 0s - loss: 0.3828 - accuracy: 0.8364
Epoch 00070: val_accuracy did not improve from 0.86304
58/58 [==============================] - 8s 142ms/step - loss: 0.3828 - accuracy: 0.8364 - val_loss: 0.3614 - val_accuracy: 0.8478
Epoch 71/100
58/58 [==============================] - ETA: 0s - loss: 0.3688 - accuracy: 0.8391
Epoch 00071: val_accuracy did not improve from 0.86304
58/58 [==============================] - 8s 139ms/step - loss: 0.3688 - accuracy: 0.8391 - val_loss: 0.3711 - val_accuracy: 0.8609
Epoch 72/100
58/58 [==============================] - ETA: 0s - loss: 0.3765 - accuracy: 0.8429
Epoch 00072: val_accuracy did not improve from 0.86304
58/58 [==============================] - 8s 141ms/step - loss: 0.3765 - accuracy: 0.8429 - val_loss: 0.3818 - val_accuracy: 0.8522
Epoch 73/100
58/58 [==============================] - ETA: 0s - loss: 0.3767 - accuracy: 0.8391
Epoch 00073: val_accuracy did not improve from 0.86304
58/58 [==============================] - 8s 141ms/step - loss: 0.3767 - accuracy: 0.8391 - val_loss: 0.3935 - val_accuracy: 0.8478
Epoch 74/100
58/58 [==============================] - ETA: 0s - loss: 0.3726 - accuracy: 0.8413
Epoch 00074: val_accuracy did not improve from 0.86304
58/58 [==============================] - 8s 142ms/step - loss: 0.3726 - accuracy: 0.8413 - val_loss: 0.3570 - val_accuracy: 0.8565
Epoch 75/100
58/58 [==============================] - ETA: 0s - loss: 0.3504 - accuracy: 0.8511
Epoch 00075: val_accuracy improved from 0.86304 to 0.87826, saving model to ./base.model
INFO:tensorflow:Assets written to: ./base.model/assets
58/58 [==============================] - 9s 161ms/step - loss: 0.3504 - accuracy: 0.8511 - val_loss: 0.3437 - val_accuracy: 0.8783
Epoch 76/100
58/58 [==============================] - ETA: 0s - loss: 0.3840 - accuracy: 0.8391
Epoch 00076: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3840 - accuracy: 0.8391 - val_loss: 0.4247 - val_accuracy: 0.8283
Epoch 77/100
58/58 [==============================] - ETA: 0s - loss: 0.3798 - accuracy: 0.8408
Epoch 00077: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3798 - accuracy: 0.8408 - val_loss: 0.3344 - val_accuracy: 0.8652
Epoch 78/100
58/58 [==============================] - ETA: 0s - loss: 0.3768 - accuracy: 0.8435
Epoch 00078: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 142ms/step - loss: 0.3768 - accuracy: 0.8435 - val_loss: 0.3332 - val_accuracy: 0.8630
Epoch 79/100
58/58 [==============================] - ETA: 0s - loss: 0.3602 - accuracy: 0.8473
Epoch 00079: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3602 - accuracy: 0.8473 - val_loss: 0.3376 - val_accuracy: 0.8565
Epoch 80/100
58/58 [==============================] - ETA: 0s - loss: 0.3585 - accuracy: 0.8511
Epoch 00080: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3585 - accuracy: 0.8511 - val_loss: 0.3774 - val_accuracy: 0.8413
Epoch 81/100
58/58 [==============================] - ETA: 0s - loss: 0.3666 - accuracy: 0.8505
Epoch 00081: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3666 - accuracy: 0.8505 - val_loss: 0.3419 - val_accuracy: 0.8587
Epoch 82/100
58/58 [==============================] - ETA: 0s - loss: 0.3520 - accuracy: 0.8495
Epoch 00082: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3520 - accuracy: 0.8495 - val_loss: 0.4101 - val_accuracy: 0.8283
Epoch 83/100
58/58 [==============================] - ETA: 0s - loss: 0.3650 - accuracy: 0.8446
Epoch 00083: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 142ms/step - loss: 0.3650 - accuracy: 0.8446 - val_loss: 0.3702 - val_accuracy: 0.8500
Epoch 84/100
58/58 [==============================] - ETA: 0s - loss: 0.3578 - accuracy: 0.8489
Epoch 00084: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3578 - accuracy: 0.8489 - val_loss: 0.3724 - val_accuracy: 0.8565
Epoch 85/100
58/58 [==============================] - ETA: 0s - loss: 0.3634 - accuracy: 0.8462
Epoch 00085: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3634 - accuracy: 0.8462 - val_loss: 0.3460 - val_accuracy: 0.8609
Epoch 86/100
58/58 [==============================] - ETA: 0s - loss: 0.3520 - accuracy: 0.8527
Epoch 00086: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3520 - accuracy: 0.8527 - val_loss: 0.3679 - val_accuracy: 0.8522
Epoch 87/100
58/58 [==============================] - ETA: 0s - loss: 0.3502 - accuracy: 0.8565
Epoch 00087: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3502 - accuracy: 0.8565 - val_loss: 0.3691 - val_accuracy: 0.8478
Epoch 88/100
58/58 [==============================] - ETA: 0s - loss: 0.3455 - accuracy: 0.8603
Epoch 00088: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3455 - accuracy: 0.8603 - val_loss: 0.3438 - val_accuracy: 0.8500
Epoch 89/100
58/58 [==============================] - ETA: 0s - loss: 0.3391 - accuracy: 0.8505
Epoch 00089: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3391 - accuracy: 0.8505 - val_loss: 0.3889 - val_accuracy: 0.8370
Epoch 90/100
58/58 [==============================] - ETA: 0s - loss: 0.3460 - accuracy: 0.8630
Epoch 00090: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3460 - accuracy: 0.8630 - val_loss: 0.3780 - val_accuracy: 0.8435
Epoch 91/100
58/58 [==============================] - ETA: 0s - loss: 0.3474 - accuracy: 0.8500
Epoch 00091: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 142ms/step - loss: 0.3474 - accuracy: 0.8500 - val_loss: 0.3421 - val_accuracy: 0.8500
Epoch 92/100
58/58 [==============================] - ETA: 0s - loss: 0.3691 - accuracy: 0.8495
Epoch 00092: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3691 - accuracy: 0.8495 - val_loss: 0.3335 - val_accuracy: 0.8609
Epoch 93/100
58/58 [==============================] - ETA: 0s - loss: 0.3333 - accuracy: 0.8505
Epoch 00093: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 140ms/step - loss: 0.3333 - accuracy: 0.8505 - val_loss: 0.3362 - val_accuracy: 0.8565
Epoch 94/100
58/58 [==============================] - ETA: 0s - loss: 0.3292 - accuracy: 0.8587
Epoch 00094: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3292 - accuracy: 0.8587 - val_loss: 0.3545 - val_accuracy: 0.8587
Epoch 95/100
58/58 [==============================] - ETA: 0s - loss: 0.3644 - accuracy: 0.8516
Epoch 00095: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3644 - accuracy: 0.8516 - val_loss: 0.3245 - val_accuracy: 0.8609
Epoch 96/100
58/58 [==============================] - ETA: 0s - loss: 0.3661 - accuracy: 0.8391
Epoch 00096: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3661 - accuracy: 0.8391 - val_loss: 0.3640 - val_accuracy: 0.8457
Epoch 97/100
58/58 [==============================] - ETA: 0s - loss: 0.3336 - accuracy: 0.8587
Epoch 00097: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3336 - accuracy: 0.8587 - val_loss: 0.3587 - val_accuracy: 0.8543
Epoch 98/100
58/58 [==============================] - ETA: 0s - loss: 0.3501 - accuracy: 0.8516
Epoch 00098: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3501 - accuracy: 0.8516 - val_loss: 0.3728 - val_accuracy: 0.8500
Epoch 99/100
58/58 [==============================] - ETA: 0s - loss: 0.3429 - accuracy: 0.8538
Epoch 00099: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3429 - accuracy: 0.8538 - val_loss: 0.3426 - val_accuracy: 0.8587
Epoch 100/100
58/58 [==============================] - ETA: 0s - loss: 0.3318 - accuracy: 0.8603
Epoch 00100: val_accuracy did not improve from 0.87826
58/58 [==============================] - 8s 141ms/step - loss: 0.3318 - accuracy: 0.8603 - val_loss: 0.3542 - val_accuracy: 0.8543

Function to plot model metrics

In [8]:
def show_final_history(history):
    fig, ax = plt.subplots(1, 2, figsize=(15,5))
    ax[0].set_title('loss')
    ax[0].plot(history.epoch, history.history["loss"], label="Train loss")
    ax[0].plot(history.epoch, history.history["val_loss"], label="Validation loss")
    ax[1].set_title('acc')
    ax[1].plot(history.epoch, history.history["accuracy"], label="Train acc")
    ax[1].plot(history.epoch, history.history["val_accuracy"], label="Validation acc")
    ax[0].legend()
    ax[1].legend()

Loss/Accuracy vs Epoch

In [9]:
show_final_history(history)
model.save("model.h5")
print("Weights Saved")
Weights Saved

Making predictions on the test images

In [10]:
labels = ["00-damage","01-whole"]

it = iter(testing_set)
batch = next(it) # Gets a batch of 16 test images

fig, axes = plt.subplots(3, 3, figsize=(10,10))
fig.tight_layout()
fig.subplots_adjust(hspace=.25)

for i in range(3):
    for j in range(3):
        ax = axes[i,j]
        image = batch[0][i*3+j]
        net_input = image.reshape((1, 64, 64, 3))
        truth = np.argmax(batch[1][i*3+j])
        prediction = np.argmax(model.predict(net_input))
        ax.set_title('Label: %s\nPrediction: %s' % (labels[truth].capitalize(), labels[prediction].capitalize()))
        ax.imshow(image)

Function to make predictions on custom images

In [11]:
def custom_predictions(path):
    img = ig.load_img(path, target_size=(64, 64))
    plt.imshow(img)
    img = np.expand_dims(img, axis=0)
    img.reshape(1,64,64,3)
    prediction = np.argmax(model.predict(img))
#     result=loaded_model.predict_classes(img)
    plt.title(labels[prediction])
    plt.show()

Displaying predicted label along with the input image

In [12]:
custom_predictions('data1a/training/00-damage/0001.JPEG')
In [13]:
custom_predictions('data1a/training/01-whole/0002.jpg')
In [14]:
model.save('Car_damage_prediction.h5')

DeepCC

In [15]:
!deepCC 'Car_damage_prediction.h5'
[INFO]
Reading [keras model] 'Car_damage_prediction.h5'
[SUCCESS]
Saved 'Car_damage_prediction_deepC/Car_damage_prediction.onnx'
[INFO]
Reading [onnx model] 'Car_damage_prediction_deepC/Car_damage_prediction.onnx'
[INFO]
Model info:
  ir_vesion : 5
  doc       : 
[WARNING]
[ONNX]: terminal (input/output) conv2d_input's shape is less than 1. Changing it to 1.
[WARNING]
[ONNX]: terminal (input/output) dense_1's shape is less than 1. Changing it to 1.
WARN (GRAPH): found operator node with the same name (dense_1) as io node.
[INFO]
Running DNNC graph sanity check ...
[SUCCESS]
Passed sanity check.
[INFO]
Writing C++ file 'Car_damage_prediction_deepC/Car_damage_prediction.cpp'
[INFO]
deepSea model files are ready in 'Car_damage_prediction_deepC/' 
[RUNNING COMMAND]
g++ -std=c++11 -O3 -fno-rtti -fno-exceptions -I. -I/opt/tljh/user/lib/python3.7/site-packages/deepC-0.13-py3.7-linux-x86_64.egg/deepC/include -isystem /opt/tljh/user/lib/python3.7/site-packages/deepC-0.13-py3.7-linux-x86_64.egg/deepC/packages/eigen-eigen-323c052e1731 "Car_damage_prediction_deepC/Car_damage_prediction.cpp" -D_AITS_MAIN -o "Car_damage_prediction_deepC/Car_damage_prediction.exe"
[RUNNING COMMAND]
size "Car_damage_prediction_deepC/Car_damage_prediction.exe"
   text	   data	    bss	    dec	    hex	filename
 328341	   3784	    760	 332885	  51455	Car_damage_prediction_deepC/Car_damage_prediction.exe
[SUCCESS]
Saved model as executable "Car_damage_prediction_deepC/Car_damage_prediction.exe"