{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"from __future__ import print_function\n\nimport sys\nimport numpy as np\nimport pandas as pd\nfrom tqdm import tqdm, tqdm_gui, tqdm_notebook\nfrom PIL import Image, ImageFile\nimport os\n\nimport keras\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten\nfrom keras.layers import Conv2D, MaxPooling2D\nfrom keras import backend as K","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\nfrom os.path import isfile\nimport torch.nn.init as init\nimport torch\nimport torch.nn as nn\nprint(os.listdir(\"../input\"))\nfrom sklearn.model_selection import train_test_split, StratifiedKFold\nfrom torch.utils.data import Dataset\nfrom torchvision import transforms\nfrom torch.optim import Adam, SGD, RMSprop\nimport time\nfrom torch.autograd import Variable\nimport torch.functional as F\nfrom tqdm import tqdm\nfrom sklearn import metrics\nimport urllib\nimport pickle\nimport torch.nn.functional as F\nfrom torchvision import models\nimport seaborn as sns\nimport random","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"IS_LOCAL = False\nif(IS_LOCAL):\n    PATH=\"../input/APTOS 2019 Blindness Detection/\"\nelse:\n    PATH=\"../input/\"\nos.listdir(PATH)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\ntrain_df = pd.read_csv(os.path.join(PATH,'train.csv'), dtype={'id_code': np.unicode_, 'time_to_failure': np.int32})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Train: rows:{} cols:{}\".format(train_df.shape[0], train_df.shape[1]))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"pd.options.display.precision = 15\ntrain_df.head(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import cv2","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x_train_shape = []","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for im_id in tqdm_notebook(train_df[\"id_code\"]):\n    seg = cv2.imread('../input/train_images/' + im_id + '.png', cv2.IMREAD_UNCHANGED)\n    x_train_shape.append(seg.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"min(x_train_shape), max(x_train_shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def seed_everything(seed):\n    random.seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.deterministic = True","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"seed_everything(1234)\nTTA         = 5\nnum_classes = 1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def crop_image1(img,tol=7):\n    # img is image data\n    # tol  is tolerance\n        \n    mask = img>tol\n    return img[np.ix_(mask.any(1),mask.any(0))]\n\ndef crop_image_from_gray(img,tol=7):\n    if img.ndim ==2:\n        mask = img>tol\n        return img[np.ix_(mask.any(1),mask.any(0))]\n    elif img.ndim==3:\n        gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)\n        mask = gray_img>tol\n        \n        check_shape = img[:,:,0][np.ix_(mask.any(1),mask.any(0))].shape[0]\n        if (check_shape == 0): # image is too dark so that we crop out everything,\n            return img # return original image\n        else:\n            img1=img[:,:,0][np.ix_(mask.any(1),mask.any(0))]\n            img2=img[:,:,1][np.ix_(mask.any(1),mask.any(0))]\n            img3=img[:,:,2][np.ix_(mask.any(1),mask.any(0))]\n    #         print(img1.shape,img2.shape,img3.shape)\n            img = np.stack([img1,img2,img3],axis=-1)\n    #         print(img.shape)\n        return img","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def image(idx):\n    label = train_df.diagnosis.values[idx]\n    label = np.expand_dims(label, -1)\n    image = cv2.imread('../input/train_images/' + train_df.id_code.values[idx] + '.png', cv2.IMREAD_UNCHANGED)\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    image = crop_image_from_gray(image)\n    image = cv2.resize(image, (192, 256))\n    return image, label","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image(0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_datagen = keras.preprocessing.image.ImageDataGenerator(\n    rescale = 1./256,\n    rotation_range=30,\n    shear_range = 0.1,\n    brightness_range=[0.5, 1.5],\n    zoom_range = [0.5, 1.5],\n    horizontal_flip = True,\n    vertical_flip=False,\n    validation_split=0.2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.read_csv('../input/train.csv')\ntrain_df['diagnosis'] = train_df['diagnosis'].astype('str')\ntrain_df['id_code'] = train_df['id_code'].astype(str)+'.png'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_train = train_datagen.flow_from_dataframe(\n    dataframe=train_df,\n    directory = '../input/train_images',\n    target_size=(192, 256),\n    color_mode='rgb',\n    classes=None,\n    class_mode='categorical',\n    batch_size=32,\n    shuffle=True,\n    seed=None,\n    save_to_dir=None,\n    save_prefix='',\n    save_format='png',\n    follow_links=False,\n    x_col=\"id_code\",\n    y_col=\"diagnosis\",\n    subset='training',\n    interpolation='nearest')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_test = train_datagen.flow_from_dataframe(\n    dataframe=train_df,\n    directory = '../input/train_images',\n    target_size=(192, 256),\n    color_mode='rgb',\n    classes=None,\n    class_mode='categorical',\n    batch_size=32,\n    shuffle=True,\n    seed=None,\n    save_to_dir=None,\n    save_prefix='',\n    save_format='png',\n    follow_links=False,\n    x_col=\"id_code\",\n    y_col=\"diagnosis\",\n    subset='validation',\n    interpolation='nearest')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"input_shape = ()\nmodel = Sequential()\nmodel.add(Conv2D(16, (2, 3), padding='same', activation='relu', input_shape=(192, 256, 3)))\nmodel.add(Conv2D(32, (2, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 3)))\nmodel.add(Dropout(0.15))\n\nmodel.add(Conv2D(16, (3, 4), padding='same', activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(3, 4)))\nmodel.add(Dropout(0.10))\n\nmodel.add(Conv2D(32, (2, 3), padding='same', activation='relu'))\nmodel.add(Conv2D(16, (2, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 3)))\nmodel.add(Dropout(0.05))\n\nmodel.add(Flatten())\nmodel.add(Dense(256, activation='relu'))\nmodel.add(Dense(128, activation='relu'))\nmodel.add(Dense(64, activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(5, activation='softmax'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_train = train_df['diagnosis']\nfrom keras.utils import np_utils\ny_train = np_utils.to_categorical(y_train)\nnum_classes = y_train.shape[1]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.adam(lr=0.0001, amsgrad=True), metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.callbacks import EarlyStopping, ModelCheckpoint\nes= EarlyStopping(monitor='val_loss', mode ='min', verbose = 0, patience = 20)\nmc = ModelCheckpoint('model.h5', monitor='val_loss', save_best_only = True, mode ='min', verbose = 0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit_generator(generator=data_train,              \n    steps_per_epoch=len(data_train),\n    validation_data=data_test,                    \n    validation_steps=len(data_test),\n    epochs=50,\n    callbacks = [es, mc], \n    use_multiprocessing = True,\n    verbose=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.models import load_model\nmodel = load_model('model.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission_df = pd.read_csv('../input/sample_submission.csv')\nsubmission_df['id_code'] = submission_df['id_code'].astype(str)+'.png'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission_datagen=keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\nsubmission_gen=submission_datagen.flow_from_dataframe(\n    dataframe=submission_df,\n    directory = '../input/test_images',\n    target_size=(192, 256),\n    color_mode='rgb',\n    classes=None,\n    class_mode=None,\n    batch_size=32,\n    shuffle=False,\n    seed=None,\n    save_to_dir=None,\n    save_prefix='',\n    save_format='png',\n    follow_links=False,\n    x_col=\"id_code\",\n    interpolation='nearest')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predictions=model.predict_generator(submission_gen, steps = len(submission_gen))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"max_probability = np.argmax(predictions,axis=1) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission_df.describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission_df['id_code'] = submission_df['id_code'].str.split('.', n = 1, expand = True)[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission_df['diagnosis'] = max_probability\nsubmission_df.to_csv('submission.csv', index=False)","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}