{"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)\nfrom PIL import Image\nimport numpy as np\nimport matplotlib.pyplot as plt\nplt.rcParams['figure.figsize']=[16,10]\nimport seaborn as sns\n\n%matplotlib inline\nplt.rcParams['axes.unicode_minus']=False\nimport cv2\nimport os\nimport matplotlib.image as img\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        os.path.join(dirname, filename)\n        #print(os.path.join(dirname, filename))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"train_csv=pd.read_csv(\"../input/aptos2019-blindness-detection/train.csv\")\ntrain_csv_idcode_as_index=train_csv.set_index('id_code')\n#check if all images entry is once in csv\n#class frequency\nlabels_df=train_csv['diagnosis']\nlabels_df.value_counts()\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#ploting of each class data\nplt.title='Test Data'\nplt.xlabel='Class'\nplt.ylabel='Count'\nplt.hist(train_csv['diagnosis'], facecolor='peru',edgecolor='blue', bins=10)\nx=np.arange(5);\nplt.xticks(x, ['0','1','2','4','3'])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Image\ntemp=Image.open(\"/kaggle/input/aptos2019-blindness-detection/train_images/000c1434d8d7.png\")\ntemp_data=np.asarray(temp)\nprint(temp.size)\nprint(temp.mode)\nprint(temp_data.shape)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Directory for storing resized images\noutput_dir = \"/kaggle/input/resized\"\nos.mkdir(output_dir)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Image rezie to 200*200\ndef resizeImage(infile, output_dir, flag):\n    if flag:\n        t_infile=\"/kaggle/input/aptos2019-blindness-detection/train_images/\"+infile\n    else:\n        t_infile=\"/kaggle/input/aptos2019-blindness-detection/test_images/\"+infile\n    temp=Image.open(t_infile)\n    temp=temp.resize((200,200))\n    temp.save(output_dir+\"/\"+infile)\n    \n \ntrain_dir=\"/kaggle/input/aptos2019-blindness-detection/train_images/\"\nfor file in os.listdir(train_dir):\n    resizeImage(file,output_dir, True)\n            ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Resized image status\nall_train_image_dir=os.listdir(output_dir)\nlen(all_train_image_dir)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#For 2 fold validation and 1 train set\nfrom sklearn.model_selection import train_test_split\ntrain_img,kfold_img=train_test_split(all_train_image_dir,test_size=0.15, random_state=10)\n#kfold_img2,kfold_img1=train_test_split(kfold_img,test_size=0.50, random_state=10)\nprint(\"training size\",len(train_img))\nprint(\"kfold_img size\", len(kfold_img))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from os import listdir\nfrom keras.preprocessing import image \ndef getTensors(img1, output_dir,csvfile):\n    targets=[]\n    labels=[]\n    images_t=[]\n    list_of_tensors=[]\n    loaded_images = list()\n    for i in img1:\n        img_temp=img.imread(output_dir+\"/\"+i)\n        images_t.append(img)\n        temp=i.strip(\".png\")\n        #targets.append(train_csv_idcode_as_index.loc[temp]['diagnosis'])\n        targets.append(csvfile.loc[temp]['diagnosis'])\n        labels.append(temp)\n        temp=Image.open(output_dir+\"/\"+i)\n        temp=image.load_img(output_dir+\"/\"+i)\n        x = image.img_to_array(temp)\n        list_of_tensors.append(np.expand_dims(x, axis=0))\n        temp=np.vstack(list_of_tensors)\n        tensors=temp.astype('float32')/255\n        \n    return targets,labels,tensors\n        \n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n#for Training\ntrain_array=(np.asarray(train_csv['id_code'])).tolist()\ntrain_targets, train_labels, train_tensors =getTensors(train_img, output_dir, train_csv_idcode_as_index)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#for validation\nvalid_targets, valid_labels, valid_tensors =getTensors(kfold_img, output_dir, train_csv_idcode_as_index)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Current status of a image\ntemp=Image.open(output_dir+\"/000c1434d8d7.png\")\ntemp_data=np.asarray(temp)\nprint(temp.size)\nprint(temp.mode)\nprint(temp_data.shape)  ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D\nfrom keras.layers import Dropout, Flatten, Dense\nfrom keras.models import Sequential\n\nmodel = Sequential()\n\n### TODO: Define your architecture.\nmodel.add(Conv2D(filters=32,kernel_size=(3,3),padding='same',activation='relu',input_shape=(200,200,3)))\nmodel.add(MaxPooling2D(pool_size=(2,2)))\n\nmodel.add(Conv2D(filters=32,kernel_size=(3,3),padding='same',activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2,2)))\n\nmodel.add(Conv2D(filters=64,kernel_size=(3,3),padding='same',activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2,2)))\n\nmodel.add(Conv2D(filters=64,kernel_size=(3,3),padding='same',activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2,2)))\n\nmodel.add(Flatten())\n\nmodel.add(Dense(512,activation='relu'))\nmodel.add(Dropout(0.4))\nmodel.add(Dense(256,activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(5,activation='softmax'))\nmodel.summary()\n\nmodel.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_targets=np.asarray(train_targets)\nvalid_targets=np.asarray(valid_targets)\ntrain_tensors=train_tensors.reshape(train_tensors.shape[0], 200,200, 3)\nvalid_tensors=valid_tensors.reshape(valid_tensors.shape[0], 200,200,3)\nprint(train_tensors.shape)\nprint(train_targets.shape)\nprint(valid_targets.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history=model.fit(x=train_tensors, y=train_targets, validation_data=(valid_tensors,valid_targets), epochs=90, verbose=2, callbacks=None,  \n          validation_split=0.0, shuffle=True,initial_epoch=0,steps_per_epoch=None)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#test data\ntest_dir = \"/kaggle/input/testresized/\"\nos.mkdir(test_dir)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ntemp_dir=\"/kaggle/input/aptos2019-blindness-detection/test_images/\"\nfor file in os.listdir(temp_dir):\n    resizeImage(file,test_dir, False)\n    \nall_test_image_dir=os.listdir(test_dir)\ntest_csv=pd.read_csv(\"../input/aptos2019-blindness-detection/test.csv\")\ntest_csv_idcode_as_index=train_csv.set_index('id_code')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"out_dict={}\nout_dict['id_code']=[]\nout_dict['diagnosis_predicted']=[]\ndef test_model(test_dir,model):\n    for file in os.listdir(test_dir):\n        list_of_tensors=[]\n        id_code=file.strip(\".png\")\n        out_dict['id_code'].append(id_code)\n        temp=image.load_img(test_dir+\"/\"+file)\n        x = image.img_to_array(temp)\n        list_of_tensors.append(np.expand_dims(x, axis=0))\n        temp=np.vstack(list_of_tensors)\n        tensors=temp.astype('float32')/255\n        temp=model.predict_classes(tensors)\n        out_dict['diagnosis_predicted'].append(temp)\n        #print(id_code,temp)\n\n#temp=model.predict_classes(test_model(test_dir))\n#print(temp)\ntest_model(test_dir,model)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# store the prediction in prediction.csv file\noutput_df=pd.DataFrame(out_dict,columns=['id_code', 'diagnosis_predicted'])\noutput_df.to_csv('prediction.csv',index=False)\noutput_df.head","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tqdm import tqdm\ntrain_messay=train_dir","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for image in tqdm(os.listdir(train_messay)): \n    path = os.path.join(train_messay, image)\n    img = cv2.imread(path, cv2.IMREAD_GRAYSCALE) \n    img = cv2.resize(img, (200, 200)).flatten()   \n    np_img=np.asarray(img)\n    \n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def train_data(train_messay):\n    train_data_messy = [] \n    for image1 in tqdm(os.listdir(train_messay)): \n        path = os.path.join(train_messay, image1)\n        img1 = cv2.imread(path, cv2.IMREAD_GRAYSCALE) \n        img1 = cv2.resize(img1, (200, 200))\n        train_data_messy.append(img1)\n        train_data=np.asarray(train_data_messy)\n    return train_data \n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data=train_data(train_messay)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x_train, x_test, y_train, y_test = train_test_split(train_data, train_csv['diagnosis'], test_size=0.15, random_state=42)\nnumber_of_train = x_train.shape[0]\nnumber_of_test = x_test.shape[0]\nprint(number_of_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x_train_flatten = x_train.reshape(number_of_train,x_train.shape[1]*x_train.shape[2])\nx_test_flatten = x_test .reshape(number_of_test,x_test.shape[1]*x_test.shape[2])\nprint(\"X train flatten\",x_train_flatten.shape)\nprint(\"X test flatten\",x_test_flatten.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x_train = x_train_flatten.T\nx_test = x_test_flatten.T\ny_test = y_test.T\ny_train = y_train.T\nprint(\"x train: \",x_train.shape)\nprint(\"x test: \",x_test.shape)\nprint(\"y train: \",y_train.shape)\nprint(\"y test: \",y_test.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def initialize_weights_and_bias(dimension):\n    w = np.full((dimension,1),0.01)\n    b = 0.0\n    return w, b\n\ndef sigmoid(z):\n    y_head = 1/(1+np.exp(-z))\n    return y_head\n\ndef forward_backward_propagation(w,b,x_train,y_train):\n    # forward propagation\n    z = np.dot(w.T,x_train) + b\n    y_head = sigmoid(z)\n    loss = -y_train*np.log(y_head)-(1-y_train)*np.log(1-y_head)\n    cost = (np.sum(loss))/x_train.shape[1]\n    # backward propagation\n    derivative_weight = (np.dot(x_train,((y_head-y_train).T)))/x_train.shape[1]\n    derivative_bias = np.sum(y_head-y_train)/x_train.shape[1]\n    gradients = {\"derivative_weight\": derivative_weight,\"derivative_bias\": derivative_bias}\n    return cost,gradients","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def update(w, b, x_train, y_train, learning_rate,number_of_iterarion):\n    cost_list = []\n    cost_list2 = []\n    index = []\n    \n    for i in range(number_of_iterarion):\n        \n        cost,gradients = forward_backward_propagation(w,b,x_train,y_train)\n        cost_list.append(cost)\n        \n        w = w - learning_rate * gradients[\"derivative_weight\"]\n        b = b - learning_rate * gradients[\"derivative_bias\"]\n        if i % 100 == 0:\n            cost_list2.append(cost)\n            index.append(i)\n            print (\"Cost after iteration %i: %f\" %(i, cost))\n    \n    parameters = {\"weight\": w,\"bias\": b}\n    plt.plot(index,cost_list2)\n    plt.xticks(index,rotation='vertical')\n    plt.xlabel(\"Number of Iterarion\")\n    plt.ylabel(\"Cost\")\n    plt.show()\n    return parameters, gradients, cost_list\n\ndef predict(w,b,x_test):\n    \n    z = sigmoid(np.dot(w.T,x_test)+b)\n    Y_prediction = np.zeros((1,x_test.shape[1]))\n\n    for i in range(z.shape[1]):\n        if z[0,i]<= 0.5:\n            Y_prediction[0,i] = 0\n        else:\n            Y_prediction[0,i] = 1\n\n    return Y_prediction\n\ndef logistic_regression(x_train, y_train, x_test, y_test, learning_rate ,  num_iterations):\n\n    dimension =  x_train.shape[0]\n    w,b = initialize_weights_and_bias(dimension)\n\n    parameters, gradients, cost_list = update(w, b, x_train, y_train, learning_rate,num_iterations)\n    \n    y_prediction_test = predict(parameters[\"weight\"],parameters[\"bias\"],x_test)\n    y_prediction_train = predict(parameters[\"weight\"],parameters[\"bias\"],x_train)\n    \n    print(\"Test Accuracy: {} %\".format(round(100 - np.mean(np.abs(y_prediction_test - y_test)) * 100,2)))\n    print(\"Train Accuracy: {} %\".format(round(100 - np.mean(np.abs(y_prediction_train - y_train)) * 100,2)))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"logistic_regression(x_train, y_train, x_test, y_test,learning_rate = 0.01, num_iterations = 1500)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#apply Logistic Regression\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.model_selection import GridSearchCV\ngrid={\"C\":np.logspace(-3,3,7),\"penalty\":[\"l1\",\"l2\"]},\nlogistic_regression=LogisticRegression(random_state=42)\nlog_reg_cv=GridSearchCV(logistic_regression,grid,cv=10)\nlog_reg_cv.fit(x_train,y_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.metrics import roc_curve\nmodel = KNeighborsClassifier(n_neighbors=3)\nmodel.fit(x_train, y_train)\n","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":1}