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

FISH BREED CLASSIFICATION

Credit: AITS Cainvas Community

Photo by July PJuxa (Puchkova) on Dribbble

IMPORT LIBRARY AND DATA

In [1]:
!pip install wget
import numpy as np 
import pandas as pd
import os
import matplotlib.pyplot as plt
import seaborn as sns
import cv2
from sklearn.model_selection import StratifiedShuffleSplit,train_test_split
import glob
import tensorflow as tf
from sklearn import metrics
from tensorflow import keras
!wget -N 'https://cainvas-static.s3.amazonaws.com/media/user_data/cainvas-admin/fish.tar.gz'
import tarfile
file = tarfile.open('fish.tar.gz')
file.extractall('./')
file.close()
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: wget in ./.local/lib/python3.7/site-packages (3.2)
WARNING: You are using pip version 20.3.1; however, version 21.1.3 is available.
You should consider upgrading via the '/opt/tljh/user/bin/python -m pip install --upgrade pip' command.
--2021-07-13 10:18:37--  https://cainvas-static.s3.amazonaws.com/media/user_data/cainvas-admin/fish.tar.gz
Resolving cainvas-static.s3.amazonaws.com (cainvas-static.s3.amazonaws.com)... 52.219.66.88
Connecting to cainvas-static.s3.amazonaws.com (cainvas-static.s3.amazonaws.com)|52.219.66.88|:443... connected.
HTTP request sent, awaiting response... 304 Not Modified
File ‘fish.tar.gz’ not modified on server. Omitting download.

BASIC ANALYSIS

In [2]:
data = pd.read_csv('fish/data.csv')
display(data)
sns.set_style('darkgrid')
sns.countplot(data = data,y = 'label')
path label
0 fish/Black Sea Sprat/00033.png Black Sea Sprat
1 fish/Black Sea Sprat/00004.png Black Sea Sprat
2 fish/Black Sea Sprat/00023.png Black Sea Sprat
3 fish/Black Sea Sprat/00041.png Black Sea Sprat
4 fish/Black Sea Sprat/00024.png Black Sea Sprat
... ... ...
425 fish/Gilt Head Bream/14.JPG Gilt Head Bream
426 fish/Gilt Head Bream/18.JPG Gilt Head Bream
427 fish/Gilt Head Bream/49.JPG Gilt Head Bream
428 fish/Gilt Head Bream/2.JPG Gilt Head Bream
429 fish/Gilt Head Bream/25.JPG Gilt Head Bream

430 rows × 2 columns

Out[2]:
<AxesSubplot:xlabel='count', ylabel='label'>
In [3]:
def get_img(index):
    img = plt.imread(data.iloc[index]['path'])
    return img
demo = pd.DataFrame(data.groupby('label').first()).reset_index()
fig,ax = plt.subplots(3,3,figsize=(15,15))
for i in range(3):
    for j in range(3):
        ax[i][j].imshow(plt.imread(demo.iloc[i*3+j].path))
        ax[i][j].tick_params(left = False, bottom = False)
        ax[i][j].set_xticks([])
        ax[i][j].set_yticks([])
        ax[i][j].set_title(demo.iloc[i*3+j].label)
display(demo)
fig.savefig('Sample.png')
label path
0 Black Sea Sprat fish/Black Sea Sprat/00033.png
1 Gilt Head Bream fish/Gilt Head Bream/45.JPG
2 Horse Mackerel fish/Horse Mackerel/00033.png
3 Red Mullet fish/Red Mullet/00033.png
4 Red Sea Bream fish/Red Sea Bream/SAM_5577.JPG
5 Sea Bass fish/Sea Bass/45.JPG
6 Shrimp fish/Shrimp/00033.png
7 Striped Red Mullet fish/Striped Red Mullet/00033.png
8 Trout fish/Trout/00004.png

MODEL

