{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport tensorflow as tf\nimport matplotlib.pyplot as plt\nimport os\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras import Sequential,activations, Input, Model, models\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau\nfrom tensorflow.keras.layers import Dense, GlobalAveragePooling2D\nfrom tensorflow.keras.layers import AveragePooling2D, MaxPooling2D, Dropout\nfrom tensorflow.keras.layers import LeakyReLU\nfrom distutils.dir_util import copy_tree\n\nimport warnings\nwarnings.simplefilter('ignore')\nfrom tensorflow.keras.layers import Dense,Activation, Dropout, Conv2D, MaxPool2D, Flatten,GlobalAveragePooling2D, GlobalMaxPooling2D, BatchNormalization","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-04-21T04:11:46.355460Z","iopub.execute_input":"2022-04-21T04:11:46.356475Z","iopub.status.idle":"2022-04-21T04:11:53.268849Z","shell.execute_reply.started":"2022-04-21T04:11:46.356375Z","shell.execute_reply":"2022-04-21T04:11:53.267751Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"t=copy_tree(\"../input/happy-whale-and-dolphin/train_images/\",\"/kaggle/temp/train/\")","metadata":{"execution":{"iopub.status.busy":"2022-04-20T14:29:37.337823Z","iopub.execute_input":"2022-04-20T14:29:37.338075Z","iopub.status.idle":"2022-04-20T14:39:31.97176Z","shell.execute_reply.started":"2022-04-20T14:29:37.338041Z","shell.execute_reply":"2022-04-20T14:39:31.971015Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image\nimport os, sys\nimport glob\n\nroot_dir = \"/kaggle/temp/train/\"\nfor filename in glob.iglob(root_dir + '**/*.jpg', recursive=True):\n    im = Image.open(filename)\n    imResize = im.resize((128,128), Image.ANTIALIAS)\n    imResize.save(filename , 'JPEG')","metadata":{"execution":{"iopub.status.busy":"2022-04-20T14:39:31.973166Z","iopub.execute_input":"2022-04-20T14:39:31.973423Z","iopub.status.idle":"2022-04-20T16:16:17.273493Z","shell.execute_reply.started":"2022-04-20T14:39:31.973389Z","shell.execute_reply":"2022-04-20T16:16:17.272685Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train=pd.read_csv('../input/happy-whale-and-dolphin/train.csv', header='infer')\ntrain.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-20T16:16:17.27689Z","iopub.execute_input":"2022-04-20T16:16:17.277201Z","iopub.status.idle":"2022-04-20T16:16:17.394852Z","shell.execute_reply.started":"2022-04-20T16:16:17.277166Z","shell.execute_reply":"2022-04-20T16:16:17.394154Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label=train[\"individual_id\"].unique().tolist()\n#label.append(\"new_individual\")\nlabel=np.array(label)\nlabel.shape","metadata":{"execution":{"iopub.status.busy":"2022-04-20T16:16:17.396165Z","iopub.execute_input":"2022-04-20T16:16:17.396579Z","iopub.status.idle":"2022-04-20T16:16:17.417111Z","shell.execute_reply.started":"2022-04-20T16:16:17.396543Z","shell.execute_reply":"2022-04-20T16:16:17.416262Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#make validation directory\nif not os.path.exists(\"/kaggle/temp/valid/\"):\n    os.mkdir(\"/kaggle/temp/valid/\")","metadata":{"execution":{"iopub.status.busy":"2022-04-20T16:16:17.418225Z","iopub.execute_input":"2022-04-20T16:16:17.418491Z","iopub.status.idle":"2022-04-20T16:16:17.423737Z","shell.execute_reply.started":"2022-04-20T16:16:17.418456Z","shell.execute_reply":"2022-04-20T16:16:17.422968Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in label:\n    if not os.path.exists(\"/kaggle/temp/train/\"+i):\n        os.mkdir(\"/kaggle/temp/train/\"+i)\n    if not os.path.exists(\"/kaggle/temp/valid/\"+i):\n        os.mkdir(\"/kaggle/temp/valid/\"+i)","metadata":{"execution":{"iopub.status.busy":"2022-04-20T16:16:17.42546Z","iopub.execute_input":"2022-04-20T16:16:17.425749Z","iopub.status.idle":"2022-04-20T16:16:21.145029Z","shell.execute_reply.started":"2022-04-20T16:16:17.425676Z","shell.execute_reply":"2022-04-20T16:16:21.144201Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(len(train[\"image\"])):\n    img=train[\"image\"][i]\n    t= np.random.random()\n    \n    if t<= 0.5:\n        new_path= os.path.join(\"/kaggle/temp/train/\",train[\"individual_id\"][i],img)\n        os.replace('/kaggle/temp/train/'+img,new_path)\n    else:\n        new_path= os.path.join(\"/kaggle/temp/valid/\",train[\"individual_id\"][i],img)\n        os.replace('/kaggle/temp/train/'+img,new_path)","metadata":{"execution":{"iopub.status.busy":"2022-04-20T16:16:21.146572Z","iopub.execute_input":"2022-04-20T16:16:21.146841Z","iopub.status.idle":"2022-04-20T16:16:24.157467Z","shell.execute_reply.started":"2022-04-20T16:16:21.146805Z","shell.execute_reply":"2022-04-20T16:16:24.156686Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#apply the image generator on train images for augmention\ntrain_datagen = ImageDataGenerator(featurewise_center= False,\n                                  samplewise_center= False,\n                                  featurewise_std_normalization=False,\n                                  samplewise_std_normalization=False,\n                                  zca_whitening=False,\n                                  rotation_range=10,\n                                  zoom_range=0.1,\n                                  width_shift_range=0.1,\n                                  height_shift_range=0.1,\n                                  horizontal_flip=False,\n                                  vertical_flip=False,\n                                  rescale=1./255\n                                  )","metadata":{"execution":{"iopub.status.busy":"2022-04-20T16:16:24.158854Z","iopub.execute_input":"2022-04-20T16:16:24.159122Z","iopub.status.idle":"2022-04-20T16:16:24.164811Z","shell.execute_reply.started":"2022-04-20T16:16:24.159085Z","shell.execute_reply":"2022-04-20T16:16:24.16423Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_gen = train_datagen.flow_from_directory(directory=\"/kaggle/temp/train/\", target_size=(128,128),batch_size=64)\nvalidation_datagen = ImageDataGenerator(rescale=1./255)\nvalid_gen = validation_datagen.flow_from_directory(directory='/kaggle/temp/valid/',target_size=(128,128),batch_size=64)","metadata":{"execution":{"iopub.status.busy":"2022-04-20T16:16:24.167794Z","iopub.execute_input":"2022-04-20T16:16:24.168131Z","iopub.status.idle":"2022-04-20T16:16:30.389564Z","shell.execute_reply.started":"2022-04-20T16:16:24.168102Z","shell.execute_reply":"2022-04-20T16:16:30.388794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model=Sequential()\n#Convolution layer 1\nmodel.add(Conv2D(filters=32, kernel_size=(5,5), strides=(1,1), padding='valid',input_shape=(128,128, 3)))\nmodel.add(BatchNormalization())\nmodel.add(Activation(LeakyReLU(alpha=0.01)))\n\nmodel.add(AveragePooling2D((3, 3)))\nmodel.add(Conv2D(filters=64, kernel_size=(4,4), strides=(1,1), padding='valid'))\nmodel.add(BatchNormalization())\nmodel.add(Activation(LeakyReLU(alpha=0.01)))\nmodel.add(AveragePooling2D((3, 3)))\n#Convolution layer 2\nmodel.add(Conv2D(filters=96, kernel_size=(3,3), strides=(1,1), padding='valid'))\nmodel.add(BatchNormalization())\nmodel.add(Activation(LeakyReLU(alpha=0.01)))\nmodel.add(AveragePooling2D((3, 3)))\n\n\nmodel.add(Conv2D(filters=128, kernel_size=(2,2), strides=(1,1), padding='valid'))\nmodel.add(BatchNormalization())\nmodel.add(Activation(LeakyReLU(alpha=0.01)))\n\nmodel.add(Conv2D(filters=15587, kernel_size=(2,2), strides=(1,1), padding='valid'))\nmodel.add(Activation('softmax'))\nmodel.add(Flatten())\n\nmodel.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2022-04-21T04:11:59.300739Z","iopub.execute_input":"2022-04-21T04:11:59.301795Z","iopub.status.idle":"2022-04-21T04:12:02.851874Z","shell.execute_reply.started":"2022-04-21T04:11:59.301737Z","shell.execute_reply":"2022-04-21T04:12:02.850888Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#setup callback\nreduceLROnPlateau = ReduceLROnPlateau(monitor='val_acc',patience=3,verbose=1,factor=0.5,min_lr=0.001)","metadata":{"execution":{"iopub.status.busy":"2022-04-20T16:16:33.070986Z","iopub.execute_input":"2022-04-20T16:16:33.071236Z","iopub.status.idle":"2022-04-20T16:16:33.075779Z","shell.execute_reply.started":"2022-04-20T16:16:33.071203Z","shell.execute_reply":"2022-04-20T16:16:33.074764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(train_gen,epochs=100,callbacks=[reduceLROnPlateau],validation_data=valid_gen,steps_per_epoch=train_gen.n//train_gen.batch_size,\n         validation_steps= valid_gen.n//valid_gen.batch_size,workers=8,use_multiprocessing=True)","metadata":{"execution":{"iopub.status.busy":"2022-04-20T16:16:33.076958Z","iopub.execute_input":"2022-04-20T16:16:33.077259Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"p=copy_tree(\"../input/happy-whale-and-dolphin/test_images\",\"/kaggle/temp/test/test_img/\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image\nimport os, sys\nimport glob\n\n\n\nroot_dir = \"/kaggle/temp/test/test_img/\"\n\n\nfor filename in glob.iglob(root_dir + '**/*.jpg', recursive=True):\n    im = Image.open(filename)\n    imResize = im.resize((128,128), Image.ANTIALIAS)\n    imResize.save(filename , 'JPEG', quality=90)\n    ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#apply image genetory on test images\ntest_datagen = ImageDataGenerator(rescale=1./255)\ntest_gen = test_datagen.flow_from_directory(directory='/kaggle/temp/test/',target_size=(128,128),batch_size=64\n                                        ,class_mode=None,shuffle=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#prediction\npredictions= model.predict(test_gen)\npredictions.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prediction_prob=[]\n\nfor i in range(len(predictions)):\n    sort_prob=np.sort(predictions[i])[::-1][:5]\n    prediction_prob.append(sort_prob)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prediction_index=[]\nfor i in range(len(predictions)):\n    sort_index=np.argsort(predictions[i])[::-1][:5]\n    prediction_index.append(sort_index)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"limit=0.7\n\nprediction_lite=[]\nfor i in range(len(prediction_index)):\n    if prediction_prob[i][0]<limit:\n        temp=['new_individual',prediction_index[i][1],prediction_index[i][2],prediction_index[i][3],prediction_index[i][4]]\n        prediction_lite.append(temp)\n    elif prediction_prob[i][1]<limit:\n        temp=[prediction_index[i][0],'new_individual',prediction_index[i][2],prediction_index[i][3],prediction_index[i][4]]\n        prediction_lite.append(temp)\n    elif prediction_prob[i][2]<limit:\n        temp=[prediction_index[i][0],prediction_index[i][1],'new_individual',prediction_index[i][3],prediction_index[i][4]]\n        prediction_lite.append(temp)\n    elif prediction_prob[i][3]<limit:\n        temp=[prediction_index[i][0],prediction_index[i][1],prediction_index[i][2],'new_individual',prediction_index[i][4]]\n        prediction_lite.append(temp)\n    elif prediction_prob[i][4]<limit:\n        temp=[prediction_index[i][0],prediction_index[i][1],prediction_index[i][2],prediction_index[i][3],'new_individual']\n        prediction_lite.append(temp)\n    else:\n        prediction_lite.append(prediction_index[i])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#dictionary that contains info about class and class index\nlabels={value:key for (key,value) in train_gen.class_indices.items()}","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prediction_semi_final=np.empty(shape=np.array(prediction_lite).shape,dtype=np.dtype('U500'))\n\nt=0\n\nfor i in range(len(prediction_lite)):\n    for j in range(len(prediction_lite[i])):\n        if prediction_lite[i][j]=='new_individual':\n            prediction_semi_final[i][j]='new_individual'\n        else:\n            prediction_semi_final[i][j]=labels[prediction_lite[i][j]]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prediction_final=np.empty(shape=np.array(prediction_lite).shape[0],dtype=np.dtype('U1000'))\n\nfor i in range(len(prediction_semi_final)):\n    prediction_final[i]=\" \".join([str(item) for item in prediction_semi_final[i]])\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#read the sample_submission csv file \nsub=pd.read_csv('/kaggle/input/happy-whale-and-dolphin/sample_submission.csv', header='infer')\nsub.info()\nsub[\"predictions\"]=prediction_final\nsub.to_csv('submission.csv', index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub.head()","metadata":{},"execution_count":null,"outputs":[]}]}