{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\nfrom PIL import Image\n%matplotlib inline\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport cv2\nimport random\n\nimport os\nprint(os.listdir(\"../input\"))\n\nfrom skimage import exposure\nfrom skimage.util import img_as_ubyte\nfrom skimage.color import rgb2gray\nfrom skimage.filters import try_all_threshold\nfrom skimage.filters import threshold_otsu\n\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"train = pd.read_csv('../input/aptos2019-blindness-detection/train.csv')\ntest = pd.read_csv('../input/aptos2019-blindness-detection/test.csv')\nprint('Train shape {}\\nTest shape{}'.format(train.shape, test.shape))\ntrain.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image_list = os.listdir(\"../input/aptos2019-blindness-detection/train_images\")\nprint(image_list[:5])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def assigncolor(seed):\n    random.seed(seed)\n    r = random.randint(0, 255)\n    g = random.randint(0, 255)\n    b = random.randint(0, 255)\n    \n    return [r, g, b]\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def intensity_slicing(grayimage, layers=7):\n\n#     grayimage = img_as_ubyte(grayimage)\n#     Global equalize\n    grayimage=cv2.addWeighted(grayimage,4, cv2.GaussianBlur( grayimage , (0,0) , 15) ,-4 ,128) \n    \n#     grayimage = exposure.equalize_hist(grayimage)\n#     grayimage = np.array(grayimage, dtype=np.uint8)\n#     grayimage = cv2.cvtColor(grayimage, cv2.COLOR_BGR2GRAY)\n\n#     height = np.size(grayimage, 0)\n#     width = np.size(grayimage, 1)\n\n\n#     colorimage = np.zeros((height, width, 3), np.uint8)\n\n#     n = 256 / layers\n#     colormap = list()\n#     colormap.append(0)\n\n#     for i in range(layers - 1):\n#         colormap.append(int(0 + (i + 1) * n))\n#     colormap.append(256)\n\n#     for i in range(height):\n#         for j in range(width):\n#             for k in range(len(colormap) - 1):\n#                 if grayimage[i, j] >= colormap[k] and grayimage[i, j] < colormap[k + 1]:\n#                     colorimage[i, j] = assigncolor(k)\n    \n    grayimage = exposure.equalize_hist(grayimage)\n    \n#     return grayimage > threshold_otsu(grayimage)\n    return grayimage","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train['diagnosis'] = train['diagnosis'].astype('str')\ntrain['id_code'] = train['id_code'].map(lambda x: x+'.png')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dir = \"../input/aptos2019-blindness-detection/train_images/\"\nindex = 59\nimg =cv2.imread(os.path.join(train_dir, image_list[index]), cv2.IMREAD_UNCHANGED)\nimg = cv2.resize(img, (300, 300))\nimg = intensity_slicing(img, 6)\nplt.imshow(img.astype('float32'))\ntrain[train.id_code==image_list[index]]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"datagen = ImageDataGenerator(\n#     rescale = 1.0/255,\n    validation_split=0.25,\n    featurewise_center=True,\n    featurewise_std_normalization=True,\n#     shear_range=0.2,\n#     zoom_range=2.0,\n    preprocessing_function=intensity_slicing,\n#     rotation_range=20,\n#     width_shift_range=0.2,\n#     height_shift_range=0.2,\n    horizontal_flip=True\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"BATCH_SIZE=32","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_gen=datagen.flow_from_dataframe(\n    dataframe=train, \n    directory=train_dir,\n    x_col=\"id_code\",\n    y_col=\"diagnosis\", \n    class_mode=\"categorical\", \n    target_size=(300,300), \n    batch_size=BATCH_SIZE,\n    subset='training',\n    shuffle=False\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.imshow(train_gen[0][0][30])\ntrain_gen[0][0][30].shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"valid_gen=datagen.flow_from_dataframe(\n    dataframe=train, \n    directory=train_dir,\n    x_col=\"id_code\",\n    y_col=\"diagnosis\", \n    class_mode=\"categorical\", \n    target_size=(300,300), \n    batch_size=BATCH_SIZE,\n    subset='validation',\n    shuffle=False\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test['id_code'] = test['id_code'].map(lambda x: x+'.png')\ntest_dir = \"../input/aptos2019-blindness-detection/test_images/\"\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_data_gen = ImageDataGenerator(preprocessing_function=intensity_slicing)\ntest_generator = test_data_gen.flow_from_dataframe(\n    dataframe=test, \n    directory=test_dir,\n    x_col=\"id_code\",\n    target_size=(300,300), \n    batch_size=BATCH_SIZE,\n    shuffle=False,\n    class_mode = None\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.imshow(test_generator[0][30])\ntest_generator[0][20].shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(test_generator.filenames)\nprint(test['id_code'].tail(5), test_generator.filenames[-5:])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import Conv2D, MaxPooling2D\nfrom keras.layers import Dense, Dropout, Flatten\nfrom keras.callbacks import ModelCheckpoint, EarlyStopping","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(16, (3,3), input_shape=(300, 300, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=2))\nmodel.add(Conv2D(32, (3,3),  activation='relu'))\nmodel.add(MaxPooling2D(pool_size=2))\nmodel.add(Conv2D(64, (3,3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=2))\nmodel.add(Conv2D(64, (3,3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=2))\n# model.add(Conv2D(256, (3,3), activation='relu'))\n# model.add(Conv2D(256, (3,3), activation='relu'))\n# model.add(MaxPooling2D(pool_size=(2,2)))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.add(Flatten())\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dropout(0.3))\nmodel.add(Dense(5, activation='softmax'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.optimizers import RMSprop\nmodel.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"early_stop = EarlyStopping(monitor='val_loss', mode ='min', verbose = 1, patience = 5)\ncheckpoint=ModelCheckpoint('Keras.h5',monitor='val_loss', save_best_only=True)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit_generator(train_gen, epochs=20,\n                    steps_per_epoch=len(train_gen.filenames)/BATCH_SIZE,\n                    validation_data=valid_gen, \n                    callbacks=[checkpoint, early_stop],\n                   validation_steps=len(valid_gen.filenames)/BATCH_SIZE,\n                   use_multiprocessing=True)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# from keras.models import load_model\n\n# lmodel = load_model('../input/blind-or-not-keras/Keras.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predicted = model.predict_generator(test_generator, steps=len(test_generator.filenames)/BATCH_SIZE)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test['diagnosis'] = np.argmax(predicted, axis=1)\ntest['id_code'] = test['id_code'].apply(lambda x: x[:-4])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test.to_csv('submission.csv', index=False)\ntest.head()","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}