In [4]:
def get_model(dim = (288,384,3)):
    keras.backend.clear_session()
    model = keras.models.Sequential()
    model.add(keras.layers.Conv2D(32,(3,3),activation='relu',input_shape=dim))
    model.add(keras.layers.MaxPooling2D((2,2)))
    model.add(keras.layers.Dropout(.4))
    model.add(keras.layers.Conv2D(32,(3,3),activation='relu',padding="valid"))
    model.add(keras.layers.MaxPooling2D((2,2)))
    model.add(keras.layers.Dropout(.4))
    model.add(keras.layers.Conv2D(64,(3,3),activation='relu',padding="valid"))
    model.add(keras.layers.MaxPooling2D((2,2)))
    model.add(keras.layers.Dropout(.4))
    model.add(keras.layers.Conv2D(64,(5,5),activation='relu',padding="valid"))
    model.add(keras.layers.MaxPooling2D((2,2)))
    model.add(keras.layers.Dropout(.4))
    model.add(keras.layers.Conv2D(64,(5,5),activation='relu',padding="valid"))
    model.add(keras.layers.MaxPooling2D((2,2)))
    model.add(keras.layers.Dropout(.4))
    model.add(keras.layers.Flatten()) 
    model.add(keras.layers.Dropout(.4))
    model.add(keras.layers.Dense(9,activation='softmax'))
    model.summary()
    return model
train_val,test = train_test_split(data,stratify=data['label'],test_size=45,shuffle=True)
train,val  = train_test_split(train_val,stratify=train_val['label'],test_size=.25,shuffle=True)
train.reset_index(drop=True,inplace=True)
val.reset_index(drop=True,inplace=True)
test.reset_index(drop=True,inplace=True)
print(len(train),len(val),len(test))
288 97 45
In [5]:
datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1/255.,
                                  horizontal_flip = True,
                                  vertical_flip=True,)
