{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Image Recognition with a CNN"},{"metadata":{},"cell_type":"markdown","source":"## 1. prepping the Data"},{"metadata":{},"cell_type":"markdown","source":"### 1.0 unzipping train and test into output folder"},{"metadata":{"trusted":true},"cell_type":"code","source":"!unzip ../input/cassava-disease/train.zip -d ../working\n!unzip ../input/cassava-disease/test.zip -d ../working","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 1.1 (old) read data\nload the data into the RAM (6GB)"},{"metadata":{"trusted":true},"cell_type":"code","source":"# import glob\n# import cv2\n# import os\n# import numpy as np\n# #reading image values in pixels width * hight * channels\n\n# ext = ['jpg', 'jpeg']    # Add image formats here\n# subfolders = ['cbb','cbsd','cgm','cmd','healthy']\n# data = []\n# labels = []\n\n# for subfolder in subfolders:\n#     N = len([iq for iq in os.scandir('../working/train/%s/'%subfolder)])\n#     print('reading %s folder [%d files]...'%(subfolder,N))\n#     files = []\n#     imdir = '../working/train/%s/'%subfolder\n#     [files.extend(glob.glob(imdir + '*.' + e)) for e in ext]\n#     data.extend([cv2.imread(file) for file in files])\n#     labels.extend([subfolder for file in files])\n\n# print('done !')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 1.1 importing folder directly into dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"import tensorflow as tf\n\ndirectory = '../working/train/'\n\ndataset = tf.keras.preprocessing.image_dataset_from_directory(\n    directory,\n    labels=\"inferred\",\n    label_mode=\"int\",\n    class_names=None,\n    color_mode=\"rgb\",\n    batch_size=32,\n    image_size=(256, 256),\n    shuffle=True,\n    seed=123,\n    validation_split=0.3,\n    subset=\"validation\",\n    interpolation=\"bilinear\",\n    follow_links=False,\n)\n\n# dataset := tf.data.Dataset","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### 1.2 converting data (TODO)\nconvert dataset into [X_train,y_train]\n\nand later on will do the same for test:"},{"metadata":{"trusted":true},"cell_type":"code","source":"(x,y,x2,y2) = dataset.unbatch() # <- THIS ISNT WORKING, NEED SOMETHING ELSE","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 1.3 more prepping data parts"},{"metadata":{"trusted":true},"cell_type":"code","source":"# normalize the inputs from 0-255 to [0,1] by dividing by 255\n    \nX_train = X_train.astype('float32')\nX_test = X_test.astype('float32')\nX_train = X_train / 255.0\nX_test = X_test / 255.0","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.utils import np_utils\n# one hot encode outputs\ny_train = np_utils.to_categorical(y_train)\ny_test = np_utils.to_categorical(y_test)\nclass_num = y_test.shape[1]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 2. Designing the Model"},{"metadata":{},"cell_type":"markdown","source":"Defining model architecture"},{"metadata":{},"cell_type":"markdown","source":"### 2.1 Create the model"},{"metadata":{"trusted":true},"cell_type":"code","source":"# input_size = X_train.shape[1:]\ninput_size = 32\n# class_num = y_test.shape[1]\nclass_num = 5\n\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten, BatchNormalization, Activation\nfrom keras.layers.convolutional import Conv2D, MaxPooling2D\n\nmodel = Sequential()\n\n\nmodel.add(Conv2D(32, (3, 3), input_shape=input_size, padding='same'))\nmodel.add(Activation('relu'))\n\nmodel.add(Conv2D(32, (3, 3), input_shape=(3, 32, 32), activation='relu', padding='same'))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(64, (3, 3), padding='same'))\nmodel.add(Activation('relu'))\n\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(64, (3, 3), padding='same'))\nmodel.add(Activation('relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization())\n    \nmodel.add(Conv2D(128, (3, 3), padding='same'))\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization())\n\nmodel.add(Flatten())\nmodel.add(Dropout(0.2))\n\nmodel.add(Dense(256, kernel_constraint=maxnorm(3)))\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization())\n    \nmodel.add(Dense(128, kernel_constraint=maxnorm(3)))\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization())\n\nmodel.add(Dense(class_num))\nmodel.add(Activation('softmax'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"markdown","source":"### 2.2 Model Architecture"},{"metadata":{},"cell_type":"markdown","source":"architecture:\n\n\nin (32x32)  ->\n\n            -> [conv (32x32) + relu] -> [conv (32x32) + relu] -> [dropout (0.2) + batch normalize] ->\n\n            -> [conv (64x64) + relu] -> [maxPool (2x2)]       -> [dropout (0.2) + batch normalize] ->\n            \n            -> [conv (64x64) + relu] -> [maxPool (2x2)]       -> [dropout (0.2) + batch normalize] ->\n            \n            -> [conv (128x128) + relu]                        -> [dropout (0.2) + batch normalize] ->\n            \n            -> [flatten]                                      -> [dropout (0.2)]                   ->\n            \n            -> [dense (256x256) + relu]                       -> [dropout (0.2) + batch normalize] ->\n            \n            -> [dense (128x128) + relu]                       -> [dropout (0.2) + batch normalize] ->\n            \n            \n            \n-> dense (?x?) -> softmax ->"},{"metadata":{"trusted":true},"cell_type":"code","source":"epochs = 25\noptimizer = 'adam'\n\nmodel.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(model.summary())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"numpy.random.seed(seed)\nmodel.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=64)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Model evaluation\nscores = model.evaluate(X_test, y_test, verbose=0)\nprint(\"Accuracy: %.2f%%\" % (scores[1]*100))","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}