{"cells":[{"metadata":{"_cell_guid":"c332549b-8d23-4bb5-8497-e7a8eb8b21d2","_uuid":"5c38504af3a84bee68c66d3cde74443c58df422f","trusted":true},"cell_type":"code","source":"import os\nimport sys\nimport numpy as np\nimport tensorflow as tf\nimport random\nimport math\nimport warnings\nimport pandas as pd\nimport cv2\nimport matplotlib.pyplot as plt\n\nfrom tqdm import tqdm\nfrom itertools import chain\nfrom skimage.io import imread, imshow, imread_collection, concatenate_images\nfrom skimage.transform import resize\nfrom skimage.morphology import label\n\nwarnings.filterwarnings('ignore', category=UserWarning, module='skimage')\nseed = 42\nrandom.seed = seed\nnp.random.seed = seed","execution_count":1,"outputs":[]},{"metadata":{"_cell_guid":"5babc1df-c8e8-4037-9537-ee7409d338ef","_uuid":"5d84a2852337e5699520058221d974ac47e7204a","collapsed":true,"trusted":true},"cell_type":"code","source":"# Set some parameters\nIMG_WIDTH = 256\nIMG_HEIGHT = 256\nIMG_CHANNELS = 3\nTRAIN_PATH = '../input/stage1_train/'\nTEST_PATH = '../input/stage1_test/'\nMODEL_PATH = '../pretrained/'","execution_count":2,"outputs":[]},{"metadata":{"_cell_guid":"ffa0caf0-2d1b-40f2-865b-8e6db88526b6","_uuid":"3fb9d6530fbbd0e22e41fc4fd9fd9fc0bff027ac","trusted":true},"cell_type":"code","source":"# Get train and test IDs\ntrain_ids = [p for p in os.listdir(TRAIN_PATH) if p.startswith('.') == False]\ntest_ids = [p for p in os.listdir(TEST_PATH) if p.startswith('.') == False]","execution_count":6,"outputs":[]},{"metadata":{"_cell_guid":"ca0cc34b-c26f-41ee-88d7-975aebdb634e","_uuid":"9e389ba8bdb5b6fc03b231b6a6c84a8bde634053","scrolled":true,"trusted":true},"cell_type":"code","source":"# Get and resize train images and masks\nimages = np.zeros((len(train_ids), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)\nlabels = np.zeros((len(train_ids), IMG_HEIGHT, IMG_WIDTH, 1), dtype=np.bool)\nprint('Getting and resizing train images and masks ... ')\nsys.stdout.flush()\n# for n, id_ in tqdm(enumerate(train_ids), total=len(train_ids)):\nfor n, id_ in tqdm(enumerate(train_ids), total=30):\n    path = TRAIN_PATH + id_\n    img = imread(path + '/images/' + id_ + '.png')[:,:,:IMG_CHANNELS]\n    img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)\n    images[n] = img\n    mask = np.zeros((IMG_HEIGHT, IMG_WIDTH, 1), dtype=np.bool)\n    for mask_file in next(os.walk(path + '/masks/'))[2]:\n        mask_ = imread(path + '/masks/' + mask_file)\n        mask_ = np.expand_dims(resize(mask_, (IMG_HEIGHT, IMG_WIDTH), mode='constant', \n                                      preserve_range=True), axis=-1)\n        mask = np.maximum(mask, mask_)\n    labels[n] = mask\n\nX_train = images\nY_train = labels\n\n# Get and resize test images\nsubmission_id = []\nX_test = np.zeros((len(test_ids), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)\nsizes_test = []\nprint('Getting and resizing test images ... ')\nsys.stdout.flush()\nfor n, id_ in tqdm(enumerate(test_ids), total=len(test_ids)):\n    path = TEST_PATH + id_\n    img = imread(path + '/images/' + id_ + '.png')[:,:,:IMG_CHANNELS]\n    sizes_test.append([img.shape[0], img.shape[1]])\n    img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)\n    X_test[n] = img\n    submission_id.append(id_)\n\nprint('Done!')","execution_count":7,"outputs":[]},{"metadata":{"_cell_guid":"3f5e5a47-6133-4870-976a-a8e4fa7bf46c","_uuid":"2a83eab66bf55194f300953bea5534b6a043130f","collapsed":true,"trusted":true},"cell_type":"code","source":"def shuffle():\n    global images, labels\n    p = np.random.permutation(len(X_train))\n    images = X_train[p]\n    labels = Y_train[p]","execution_count":8,"outputs":[]},{"metadata":{"_cell_guid":"3ca3becb-5613-431b-8a88-07d32ec751dc","_uuid":"5a3b79a7d9ee881c68e7f6147964fcd30f726b4a","collapsed":true,"trusted":true},"cell_type":"code","source":"def next_batch(batch_s, iters):\n    if(iters == 0):\n        shuffle()\n    count = batch_s * iters\n    return images[count:(count + batch_s)], labels[count:(count + batch_s)]","execution_count":9,"outputs":[]},{"metadata":{"_cell_guid":"a7bcf0ac-4a4f-4004-9110-5c7a2f190d14","_uuid":"94042cb54a30a3c6a5c37f0d11bc8c1dea8bd334","collapsed":true,"trusted":true},"cell_type":"code","source":"from tensorflow.python.ops import array_ops\n\ndef conv2d_3x3(filters, name):\n    return tf.layers.Conv2D(filters=filters, kernel_size=(3,3), activation=tf.nn.relu, padding='same', name=name)\n\ndef max_pool():\n    return tf.layers.MaxPooling2D((2,2), strides=2, padding='same') \n\ndef drop_out(rate):\n    return tf.layers.Dropout(rate)\n\ndef conv2d_transpose_2x2(filters, name):\n    return tf.layers.Conv2DTranspose(filters=filters, kernel_size=(2, 2), strides=(2, 2), padding='same', name=name)\n\ndef concatenate(branches):\n    return array_ops.concat(branches, 3)\n\ntf.set_random_seed(1234)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"22033858-fbe7-454e-9119-1f2a763070da","_uuid":"061fd3457e6fc5e69212887327d31163832e1153","collapsed":true,"trusted":true},"cell_type":"code","source":"X = tf.placeholder(tf.float32, [None, IMG_WIDTH, IMG_HEIGHT, IMG_CHANNELS], name='X')\nY = tf.placeholder(tf.float32, [None, IMG_WIDTH, IMG_HEIGHT, 1], name='Y')\nlr = tf.placeholder(tf.float32, name='lr')","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"dedcf23a-9563-4d21-8383-b9ca8c39fc7a","_uuid":"0c5bffd335bcdfca6fe9b094eb1e64851c867477","collapsed":true,"trusted":true},"cell_type":"code","source":"with tf.device(\"/gpu:0\"):\n    s = X / 255 # convert image to 0 .. 1.0\n\n    c1 = conv2d_3x3(32, \"c1\") (s)\n    c1 = drop_out(0.1) (c1)\n    c1 = conv2d_3x3(32, \"c1\") (c1)\n    p1 = max_pool() (c1)\n\n    c2 = conv2d_3x3(64, \"c2\") (p1)\n    c2 = drop_out(0.1) (c2)\n    c2 = conv2d_3x3(64, \"c2\") (c2)\n    p2 = max_pool() (c2)\n\n    c3 = conv2d_3x3(128, \"c3\") (p2)\n    c3 = drop_out(0.1) (c3)\n    c3 = conv2d_3x3(128, \"c3\") (c3)\n    p3 = max_pool() (c3)\n\n    c4 = conv2d_3x3(256, \"c4\") (p3)\n    c4 = drop_out(0.2) (c4)\n    c4 = conv2d_3x3(256, \"c4\") (c4)\n    p4 = max_pool() (c4)\n\n    c5 = conv2d_3x3(512, \"c5\") (p4)\n    c5 = drop_out(0.1) (c5)\n    c5 = conv2d_3x3(512, \"c5\") (c5)\n\n    u6 = conv2d_transpose_2x2(256, \"u6\") (c5)\n    u6 = concatenate([u6, c4])\n    c6 = conv2d_3x3(256, \"c6\") (u6)\n    c6 = drop_out(0.2) (c6)\n    c6 = conv2d_3x3(256, \"c6\") (c6)\n\n    u7 = conv2d_transpose_2x2(128, \"u7\") (c6)\n    u7 = concatenate([u7, c3])\n    c7 = conv2d_3x3(128, \"c7\") (u7)\n    c7 = drop_out(0.1) (c7)\n    c7 = conv2d_3x3(128, \"c7\") (c7)\n\n    u8 = conv2d_transpose_2x2(64, \"u8\") (c7)\n    u8 = concatenate([u8, c2])\n    c8 = conv2d_3x3(64, \"c8\") (u8)\n    c8 = drop_out(0.1) (c8)\n    c8 = conv2d_3x3(64, \"c8\") (c8)\n\n    u9 = conv2d_transpose_2x2(32, \"u9\") (c8)\n    u9 = concatenate([u9, c1])\n    c9 = conv2d_3x3(32, \"c9\") (u9)\n    c9 = drop_out(0.1) (c9)\n    c9 = conv2d_3x3(32, \"c9\") (c9)\n\n    logits = tf.layers.Conv2D(1, (1, 1)) (c9)\n\nloss = tf.losses.sigmoid_cross_entropy(Y, logits)\noptimizer = tf.train.AdamOptimizer(lr).minimize(loss)\nsaver = tf.train.Saver()","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"2d02dbe7-ff9b-4921-92d5-d5a8b412b429","_uuid":"803a9718ece3860da0f9fa4f3eeeead84f177e5e","collapsed":true,"scrolled":false,"trusted":true},"cell_type":"code","source":"epoch = 12000\nbatch_iter = 67\nbatch_size = 10\nlearning_rate = 1e-4\ninit = tf.global_variables_initializer()\nsess = tf.Session()\nsess.run(init)\nTRAIN = True\n","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"10d88f39-bdd5-4ab0-b882-ccdf3c6df46b","_uuid":"5fcb786ee0fa709e70d002c8fb11f60e8a783322","collapsed":true,"trusted":true},"cell_type":"code","source":"if TRAIN:\n    batch_count = 0\n    for i in range(epoch):\n        if(batch_count > batch_iter):\n            batch_count = 0    \n        batch_X, batch_Y = next_batch(batch_size, batch_count)\n        batch_count += 1\n        feed_dict = {X: batch_X, Y: batch_Y, lr: learning_rate}\n        loss_value, _ = sess.run([loss, optimizer], feed_dict=feed_dict)\n\n        if(i % 100 == 0):\n            print(str(i) + \" training loss:\", str(loss_value))\n        if(i%1000 == 0):\n            saver.save(sess, './u_net_kaggle', global_step=i)\n\n    saver.save(sess, './u_net_kaggle', global_step=10000)\n    print(\"Training finished.\")","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"36395703-f9a0-4b43-8cfa-6154cddf570f","_uuid":"c8c744b8bf6a9141127a7622fd0f45ab54c14900","collapsed":true,"trusted":true},"cell_type":"code","source":"ix = random.randint(0, 600)\ncheck_data = np.expand_dims(np.array(images[ix]), axis=0)\ncheck_train = {X:check_data}\ncheck_train_mask = sess.run(logits,feed_dict=check_train)\ntrue_mask = labels[ix]\nprint(\"original image\")\nimshow(images[ix])\nplt.show()\nprint(\"true mask\")\nprint(true_mask.shape)\nimshow(true_mask.squeeze().astype(np.uint8))\nplt.show()\nprint(\"produced mask\")\nprint(check_train_mask.shape)\nimshow(check_train_mask.squeeze().astype(np.uint8))\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"73046a2f-f74a-47e9-bd61-917427d59426","_uuid":"ceb487c8c94b58011469b70821e30b24e9ffc611","collapsed":true,"trusted":true},"cell_type":"code","source":"ix = random.randint(0, len(X_test)) #len(X_test) - 1 = 64\ntest_image = X_test[ix].astype(float)\nimshow(test_image)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"8128a55e-3131-42db-8695-3edd74c54c5e","_uuid":"5ebafc6ead8edfabca601a0fdea2fd1ee4e1bc88","collapsed":true,"trusted":true},"cell_type":"code","source":"def sigmoid(x):\n    return 1 / (1 + math.exp(-x))","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"efdd905a-4955-4526-bb04-480cade00c01","_uuid":"5977edd0b667233e6c474e11ae61709999526d90","collapsed":true,"trusted":true},"cell_type":"code","source":"#print(ix)\ntest_image = np.reshape(test_image, [-1, IMG_HEIGHT , IMG_WIDTH, IMG_CHANNELS])\ntest_data = {X:test_image}\n\ntest_mask = sess.run([logits],feed_dict=test_data)\ntest_mask = np.reshape(np.squeeze(test_mask), [IMG_WIDTH , IMG_WIDTH, 1])\nfor i in range(IMG_WIDTH):\n    for j in range(IMG_HEIGHT):\n            test_mask[i][j] = int(sigmoid(test_mask[i][j])*255)\nprint(test_mask.shape)\nimshow(test_mask.squeeze().astype(np.uint8))\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"7139604f-9724-4621-a610-3ba851d20dbc","_uuid":"3113f21420b0215142b2914bffa725926eec0878","collapsed":true,"trusted":true},"cell_type":"code","source":"def rle_encoding(x):\n    dots = np.where(x.T.flatten() == 1)[0]\n    run_lengths = []\n    prev = -2\n    for b in dots:\n        if (b>prev+1): run_lengths.extend((b + 1, 0))\n        run_lengths[-1] += 1\n        prev = b\n    return run_lengths\n\ndef prob_to_rles(x, cutoff=0.5):\n    lab_img = label(x > cutoff)\n    for i in range(1, lab_img.max() + 1):\n        yield rle_encoding(lab_img == i)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"a457de35-ab8b-422a-be34-d289d38d54dc","_uuid":"29f0fb4a8e85e98bb12c566f4fa27d0c34dc3baa","collapsed":true,"trusted":true},"cell_type":"code","source":"\nimg_masks = sess.run(logits,feed_dict= {X:X_test})\n# Create list of upsampled test masks\npreds_test_upsampled = []\nfor i in range(len(img_masks)):\n    preds_test_upsampled.append(resize(np.squeeze(img_masks[i]), \n                                       (sizes_test[i][0], sizes_test[i][1]), \n                                       mode='constant', preserve_range=True))","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"9d9a2a75-9d32-4291-ae3e-a1fa3108a693","_uuid":"3677eb5b91e02a7a0fa5672e1c3157e754452c0d","collapsed":true,"scrolled":false,"trusted":true},"cell_type":"code","source":"\nnew_test_ids = []\nrles = []\nfor n, id_ in enumerate(test_ids):\n    rle = list(prob_to_rles(preds_test_upsampled[n]))\n    rles.extend(rle)\n    new_test_ids.extend([id_] * len(rle))\n    ","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"02256579-135a-4b2f-a860-0281a141489d","_uuid":"837ec15db87f5569ee08863c91b368d32d19df02","collapsed":true,"trusted":true},"cell_type":"code","source":"# Create submission DataFrame\nsub = pd.DataFrame()\nsub['ImageId'] = new_test_ids\nsub['EncodedPixels'] = pd.Series(rles).apply(lambda x: ' '.join(str(y) for y in x))\nsub.to_csv('sub-dsbowl2018-1.csv', index=False)\n\n","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"37ab0f84-025b-4ac8-b9f1-5dc32bc7f910","_uuid":"046341e32a6e7927bbd3a8d577936f5979e0c75b","collapsed":true,"trusted":true},"cell_type":"code","source":"sub.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}