datagen_scale = keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
train_generator= datagen.flow_from_dataframe(train,x_col ='path',y_col='label',target_size=(288,384),batch_size=32,shuffle=True)
valid_generator= datagen.flow_from_dataframe(val,x_col ='path',y_col='label',target_size=(288,384),shuffle=False)
test_generator = datagen.flow_from_dataframe(test,x_col ='path',y_col='label',target_size=(288,384),shuffle=False)
Found 288 validated image filenames belonging to 9 classes.
Found 97 validated image filenames belonging to 9 classes.
Found 45 validated image filenames belonging to 9 classes.
In [6]:
model = get_model()
model.compile(loss='categorical_crossentropy',metrics='accuracy',optimizer=keras.optimizers.Adam(learning_rate=.0008))
early_stop = keras.callbacks.EarlyStopping(monitor= 'val_accuracy',patience=12,restore_best_weights=True)
red_lr = keras.callbacks.ReduceLROnPlateau(patience=4,monitor= 'val_accuracy',factor=0.75)
model_check = keras.callbacks.ModelCheckpoint(f"fishes.h5",save_best_only=True)
history = model.fit(train_generator,validation_data=valid_generator,epochs=200,callbacks = [early_stop,model_check,red_lr])
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 286, 382, 32)      896       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 143, 191, 32)      0         
_________________________________________________________________
dropout (Dropout)            (None, 143, 191, 32)      0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 141, 189, 32)      9248      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 70, 94, 32)        0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 70, 94, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 68, 92, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 34, 46, 64)        0         
_________________________________________________________________
dropout_2 (Dropout)          (None, 34, 46, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 30, 42, 64)        102464    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 15, 21, 64)        0         
_________________________________________________________________
dropout_3 (Dropout)          (None, 15, 21, 64)        0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 11, 17, 64)        102464    
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 5, 8, 64)          0         
_________________________________________________________________
dropout_4 (Dropout)          (None, 5, 8, 64)          0         
_________________________________________________________________
flatten (Flatten)            (None, 2560)              0         
_________________________________________________________________
dropout_5 (Dropout)          (None, 2560)              0         
_________________________________________________________________
dense (Dense)                (None, 9)                 23049     
=================================================================
Total params: 256,617
Trainable params: 256,617
Non-trainable params: 0
_________________________________________________________________
Epoch 1/200
9/9 [==============================] - 2s 271ms/step - loss: 2.3557 - accuracy: 0.0764 - val_loss: 2.1962 - val_accuracy: 0.1134
Epoch 2/200
9/9 [==============================] - 2s 236ms/step - loss: 2.1913 - accuracy: 0.1319 - val_loss: 2.1966 - val_accuracy: 0.0825
Epoch 3/200
9/9 [==============================] - 2s 235ms/step - loss: 2.1976 - accuracy: 0.0833 - val_loss: 2.1962 - val_accuracy: 0.1134
Epoch 4/200
9/9 [==============================] - 2s 240ms/step - loss: 2.1853 - accuracy: 0.1250 - val_loss: 2.1957 - val_accuracy: 0.1031
Epoch 5/200
9/9 [==============================] - 2s 239ms/step - loss: 2.1833 - accuracy: 0.1354 - val_loss: 2.1944 - val_accuracy: 0.1134
Epoch 6/200
9/9 [==============================] - 2s 247ms/step - loss: 2.1776 - accuracy: 0.1701 - val_loss: 2.1945 - val_accuracy: 0.2062
Epoch 7/200
9/9 [==============================] - 2s 233ms/step - loss: 2.1771 - accuracy: 0.1771 - val_loss: 2.1948 - val_accuracy: 0.1340
Epoch 8/200
9/9 [==============================] - 2s 238ms/step - loss: 2.1635 - accuracy: 0.1389 - val_loss: 2.1916 - val_accuracy: 0.1134
Epoch 9/200
9/9 [==============================] - 2s 235ms/step - loss: 2.1694 - accuracy: 0.1354 - val_loss: 2.1931 - val_accuracy: 0.1237
Epoch 10/200
9/9 [==============================] - 2s 240ms/step - loss: 2.1439 - accuracy: 0.1632 - val_loss: 2.1886 - val_accuracy: 0.1856
Epoch 11/200
9/9 [==============================] - 2s 237ms/step - loss: 2.1392 - accuracy: 0.1806 - val_loss: 2.1845 - val_accuracy: 0.1649
Epoch 12/200
9/9 [==============================] - 2s 239ms/step - loss: 2.1233 - accuracy: 0.1944 - val_loss: 2.1710 - val_accuracy: 0.1856
Epoch 13/200
9/9 [==============================] - 2s 241ms/step - loss: 2.0783 - accuracy: 0.2396 - val_loss: 2.1572 - val_accuracy: 0.2577
Epoch 14/200
9/9 [==============================] - 2s 236ms/step - loss: 2.0770 - accuracy: 0.2083 - val_loss: 2.1611 - val_accuracy: 0.2268
Epoch 15/200
9/9 [==============================] - 2s 240ms/step - loss: 1.9991 - accuracy: 0.2500 - val_loss: 2.1013 - val_accuracy: 0.3196
Epoch 16/200
9/9 [==============================] - 2s 239ms/step - loss: 1.9614 - accuracy: 0.2465 - val_loss: 2.0832 - val_accuracy: 0.2990
Epoch 17/200
9/9 [==============================] - 2s 237ms/step - loss: 1.9295 - accuracy: 0.2465 - val_loss: 2.1123 - val_accuracy: 0.3093
Epoch 18/200
9/9 [==============================] - 2s 241ms/step - loss: 1.9356 - accuracy: 0.2708 - val_loss: 2.0459 - val_accuracy: 0.2887
Epoch 19/200
9/9 [==============================] - 2s 239ms/step - loss: 1.8774 - accuracy: 0.2847 - val_loss: 2.0127 - val_accuracy: 0.3196
Epoch 20/200
9/9 [==============================] - 2s 237ms/step - loss: 1.8488 - accuracy: 0.2535 - val_loss: 2.0216 - val_accuracy: 0.3196
Epoch 21/200
9/9 [==============================] - 2s 242ms/step - loss: 1.8072 - accuracy: 0.3056 - val_loss: 2.0032 - val_accuracy: 0.3196
Epoch 22/200
9/9 [==============================] - 2s 242ms/step - loss: 1.7888 - accuracy: 0.3507 - val_loss: 1.9202 - val_accuracy: 0.3814
Epoch 23/200
9/9 [==============================] - 2s 234ms/step - loss: 1.7362 - accuracy: 0.3611 - val_loss: 1.9953 - val_accuracy: 0.3918
Epoch 24/200
9/9 [==============================] - 2s 239ms/step - loss: 1.7387 - accuracy: 0.3715 - val_loss: 1.8688 - val_accuracy: 0.4330
Epoch 25/200
9/9 [==============================] - 2s 235ms/step - loss: 1.7570 - accuracy: 0.3229 - val_loss: 1.9319 - val_accuracy: 0.4330
Epoch 26/200
9/9 [==============================] - 2s 236ms/step - loss: 1.7126 - accuracy: 0.3646 - val_loss: 1.9006 - val_accuracy: 0.3814
Epoch 27/200
9/9 [==============================] - 2s 239ms/step - loss: 1.7024 - accuracy: 0.3438 - val_loss: 1.8593 - val_accuracy: 0.4021
Epoch 28/200
9/9 [==============================] - 2s 242ms/step - loss: 1.7164 - accuracy: 0.3021 - val_loss: 1.9146 - val_accuracy: 0.3814
Epoch 29/200
9/9 [==============================] - 2s 241ms/step - loss: 1.6569 - accuracy: 0.3611 - val_loss: 1.8086 - val_accuracy: 0.3711
Epoch 30/200
9/9 [==============================] - 2s 264ms/step - loss: 1.6473 - accuracy: 0.3611 - val_loss: 1.8594 - val_accuracy: 0.4845
Epoch 31/200
9/9 [==============================] - 2s 238ms/step - loss: 1.5706 - accuracy: 0.3889 - val_loss: 1.7691 - val_accuracy: 0.4639
Epoch 32/200
9/9 [==============================] - 2s 240ms/step - loss: 1.5319 - accuracy: 0.4306 - val_loss: 1.7218 - val_accuracy: 0.3608
Epoch 33/200
9/9 [==============================] - 2s 239ms/step - loss: 1.5517 - accuracy: 0.3993 - val_loss: 1.7162 - val_accuracy: 0.4948
Epoch 34/200
9/9 [==============================] - 2s 236ms/step - loss: 1.5385 - accuracy: 0.4444 - val_loss: 1.7389 - val_accuracy: 0.4845
Epoch 35/200
9/9 [==============================] - 2s 237ms/step - loss: 1.5294 - accuracy: 0.4792 - val_loss: 1.7086 - val_accuracy: 0.3918
Epoch 36/200
9/9 [==============================] - 2s 241ms/step - loss: 1.4893 - accuracy: 0.4062 - val_loss: 1.7000 - val_accuracy: 0.4845
Epoch 37/200
9/9 [==============================] - 2s 238ms/step - loss: 1.4764 - accuracy: 0.4931 - val_loss: 1.6446 - val_accuracy: 0.4948
Epoch 38/200
9/9 [==============================] - 2s 238ms/step - loss: 1.4579 - accuracy: 0.4931 - val_loss: 1.6467 - val_accuracy: 0.4433
Epoch 39/200
9/9 [==============================] - 2s 239ms/step - loss: 1.4641 - accuracy: 0.4444 - val_loss: 1.6171 - val_accuracy: 0.4845
Epoch 40/200
9/9 [==============================] - 2s 239ms/step - loss: 1.3807 - accuracy: 0.4931 - val_loss: 1.5935 - val_accuracy: 0.5052
Epoch 41/200
9/9 [==============================] - 2s 241ms/step - loss: 1.3628 - accuracy: 0.4861 - val_loss: 1.5821 - val_accuracy: 0.4330
Epoch 42/200
9/9 [==============================] - 2s 241ms/step - loss: 1.4170 - accuracy: 0.5000 - val_loss: 1.5583 - val_accuracy: 0.5155
Epoch 43/200
9/9 [==============================] - 2s 237ms/step - loss: 1.3124 - accuracy: 0.5521 - val_loss: 1.5521 - val_accuracy: 0.4639
Epoch 44/200
9/9 [==============================] - 2s 239ms/step - loss: 1.3615 - accuracy: 0.5139 - val_loss: 1.5415 - val_accuracy: 0.4639
Epoch 45/200
9/9 [==============================] - 2s 238ms/step - loss: 1.3398 - accuracy: 0.5035 - val_loss: 1.5346 - val_accuracy: 0.5155
Epoch 46/200
9/9 [==============================] - 2s 242ms/step - loss: 1.3031 - accuracy: 0.5347 - val_loss: 1.5253 - val_accuracy: 0.4433
Epoch 47/200
9/9 [==============================] - 2s 240ms/step - loss: 1.2440 - accuracy: 0.5243 - val_loss: 1.4628 - val_accuracy: 0.4948
Epoch 48/200
9/9 [==============================] - 2s 234ms/step - loss: 1.2858 - accuracy: 0.5382 - val_loss: 1.4772 - val_accuracy: 0.4742
Epoch 49/200
9/9 [==============================] - 2s 237ms/step - loss: 1.1700 - accuracy: 0.5799 - val_loss: 1.4650 - val_accuracy: 0.5361
Epoch 50/200
9/9 [==============================] - 2s 236ms/step - loss: 1.2260 - accuracy: 0.5694 - val_loss: 1.4872 - val_accuracy: 0.4948
Epoch 51/200
9/9 [==============================] - 2s 240ms/step - loss: 1.2390 - accuracy: 0.5729 - val_loss: 1.4368 - val_accuracy: 0.5052
Epoch 52/200
9/9 [==============================] - 2s 244ms/step - loss: 1.2274 - accuracy: 0.5660 - val_loss: 1.4307 - val_accuracy: 0.5773
Epoch 53/200
9/9 [==============================] - 2s 234ms/step - loss: 1.3021 - accuracy: 0.4931 - val_loss: 1.4753 - val_accuracy: 0.4845
Epoch 54/200
9/9 [==============================] - 2s 240ms/step - loss: 1.1974 - accuracy: 0.5417 - val_loss: 1.4268 - val_accuracy: 0.5464
Epoch 55/200
9/9 [==============================] - 2s 237ms/step - loss: 1.2089 - accuracy: 0.5590 - val_loss: 1.3990 - val_accuracy: 0.5361
Epoch 56/200
9/9 [==============================] - 2s 236ms/step - loss: 1.2256 - accuracy: 0.5972 - val_loss: 1.3991 - val_accuracy: 0.5670
Epoch 57/200
9/9 [==============================] - 2s 238ms/step - loss: 1.2094 - accuracy: 0.5556 - val_loss: 1.3993 - val_accuracy: 0.5464
Epoch 58/200
9/9 [==============================] - 2s 239ms/step - loss: 1.1432 - accuracy: 0.5486 - val_loss: 1.3761 - val_accuracy: 0.5567
Epoch 59/200
9/9 [==============================] - 2s 241ms/step - loss: 1.1738 - accuracy: 0.5694 - val_loss: 1.3717 - val_accuracy: 0.5773
Epoch 60/200
9/9 [==============================] - 2s 254ms/step - loss: 1.1903 - accuracy: 0.5590 - val_loss: 1.3548 - val_accuracy: 0.5567
Epoch 61/200
9/9 [==============================] - 2s 247ms/step - loss: 1.0896 - accuracy: 0.5903 - val_loss: 1.3593 - val_accuracy: 0.5464
Epoch 62/200
9/9 [==============================] - 2s 255ms/step - loss: 1.1350 - accuracy: 0.5799 - val_loss: 1.3537 - val_accuracy: 0.5567
Epoch 63/200
9/9 [==============================] - 2s 250ms/step - loss: 1.1040 - accuracy: 0.5833 - val_loss: 1.3186 - val_accuracy: 0.5979
Epoch 64/200
9/9 [==============================] - 2s 238ms/step - loss: 1.0624 - accuracy: 0.5972 - val_loss: 1.3240 - val_accuracy: 0.5464
Epoch 65/200
9/9 [==============================] - 2s 248ms/step - loss: 1.0363 - accuracy: 0.6354 - val_loss: 1.3031 - val_accuracy: 0.5464
Epoch 66/200
9/9 [==============================] - 2s 248ms/step - loss: 1.0541 - accuracy: 0.6042 - val_loss: 1.3171 - val_accuracy: 0.5258
Epoch 67/200
9/9 [==============================] - 2s 253ms/step - loss: 1.0706 - accuracy: 0.6146 - val_loss: 1.2592 - val_accuracy: 0.5876
Epoch 68/200
9/9 [==============================] - 2s 248ms/step - loss: 1.0427 - accuracy: 0.6285 - val_loss: 1.2837 - val_accuracy: 0.5979
Epoch 69/200
9/9 [==============================] - 2s 239ms/step - loss: 1.0323 - accuracy: 0.6250 - val_loss: 1.3140 - val_accuracy: 0.5361
Epoch 70/200
9/9 [==============================] - 2s 250ms/step - loss: 1.0680 - accuracy: 0.6181 - val_loss: 1.2819 - val_accuracy: 0.5670
Epoch 71/200
9/9 [==============================] - 2s 246ms/step - loss: 1.0589 - accuracy: 0.6250 - val_loss: 1.2708 - val_accuracy: 0.5361
Epoch 72/200
9/9 [==============================] - 2s 236ms/step - loss: 1.0410 - accuracy: 0.5972 - val_loss: 1.2671 - val_accuracy: 0.6392
Epoch 73/200
9/9 [==============================] - 2s 237ms/step - loss: 1.0728 - accuracy: 0.6424 - val_loss: 1.3063 - val_accuracy: 0.5464
Epoch 74/200
9/9 [==============================] - 2s 236ms/step - loss: 1.1118 - accuracy: 0.5938 - val_loss: 1.2966 - val_accuracy: 0.5773
Epoch 75/200
9/9 [==============================] - 2s 239ms/step - loss: 1.0058 - accuracy: 0.6319 - val_loss: 1.2693 - val_accuracy: 0.5670
Epoch 76/200
9/9 [==============================] - 2s 234ms/step - loss: 1.0212 - accuracy: 0.6354 - val_loss: 1.2658 - val_accuracy: 0.5567
Epoch 77/200
9/9 [==============================] - 2s 237ms/step - loss: 0.9979 - accuracy: 0.6458 - val_loss: 1.2684 - val_accuracy: 0.5464
Epoch 78/200
9/9 [==============================] - 2s 238ms/step - loss: 1.0301 - accuracy: 0.6354 - val_loss: 1.2605 - val_accuracy: 0.5670
Epoch 79/200
9/9 [==============================] - 2s 238ms/step - loss: 1.0601 - accuracy: 0.6007 - val_loss: 1.2794 - val_accuracy: 0.5670
Epoch 80/200
9/9 [==============================] - 2s 237ms/step - loss: 1.0265 - accuracy: 0.6111 - val_loss: 1.2683 - val_accuracy: 0.5876
Epoch 81/200
9/9 [==============================] - 2s 241ms/step - loss: 1.0152 - accuracy: 0.6701 - val_loss: 1.2544 - val_accuracy: 0.5979
Epoch 82/200
9/9 [==============================] - 2s 237ms/step - loss: 1.1278 - accuracy: 0.6076 - val_loss: 1.2576 - val_accuracy: 0.5876
Epoch 83/200
9/9 [==============================] - 2s 239ms/step - loss: 1.0711 - accuracy: 0.6111 - val_loss: 1.2639 - val_accuracy: 0.5876
Epoch 84/200
9/9 [==============================] - 2s 239ms/step - loss: 0.9647 - accuracy: 0.6597 - val_loss: 1.2562 - val_accuracy: 0.6186
In [7]:
fig = plt.figure()
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.show()
fig.savefig('Accuracy vs Epoch.png')
In [8]:
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.show()
fig.savefig('Loss vs Epoch.png')

