{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import pydicom\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import BatchNormalization\nfrom tensorflow.keras.layers import Conv2DTranspose\nfrom tensorflow.keras.layers import Conv2D\nfrom tensorflow.keras.layers import LeakyReLU\nfrom tensorflow.keras.layers import Activation\nfrom tensorflow.keras.layers import Flatten\nfrom tensorflow.keras.layers import Dense\nfrom tensorflow.keras.layers import Reshape\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Input\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.datasets import cifar10,mnist\nimport numpy as np\nimport argparse\nimport cv2\nimport os\nfrom tensorflow.keras import layers # just randommmmm\nimport matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n    def load_dcm(filepath):\n        return pydicom.read_file(filepath)\n    def rescale_dcm_to_hounsfield_img(dcm):\n        slope, intercept = get_rescale_slope_intercept(dcm)\n        img = dcm.pixel_array\n        img = np.multiply(img, slope) + intercept\n        return img.astype('float32')\n    def get_rescale_slope_intercept(dcm):\n        slope = int(dcm.RescaleSlope)\n        intercept = int(dcm.RescaleIntercept)\n        return (slope, intercept)\n    def window_img(img, window_center, window_width):\n        windowed_img = np.copy(img)\n        px_max = window_center + (window_width // 2)\n        px_min = window_center - (window_width // 2)\n        windowed_img[windowed_img > px_max] = px_max\n        windowed_img[windowed_img < px_min] = px_min\n        return windowed_img\n    def plot_img(img):\n        plt.figure(figsize=(10,6))\n        plt.imshow(img, cmap=plt.cm.bone)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#parameter\nNUM_EPOCHS = 100\nBATCH_SIZE = 8\nINIT_LR = 2e-4\nOUTPUT_PATH = '.'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dcm = load_dcm('../input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection/stage_2_test/ID_000cef503.dcm')\nimg = rescale_dcm_to_hounsfield_img(dcm)\nbone_window = window_img(img, 40, 80)\nplot_img(bone_window)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"i = 0\nimageList = list()\nfor image in  os.listdir('../input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection/stage_2_train'):\n    if(i<=100):\n        imageList.append(image)\n        i+=1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"trainX = list()\ntestX = list()\ni = 0\nfor e in imageList:\n    dcm = load_dcm('../input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection/stage_2_train/'+e)\n    img = rescale_dcm_to_hounsfield_img(dcm)\n    bone_window = window_img(img, 40, 80)\n    if(i<=80):\n        trainX.append(bone_window)\n    else:\n        testX.append(bone_window)\n    i+=1\ntrainX = np.array(trainX)\ntestX = np.array(testX)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.imshow(testX[3])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":""},{"metadata":{},"cell_type":"markdown","source":""},{"metadata":{},"cell_type":"raw","source":"train"},{"metadata":{"trusted":true},"cell_type":"code","source":"from __future__ import print_function, division\n\nfrom keras.layers import Input, Dense, Flatten, Dropout, Reshape, Concatenate\nfrom keras.layers import BatchNormalization, Activation, Conv2D, Conv2DTranspose\nfrom keras.layers.advanced_activations import LeakyReLU\nfrom keras.models import Model\nfrom keras.optimizers import Adam\n\nfrom keras.datasets import cifar10\nimport keras.backend as K\n\nimport matplotlib.pyplot as plt\n\nimport sys\nimport os\nimport numpy as np\nimport pandas as pd\nimport cv2\n\n\n\ndef get_generator(input_layer, condition_layer):\n    merged_input = Concatenate()([input_layer, condition_layer])\n\n    hid = Dense(128 * 32 * 32, activation='relu')(merged_input)\n    hid = BatchNormalization(momentum=0.9)(hid)\n    hid = LeakyReLU(alpha=0.1)(hid)\n    hid = Reshape((32, 32, 128))(hid)\n\n    hid = Conv2D(128, kernel_size=4, strides=1, padding='same')(hid)\n    hid = BatchNormalization(momentum=0.9)(hid)\n    hid = LeakyReLU(alpha=0.1)(hid)\n\n    hid = Conv2DTranspose(128, 4, strides=2, padding='same')(hid)\n    hid = BatchNormalization(momentum=0.9)(hid)\n    hid = LeakyReLU(alpha=0.1)(hid)\n\n    hid = Conv2D(128, kernel_size=5, strides=1, padding='same')(hid)\n    hid = BatchNormalization(momentum=0.9)(hid)\n    hid = LeakyReLU(alpha=0.1)(hid)\n\n    hid = Conv2DTranspose(128, 4, strides=2, padding='same')(hid)\n    hid = BatchNormalization(momentum=0.9)(hid)\n    hid = LeakyReLU(alpha=0.1)(hid)\n\n    hid = Conv2D(128, kernel_size=5, strides=1, padding='same')(hid)\n    hid = BatchNormalization(momentum=0.9)(hid)\n    hid = LeakyReLU(alpha=0.1)(hid)\n\n    hid = Conv2D(128, kernel_size=5, strides=1, padding='same')(hid)\n    hid = BatchNormalization(momentum=0.9)(hid)\n    hid = LeakyReLU(alpha=0.1)(hid)\n\n    hid = Conv2D(1, kernel_size=5, strides=1, padding=\"same\")(hid)\n    out = Activation(\"tanh\")(hid)\n\n    model = Model(inputs=[input_layer, condition_layer], outputs=out)\n    model.summary()\n\n    return model, out\n\n\ndef get_discriminator(input_layer, condition_layer):\n    hid = Conv2D(128, kernel_size=3, strides=1, padding='same')(input_layer)\n    hid = BatchNormalization(momentum=0.9)(hid)\n    hid = LeakyReLU(alpha=0.1)(hid)\n\n    hid = Conv2D(128, kernel_size=4, strides=2, padding='same')(hid)\n    hid = BatchNormalization(momentum=0.9)(hid)\n    hid = LeakyReLU(alpha=0.1)(hid)\n\n    hid = Conv2D(128, kernel_size=4, strides=2, padding='same')(hid)\n    hid = BatchNormalization(momentum=0.9)(hid)\n    hid = LeakyReLU(alpha=0.1)(hid)\n\n    hid = Conv2D(256, kernel_size=4, strides=2, padding='same')(hid)\n    hid = BatchNormalization(momentum=0.9)(hid)\n    hid = LeakyReLU(alpha=0.1)(hid)\n\n    hid = Flatten()(hid)\n\n    merged_layer = Concatenate()([hid, condition_layer])\n    hid = Dense(512, activation='relu')(merged_layer)\n    # hid = Dropout(0.4)(hid)\n    out = Dense(1, activation='sigmoid')(hid)\n\n    model = Model(inputs=[input_layer, condition_layer], outputs=out)\n\n    model.summary()\n\n    return model, out\n\nfrom keras.preprocessing import image\n\ndef one_hot_encode(y):\n  z = np.zeros((len(y), 5))\n  idx = np.arange(len(y))\n  z[idx, y] = 1\n  return z\n\ndef generate_noise(n_samples, noise_dim):\n  X = np.random.normal(0, 1, size=(n_samples, noise_dim))\n  return X\n\ndef generate_random_labels(n):\n  y = np.random.choice(5, n)\n  y = one_hot_encode(y)\n  return y\n\n\ntags = ['Atelectasis', 'No Finding', 'Cardiomegaly', 'Effusion', 'Pneumothorax']\n\n\ndef show_samples(batchidx):\n    fig, axs = plt.subplots(5, 6, figsize=(10, 6))\n    plt.subplots_adjust(hspace=0.3, wspace=0.1)\n    # fig, axs = plt.subplots(5, 6)\n    # fig.tight_layout()\n    for classlabel in range(5):\n        row = int(classlabel / 2)\n        coloffset = (classlabel % 2) * 3\n        lbls = one_hot_encode([classlabel] * 3)\n        noise = generate_noise(1, 100)\n        gen_imgs = generator.predict([noise, lbls])\n\n        for i in range(3):\n            # Dont scale the images back, let keras handle it\n            img = image.array_to_img(gen_imgs[i], scale=True)\n            axs[row, i + coloffset].imshow(img)\n            axs[row, i + coloffset].axis('off')\n            if i == 1:\n                axs[row, i + coloffset].set_title(tags[classlabel])\n    plt.show()\n    plt.close()\n\n# GAN creation\nimg_input = Input(shape=(128,128,1))\n\ndisc_condition_input = Input(shape=(5,))\n\ndiscriminator, disc_out = get_discriminator(img_input, disc_condition_input)\ndiscriminator.compile(optimizer=Adam(0.0002, 0.5), loss='binary_crossentropy', metrics=['accuracy'])\n\ndiscriminator.trainable = False\n\nnoise_input = Input(shape=(100,))\ngen_condition_input = Input(shape=(5,))\ngenerator, gen_out = get_generator(noise_input, gen_condition_input)\nprint(generator)\nprint(gen_out)\ngan_input = Input(shape=(100,))\nx = generator([gan_input, gen_condition_input])\nprint(x)\ngan_out = discriminator([x, disc_condition_input])\ngan = Model(inputs=[gan_input, gen_condition_input, disc_condition_input], output=gan_out)\ngan.summary()\n\ngan.compile(optimizer=Adam(0.0002, 0.5), loss='binary_crossentropy')\n\nBATCH_SIZE = 52\n\n# # Get training images\n(img_x, img_y) = 128,128\ntrain_path = \"trainData.csv\"\n\nclasses = ['Atelectasis', 'No Finding', 'Cardiomegaly', 'Effusion', 'Pneumothorax']\nnum_classes = len(classes)\n\n# Load training data\ndataTrain = pd.read_csv(train_path)\n\nx_train = []\ny_train = []\n# prepare label binarizer\nfrom sklearn import preprocessing\n# OHE\nlb = preprocessing.LabelEncoder()#Binarizer()\nlb.fit(classes)\n\nprev = np.zeros((img_x, img_y))\ncount = 0\nfor index, row in dataTrain.iterrows():\n    img1 = os.path.join(\"../images/\", row[\"Image Index\"])\n    image1 = cv2.imread(img1)  # Image.open(img).convert('L')\n    image1 = image1[:, :, 0]\n    arr1 = cv2.resize(image1, (img_x, img_y))\n    arr1 = arr1.astype('float32')\n    arr1 /= 255.0\n    arr1 = arr1 - np.mean(arr1)\n    # DEBUG\n    # print(\"shape of image: {}\".format(arr1.shape))\n    x_train.append(arr1)\n    # not yet one-hot encoded\n    label = lb.transform([row[\"Finding Labels\"]])\n    # STARTHERE\n    y_train.append(np.asarray(label, dtype=np.uint8))\n    # y_train.append(lb.transform([row[\"Finding Labels\"]]).flatten().T)\n    count += 1\n\n    # 1hot encode labels\n    #y_train = lb.fit_transform(y_train)\nx_train = np.asarray(x_train)\ny_train = np.asarray(y_train)\nprint(\"Label shape (should be (X, 1): {}\".format(y_train.shape))\nprint(\"Label element shape (should be (1,): {}\".format(y_train[0].shape))\ny_train = one_hot_encode(y_train[:,0])\nx_train = x_train.reshape(count, img_y, img_x, 1)\nprint(\"Training shape: {}\".format(x_train.shape))\n\n\n\n\nnum_batches = int(x_train.shape[0]/BATCH_SIZE)\n\n# Array to store samples for experience replay\nexp_replay = []\n\nN_EPOCHS = 200\nfor epoch in range(N_EPOCHS):\n\n    cum_d_loss = 0.\n    cum_g_loss = 0.\n\n    for batch_idx in range(num_batches):\n        # Get the next set of real images to be used in this iteration\n        images = x_train[batch_idx * BATCH_SIZE: (batch_idx + 1) * BATCH_SIZE]\n        labels = y_train[batch_idx * BATCH_SIZE: (batch_idx + 1) * BATCH_SIZE]\n\n        noise_data = generate_noise(BATCH_SIZE, 100)\n        random_labels = generate_random_labels(BATCH_SIZE)\n        # We use same labels for generated images as in the real training batch\n        generated_images = generator.predict([noise_data, labels])\n\n        # Train on soft targets (add noise to targets as well)\n        noise_prop = 0.05  # Randomly flip 5% of targets\n\n        # Prepare labels for real data\n        true_labels = np.zeros((BATCH_SIZE, 1)) + np.random.uniform(low=0.0, high=0.1, size=(BATCH_SIZE, 1))\n        flipped_idx = np.random.choice(np.arange(len(true_labels)), size=int(noise_prop * len(true_labels)))\n        true_labels[flipped_idx] = 1 - true_labels[flipped_idx]\n\n        # Train discriminator on real data\n        d_loss_true = discriminator.train_on_batch([images, labels], true_labels)\n\n        # Prepare labels for generated data\n        gene_labels = np.ones((BATCH_SIZE, 1)) - np.random.uniform(low=0.0, high=0.1, size=(BATCH_SIZE, 1))\n        flipped_idx = np.random.choice(np.arange(len(gene_labels)), size=int(noise_prop * len(gene_labels)))\n        gene_labels[flipped_idx] = 1 - gene_labels[flipped_idx]\n\n        # Train discriminator on generated data\n        d_loss_gene = discriminator.train_on_batch([generated_images, labels], gene_labels)\n\n        # Store a random point for experience replay\n        r_idx = np.random.randint(BATCH_SIZE)\n        exp_replay.append([generated_images[r_idx], labels[r_idx], gene_labels[r_idx]])\n\n        # If we have enough points, do experience replay\n        if len(exp_replay) == BATCH_SIZE:\n            generated_images = np.array([p[0] for p in exp_replay])\n            labels = np.array([p[1] for p in exp_replay])\n            gene_labels = np.array([p[2] for p in exp_replay])\n            expprep_loss_gene = discriminator.train_on_batch([generated_images, labels], gene_labels)\n            exp_replay = []\n            break\n\n        d_loss = 0.5 * np.add(d_loss_true, d_loss_gene)\n        cum_d_loss += d_loss\n\n        # Train generator\n        noise_data = generate_noise(BATCH_SIZE, 100)\n        random_labels1 = generate_random_labels(BATCH_SIZE)\n        g_loss = gan.train_on_batch([noise_data, random_labels, random_labels1], np.zeros((BATCH_SIZE, 1)))\n        cum_g_loss += g_loss\n\n    print('\\tEpoch: {}, Generator Loss: {}, Discriminator Loss: {}'.format(epoch + 1, cum_g_loss / num_batches,\n                                                                           cum_d_loss / num_batches))\n    show_samples(\"epoch\" + str(epoch))\n\n    gan.save('/Users/anushkagupta/Desktop/gen.h5')\n    discriminator.save('/Users/anushkagupta/Desktop/dis.h5')\n\n    for classlabel in range(5):\n        lbls = one_hot_encode([classlabel] * 4)\n        noise = generate_noise(4, 100)\n        gen_imgs = generator.predict([noise, lbls])\n\n        fig, axs = plt.subplots(500, 500)\n        plt.subplots_adjust(hspace=0.05, wspace=0.05)\n        count = 0\n        for i in range(500):\n            for j in range(500):\n                # Dont scale the images back, let keras handle it\n                img = image.array_to_img(gen_imgs[count], scale=True)\n                axs[i, j].imshow(img)\n                axs[i, j].axis('off')\n                plt.suptitle('Label: ' + str(classlabel))\n                count += 1\n                fig.savefig(\"/Users/anushkagupta/Desktop/imageconv/\" + str(classlabel) + \"-\" + str([i,j]) + \".png\")\n                plt.clf()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.layers import Dense, Activation, Flatten, Dropout, BatchNormalization\nfrom keras.layers import Conv2D, MaxPooling2D, SpatialDropout2D\nfrom keras.losses import categorical_crossentropy\nfrom keras.optimizers import RMSprop, Adam\nimport pandas as pd\nimport numpy as np\ntraindf=pd.read_csv(\"~/Desktop/newDataTrain.csv\")\ntestdf=pd.read_csv(\"~/Desktop/newDataTest.csv\")\n\ndatagen=ImageDataGenerator(rescale=1/.255,validation_split=0.02)\nshape=(64,64)\nbatch_size=50\n\ntrain_generator=datagen.flow_from_dataframe(\ndataframe=traindf,\ndirectory=\"/Volumes/Anushka/data/train/\",\nx_col=\"Image Index\",\ny_col=\"Finding Labels\",\nhas_ext=True, subset=\"training\",\nbatch_size=batch_size,\nseed=42,\nshuffle=True,\nclass_mode=\"categorical\",\ncolor_mode=\"grayscale\",\ntarget_size=shape)\n\nvalid_generator=datagen.flow_from_dataframe(\ndataframe=traindf,\ndirectory=\"/Volumes/Anushka/data/train/\",\nx_col=\"Image Index\",\ny_col=\"Finding Labels\",\nhas_ext=True,\nsubset=\"validation\",\nbatch_size=batch_size,\nseed=42,\nshuffle=True,\nclass_mode=\"categorical\",\ncolor_mode=\"grayscale\",\ntarget_size=shape)\ntest_datagen=ImageDataGenerator(rescale=1./255.)\ntest_generator=test_datagen.flow_from_dataframe(\ndataframe=testdf,\ndirectory=\"/Volumes/Anushka/data/train/\",\nx_col=\"Image Index\",\ny_col=None,\nhas_ext=True,\nbatch_size=batch_size,\nseed=42,\nshuffle=False,\nclass_mode=None,\ncolor_mode=\"grayscale\",\ntarget_size=shape)\n\ninput_shape = (64, 64,1)\nkernel_dims = (3, 3)\ndropout_rate = 0.2\nnum_classes = 5\nepochs=10\nbatch_size=50\n\nmodel=Sequential()\nmodel.add(Conv2D(64, kernel_size=(kernel_dims), padding='same', activation='relu', input_shape=input_shape))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D())\nmodel.add(SpatialDropout2D(dropout_rate))\n\nmodel.add(Conv2D(64, kernel_size=(kernel_dims), padding='same', activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D())\nmodel.add(SpatialDropout2D(dropout_rate))\n\n# lower-level filters don't need to drop entire feature maps\nmodel.add(Conv2D(64, kernel_size=(kernel_dims), padding='same', activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D())\nmodel.add(Dropout(dropout_rate))\n\nmodel.add(Flatten())\nmodel.add(Dense(125, activation=\"relu\"))\nmodel.add(Dropout(dropout_rate))\nmodel.add(Dense(num_classes))\nmodel.add(Activation('softmax'))\n\nmodel.compile(loss=categorical_crossentropy, optimizer='adam', metrics=['accuracy'])\n\nmodel.summary()\nSTEP_SIZE_TRAIN=2937//50\nSTEP_SIZE_VALID=1063//50\nhistory = model.fit_generator(generator=train_generator,steps_per_epoch=STEP_SIZE_TRAIN,\n                              epochs=epochs,validation_steps=STEP_SIZE_VALID,\n                              validation_data=valid_generator,verbose=1)\n\nscore=model.evaluate_generator(generator=test_generator)\n\nprint(\"test loss\",score[0])\nprint(\"test accuracy\",score[1])","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":4}