{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"#Ship detection data visualization and analysis\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport cv2\nfrom skimage.data import imread\nfrom pathlib import Path\nfrom skimage.measure import label, regionprops\nfrom skimage.morphology import label","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"00d746de6b1488cd953a08bf1ce68bebb7c68749"},"cell_type":"code","source":"train = pd.read_csv('../input/train_ship_segmentations_v2.csv')\ntrain.head()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"bde127e722d7abd00db2beddadbbd5f5c451993f"},"cell_type":"code","source":"ships = train[~train.EncodedPixels.isna()].ImageId.unique()\nnoships = train[train.EncodedPixels.isna()].ImageId.unique()\nplt.bar(['Ships', 'No Ships'], [len(ships), len(noships)], color=[\"red\",\"blue\"]);\nplt.ylabel('Number of Images');","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e86b6ee4f23eb4b980df5644873c5478a29d522b"},"cell_type":"markdown","source":"> #### As you can see, the EncodedPixels are the ship location in the imgs. <br>For example, total pixels are 768*768 = 589824, in pic 2, 264661  17 means, from 264661 pixel to 264678 pixel are ship. This is for training data only. What we need to feed back is something like this.<br>Also, Nan means no ship in the image."},{"metadata":{"_uuid":"6fea8fbbdf44e187a771f81337709a9b8589136d"},"cell_type":"markdown","source":">#### Look at images with ships"},{"metadata":{"trusted":true,"_uuid":"0b0a1a021697c5f76c6938b38eeb80eea55451ba"},"cell_type":"code","source":"train_sample = train[~train.EncodedPixels.isna()].sample(9)\n#randomly choose 9 pics from train images with ships\nfig, axes = plt.subplots(3, 3, figsize=(12,12))\nfor i, image_id in enumerate(train_sample.ImageId):\n    col = i % 3\n    row = i // 3\n    img = imread(f'../input/train_v2/{image_id}')\n    axes[row, col].axis('off')\n    axes[row, col].imshow(img)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"5023fa37e9313ccea437aaab7e6183b513245002"},"cell_type":"markdown","source":">#### Look at images without ships"},{"metadata":{"trusted":true,"_uuid":"f9a0db5406651ed108eb54fd2dada3c3f08c2d13"},"cell_type":"code","source":"train_sample = train[train.EncodedPixels.isna()].sample(9)\n#randomly choose 9 pics from train images without ships\nfig, axes = plt.subplots(3, 3, figsize=(12,12))\nfor i, image_id in enumerate(train_sample.ImageId):\n    col = i % 3\n    row = i // 3\n    img = imread(f'../input/train_v2/{image_id}')\n    axes[row, col].axis('off')\n    axes[row, col].imshow(img)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"be2bd6e126b42e7a2c0369e87fba563af116a3bb"},"cell_type":"markdown","source":">#### Mask the training data with segmentations infomation.<br>1 - ship    0 - no ship"},{"metadata":{"trusted":true,"_uuid":"c70f8a57c7a2d3687e67c7aa87ca009e32664e4c"},"cell_type":"code","source":"# ref: https://www.kaggle.com/paulorzp/run-length-encode-and-decode\n# Decode the EncodedPixels to pixel info\n#EncodedPixels are stored as (start, length) pair in a success as string format\ndef rle_decode(mask_rle, shape=(768, 768)):\n    s = mask_rle.split()\n    starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]\n    #s[::2] means every two elements\n    starts -= 1\n    ends = starts + lengths\n    img = np.zeros(shape[0]*shape[1], dtype=np.uint8)\n    for start, end in zip(starts, ends):\n        img[start:end] = 1\n    return img.reshape(shape).T  # Needed to align to RLE direction\n\n\nfor _ in range(1):\n    fig, axes = plt.subplots(3, 4, figsize=(12, 12))\n    train_sample = train[~train.EncodedPixels.isna()].sample(3)\n\n    for i, image_id in enumerate(train_sample.ImageId):\n        img = imread(f'../input/train_v2/{image_id}')\n        mask_shape = img.shape[:-1]\n        mask = np.zeros(mask_shape)\n\n        encoded_pixels_list = train[train.ImageId == image_id].EncodedPixels.tolist()\n        for encoded_pixels in encoded_pixels_list:\n            mask += rle_decode(encoded_pixels, mask_shape)\n        \n        #skimage.measure.label: Label connected regions of an integer array.\n        #use sample:http://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.label\n        lbl = label(mask) \n        #skimage.measure.regionprops:Measure properties of labeled image regions. input is the labeled image\n        props = regionprops(lbl)\n        img_1 = img.copy()\n        for prop in props:\n            #regionprops.bbox : tuple Bounding box (min_row, min_col, max_row, max_col) of the labeled image\n            cv2.rectangle(img_1, (prop.bbox[1], prop.bbox[0]), (prop.bbox[3], prop.bbox[2]), (255, 0, 0), 2)\n\n        row = i//1\n        col = 0\n        axes[row][col].axis('on')\n        axes[row][col+1].axis('on')\n        axes[row][col+2].axis('on')\n        axes[row][col+3].axis('on')\n        axes[row][col].imshow(img)\n        axes[row][col+1].imshow(mask)\n        axes[row][col+2].imshow(img)\n        axes[row][col+2].imshow(mask,alpha=0.3)\n        axes[row][col+3].imshow(img_1)\n\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"7422f19cbd3ee9353801717008c8163fbabce479"},"cell_type":"markdown","source":">### Plot images with ships in mask and images with no-ships in mask\n"},{"metadata":{"trusted":true,"_uuid":"23914de15626f0655baa86521c407802de96c273","scrolled":true},"cell_type":"code","source":"fig, axes = plt.subplots(3, 3, figsize=(12, 12))\ntrain_sample = train[train.EncodedPixels.isna()].sample(3)\n\nfor i, image_id in enumerate(train_sample.ImageId):\n    img = imread(f'../input/train_v2/{image_id}')\n    mask_shape = img.shape[:-1]\n    mask = np.zeros(mask_shape)\n\n    row = i // 1\n    col = 0\n    axes[row][col].axis('on')\n    axes[row][col+1].axis('on')\n    axes[row][col+2].axis('on')\n    axes[row][col].imshow(img)\n    axes[row][col+1].imshow(mask)\n    axes[row][col+2].imshow(img)\n    axes[row][col+2].imshow(mask,alpha=0.3)\n    \nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"61b381cd9cab498ea6e6742eb0597ada66bc749e"},"cell_type":"markdown","source":">### EncodedPixels size distribution"},{"metadata":{"trusted":true,"_uuid":"af879ec009ed246e8cda961dc14f096ad3838f22"},"cell_type":"code","source":"def ship_pixel(encodedpixels):\n    if isinstance(encodedpixels, str):\n        rle = np.array(list(zip(*[iter(int(x) for x in encodedpixels.split())]*2)))\n    else:\n        rle = np.array([])\n    if rle.size > 0:\n        return np.sum(rle[:,1])\n    return 0\n\nship_pixels = train.dropna().EncodedPixels.map(lambda x: ship_pixel(x))\n\nsns.distplot(ship_pixels, kde=False)\nplt.xlabel('Ship size (pixels)');\nplt.ylabel('Images');\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a1a0bf63a9e2ba9a9f43597abfd5a4aa6aa065de"},"cell_type":"markdown","source":">### Ship numbers distribution after dropping noship images"},{"metadata":{"trusted":true,"_uuid":"5db0d451d708b52798d3a4f8d2049f6567fc2b3e"},"cell_type":"code","source":"ships_number = train.dropna().groupby('ImageId').count()\nships_number.rename({'EncodedPixels': 'ObjCount'}, axis='columns', inplace=True)\nsns.distplot(ships_number.ObjCount, kde=False)\nplt.xlabel('Number of ships');\nplt.ylabel('Images');","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b67f5f9db25bba52b22819569aacd9b160e85f1d"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"221adc720b01173d6a30e9f3bd8d251d6dca3bca"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cb4afafcb7a31e59cb6f913a09e088cb018fe426"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}