EVALUATE

In [9]:
datagen_scale = keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
train_generator= datagen_scale.flow_from_dataframe(train,x_col ='path',y_col='label',target_size=(288,384),batch_size=48,shuffle=True)
valid_generator= datagen_scale.flow_from_dataframe(val,x_col ='path',y_col='label',target_size=(288,384),shuffle=False)
test_generator = datagen_scale.flow_from_dataframe(test,x_col ='path',y_col='label',target_size=(288,384),shuffle=False)
model.evaluate(train_generator)
model.evaluate(valid_generator)
model.evaluate(test_generator)
Found 288 validated image filenames belonging to 9 classes.
Found 97 validated image filenames belonging to 9 classes.
Found 45 validated image filenames belonging to 9 classes.
6/6 [==============================] - 1s 190ms/step - loss: 1.1375 - accuracy: 0.6493
4/4 [==============================] - 0s 93ms/step - loss: 1.2547 - accuracy: 0.6392
2/2 [==============================] - 0s 103ms/step - loss: 1.2398 - accuracy: 0.5333
Out[9]:
[1.2397706508636475, 0.5333333611488342]

PREDICT

In [10]:
demo = pd.DataFrame(test.groupby('label').first()).reset_index()
datagen_scale = keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
test_generator = datagen_scale.flow_from_dataframe(demo,x_col ='path',y_col='label',target_size=(288,384),shuffle=False)
demo = pd.concat((demo,pd.Series(np.argmax(model.predict(test_generator),axis=1),name='Prediction').map({a:b for b,a in test_generator.class_indices.items()})),axis=1)
fig,ax = plt.subplots(3,3,figsize=(15,10))
plt.tick_params(left = False, bottom = False)
for i in range(3):
    for j in range(3):
        ax[i][j].imshow(plt.imread(demo.iloc[i*3+j].path))
        ax[i][j].tick_params(left = False, bottom = False)
        ax[i][j].set_xticks([])
        ax[i][j].set_yticks([])
        ax[i][j].set_title("Truth Label "+demo.iloc[i*3+j].label+"   \n PREDICTED   "+demo.iloc[i*3+j].Prediction)
fig.savefig('Predict.png')
Found 9 validated image filenames belonging to 9 classes.
In [11]:
model.save("Fish_breed_classification.h5")

DeepCC

In [ ]:
!deepCC Fish_breed_classification.h5