{"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":"markdown","source":"<div class=\"alert alert-block alert-success\">  \n<h1><center><strong>X-RAY BODY PARTS PREDICTION 🦴</strong></center></h1>","metadata":{}},{"cell_type":"markdown","source":"#### **Import Libraries:**","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nimport tensorflow as tf\nfrom tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten, InputLayer\nimport cv2\nfrom sklearn.preprocessing import StandardScaler","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div class=\"alert alert-info\">  \n<h3><strong>DATA CLEANING + PREPROCESSING</strong></h3>\n</div>","metadata":{}},{"cell_type":"code","source":"train_data = pd.read_csv('../input/xraydataset/train_df.csv')\ntest_data = pd.read_csv('../input/xraydataset/test_df.csv')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data['Target'] = train_data['Target'].apply(lambda x: x.strip(' '))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data['Target'] = train_data['Target'].apply(lambda x: x.split(' ')[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAIN_PATH = '../input/xraydataset/images/train/'","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val = train_data.loc[7].SOPInstanceUID\nval = val + '-c.png'\nimg = plt.imread(TRAIN_PATH + val)\nplt.imshow(img,cmap='gray')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"multi = []\nmulti_target = []\nfor i,val in enumerate(train_data.Target):\n        if len(val) > 2:\n            multi.append(train_data.iloc[i].SOPInstanceUID)\n            multi_target.append(train_data.iloc[i].Target)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(26,28))\nfor i in range(10):\n    plt.subplot(4,4,i+1)\n    val = multi[i] + '-c.png'\n    img = plt.imread(TRAIN_PATH + val)\n    plt.imshow(img,cmap='gray')\n    \nplt.tight_layout(pad=1.5)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"***Checking both Original Image and Normalize Image***","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(26,28))\nimg = plt.imread('../input/xraydataset/image_png.png')\nnorm_img = cv2.normalize(img,None,alpha=0,beta=500,norm_type=cv2.NORM_MINMAX)\nplt.subplot(2,2,1)\nplt.imshow(norm_img,cmap='gray')\nplt.subplot(2,2,2)\nplt.imshow(img,cmap='gray')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dff = pd.DataFrame()\ntrain_dff['SOPInstanceUID'] = train_data['SOPInstanceUID']\ntrain_dff['Target'] = train_data['Target']","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dff.head(2)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(multi_target[6])\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"***We will do One-Hot Encoding for every label like if the label have Abdomen then Abdomen will only be 1 and others will be zero***","metadata":{}},{"cell_type":"code","source":"def Names(label):\n    if label == '0':\n        return 'Abdomen'\n    elif label == '1':\n        return 'Ankle'\n    elif label == '2':\n        return 'Cervical Spine'\n    elif label == '3':\n        return 'Chest'\n    elif label == '4':\n        return 'Clavicles'\n    elif label == '5':\n        return 'Elbow'\n    elif label == '6':\n        return 'Feet'\n    elif label == '7':\n        return 'Finger'\n    elif label == '8':\n        return 'Forearm'\n    elif label == '9':\n        return 'Hand'\n    elif label == '10':\n        return 'Hip'\n    elif label == '11':\n        return 'Knee'\n    elif label == '12':\n        return 'Lower Leg'\n    elif label == '13':\n        return 'Lumbar Spine'\n    elif label == '14':\n        return 'Others'\n    elif label == '15':\n        return 'Pelvis'\n    elif label == '16':\n        return 'Shoulder'\n    elif label == '17':\n        return 'Sinus'\n    elif label == '18':\n        return 'Skull'\n    elif label == '19':\n        return 'Thigh'\n    elif label == '20':\n        return 'Thoracic Spine'\n    elif label == '21':\n        return 'Wrist'","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\nx,x1 = train_dff.iloc[7]['Target'].split(' ',1)\nx_name = Names(x)\nx1_name = Names(x1)\nprint(x_name + ' '+ x1_name)       ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i,val in enumerate(train_dff.Target):\n    if len(val) > 2 and len(val) <=6:\n        \n        x,x1 = train_dff.iloc[i]['Target'].split(' ',1)\n        x_name = Names(x)\n        x1_name = Names(x1)\n        total = x_name + ' ' + x1_name\n        train_dff.iloc[i]['label'] = total\n    elif len(val) >=7:\n        \n        x,x1,x2 = train_dff.iloc[i]['Target'].split(' ',2)\n        x_name = Names(x)\n        x1_name = Names(x1)\n        x2_name = Names(x2)\n        total = x_name+' '+x1_name+' '+x2_name\n        train_dff.iloc[i]['label'] = total\n    else:\n        x = train_dff.iloc[i]['Target']\n        x_name = Names(x)\n        train_dff.iloc[i]['label'] = x_name\n        \n#train_dff['label'] = train_dff['Target'].apply(lambda x: Names(x)if x for x in multi)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dff.head(19)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dff = pd.get_dummies(train_dff['label'])\ntrain_dff['SOPInstanceUID'] = train_data['SOPInstanceUID']\ntrain_dff['Target'] = train_data['Target']\ntrain_dff.head(3)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"new_train_data = pd.merge(train_data,train_dff,on='SOPInstanceUID')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"new_train_data.head(20)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"new_train_data.drop('Target_y',axis=1,inplace=True)\nnew_train_data.columns[65:]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAIN_PATH = '../input/xraydataset/images/train/'\nX = []\ny = []","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"***Images have different sizes like (512,420) or (420,512) and others. but we need to fix this to (128,128) pixel and we use opencv module name cv2. cv2.resize() use to resize it to (128,128)***","metadata":{}},{"cell_type":"code","source":"for val in new_train_data.SOPInstanceUID:\n    idd = val\n    val = val + '-c.png'\n    img = plt.imread(TRAIN_PATH + val) \n    img = cv2.resize(img,dsize=(128,128))\n    img_norm = cv2.normalize(img,None,alpha=0,beta=500,norm_type=cv2.NORM_MINMAX)\n    y.append(np.ndarray.flatten(np.array(new_train_data.loc[new_train_data['SOPInstanceUID'] == idd][new_train_data.columns[65:]])))\n    X.append(np.expand_dims(img,axis=-1))\n\nX = np.array(X)\ny = np.array(y)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.argmax(y[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"***Checking the Data from train folder***","metadata":{}},{"cell_type":"code","source":"fig = plt.figure(figsize=(26,28))\nfor i in range(10):\n    plt.subplot(4,4,i+1)\n    plt.imshow(X[i],cmap='gray')\nplt.tight_layout(pad=1.4)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(X[40])\nplt.imshow(X[40],cmap='gray')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y[0]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.25)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.argmax(y_train[2])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# *CNN MODEL WITH MULTI LAYERS*","metadata":{}},{"cell_type":"code","source":"model = tf.keras.models.Sequential()\nmodel.add(InputLayer(input_shape=(128,128,1)))\n              \nmodel.add(Conv2D(64,kernel_size=(3,3),activation='relu', kernel_initializer='he_normal', padding='same'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(Conv2D(128,kernel_size=(3,3),activation='relu', kernel_initializer='he_normal', padding='same'))\n#model.add(Conv2D(128,kernel_size=(3,3),activation='relu', kernel_initializer='he_normal', padding='same'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\n\nmodel.add(Conv2D(256,kernel_size=(3,3), activation='relu', kernel_initializer='he_normal', padding='same'))\n#model.add(Conv2D(256,kernel_size=(3,3), activation='relu', kernel_initializer='he_normal', padding='same'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\n# model.add(Dropout(0.6))\n\nmodel.add(Conv2D(512,kernel_size=(3,3), activation='relu', kernel_initializer='he_normal', padding='same'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(Dropout(0.6))\n# model.add(Dropout(0.5))\n\n# model.add(Conv2D(2048,kernel_size=(3,3), activation='relu', kernel_initializer='he_normal', padding='same'))\n# model.add(MaxPooling2D(pool_size=(2, 2)))\n\n# model.add(Conv2D(4096,kernel_size=(3,3), activation='relu', kernel_initializer='he_normal', padding='same'))\n# model.add(MaxPooling2D(pool_size=(2, 2)))\n# model.add(Conv2D(1024,kernel_size=(3,3), activation='relu', kernel_initializer='he_normal', padding='same'))\n# model.add(MaxPooling2D(pool_size=(2, 2)))\n\n\n# model.add(Dropout(0.5))\n\nmodel.add(Flatten())\nmodel.add(Dense(4096, activation=\"relu\"))\nmodel.add(Dense(2048, activation=\"relu\"))\nmodel.add(Dense(41, activation=\"softmax\"))\n\nmodel.compile(optimizer='Adam', loss='BinaryCrossentropy', metrics=['accuracy'])\nmodel.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(x_train,y_train,batch_size=5,callbacks = [tf.keras.callbacks.EarlyStopping(monitor='val_loss',patience=5)],epochs=25)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate(x_test,y_test)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TEST_PATH = '../input/xraydataset/images/test/'\ntest_inp = []","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"names_col = new_train_data.columns[65:]\nnames_col","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"set(multi_target)\n       ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def Names_rev(label):\n    if label == '1':\n        return '0 3'\n    elif label == '2':\n        return '0 15'\n    elif label == '5':\n        return '1 11 12'\n    elif label == '6':\n        return '1 12'\n    elif label == '4':\n        return '1 6'\n    elif label == '25':\n        return '10 11 19'\n    elif label == '26':\n        return '10 19'\n    elif label == '28':\n        return '11 12'\n    elif label == '31':\n        return '13 20'\n    elif label == '34':\n        return '15 19'\n    elif label == '8':\n        return '2 13 20'\n    elif label == '9':\n        return '2 20'\n    elif label == '13':\n        return '3 15'\n    elif label == '11':\n        return '3 6'\n    elif label == '12':\n        return '3 7'\n    elif label == '16':\n        return '5 8'\n    elif label == '19':\n        return '7 9'\n    elif label == '21':\n        return '8 16'\n    elif label == '23':\n        return '9 21'\n    elif label == '0':\n        return '0'\n    elif label == '3':\n        return '3'\n    elif label == '7':\n        return '7'\n    elif label == '10':\n        return '10'\n    elif label == '14':\n        return '14'\n    elif label == '15':\n        return '15'\n    elif label == '17':\n        return '17'\n    elif label == '18':\n        return '18'\n    elif label == '19':\n        return '19'\n    elif label == '20':\n        return '20'\n    elif label == '22':\n        return '22'\n    elif label == '24':\n        return '24'\n    elif label == '27':\n        return '27'\n    elif label == '29':\n        return '29'\n    elif label == '30':\n        return '30'\n    elif label == '32':\n        return '32'\n    elif label == '33':\n        return '33'\n    elif label == '35':\n        return '35'\n    elif label == '36':\n        return '36'\n    elif label == '37':\n        return '37'\n    elif label == '38':\n        return '38'\n    elif label == '39':\n        return '39'\n    elif label == '40':\n        return '40'","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(26,28))\ny_pred = model.predict(x_test)\nfor i in range(10):\n    y_predd = np.argmax(y_pred[i])\n    original = np.argmax(y_test[i])\n        \n    col = 'g'\n    if y_predd != original:\n        col = 'r'\n    \n    plt.subplot(4,4,i+1)\n    origi = Names_rev(str(original))\n    label = Names_rev(str(y_predd))\n    strr = names_col[original]\n    \n    plt.xlabel(f'original = {origi}, predicted = {label} , Name = {strr}',color=col)\n    plt.imshow(x_test[i],cmap='gray')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nfor val in test_data.SOPInstanceUID:\n    idd = val\n    val = val + '-c.png'\n    img = plt.imread(TEST_PATH + val)\n    img = cv2.resize(img,dsize=(128,128))\n    test_inp.append(np.expand_dims(img,axis=-1))\n\ntest_inp = np.array(test_inp)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred = model.predict(test_inp)\npred.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"output = []\nfor i in range(743):\n    label = str(np.argmax(pred[i]))\n    print(label,Names_rev(label))\n    output.append(Names_rev(label))\n    ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.read_csv('../input/xraydataset/sample_submission.csv')\nsub['SOPInstanceUID'] = test_data['SOPInstanceUID']\nsub['Target'] = output","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub.to_csv('my_submit.csv',index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sb = pd.read_csv('./my_submit.csv')\nsb.head(40)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}