1312 lines
4.2 MiB
Plaintext
Raw Normal View History

2025-04-09 16:05:54 +08:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Inspect Nucleus Training Data\n",
"\n",
"Inspect and visualize data loading and pre-processing code.\n",
"\n",
"https://www.kaggle.com/c/data-science-bowl-2018"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.5/dist-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
" from ._conv import register_converters as _register_converters\n",
"Using TensorFlow backend.\n"
]
}
],
"source": [
"import os\n",
"import sys\n",
"import itertools\n",
"import math\n",
"import logging\n",
"import json\n",
"import re\n",
"import random\n",
"import time\n",
"import concurrent.futures\n",
"import numpy as np\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.patches as patches\n",
"import matplotlib.lines as lines\n",
"from matplotlib.patches import Polygon\n",
"import imgaug\n",
"from imgaug import augmenters as iaa\n",
"\n",
"# Root directory of the project\n",
"ROOT_DIR = os.getcwd()\n",
"if ROOT_DIR.endswith(\"samples/nucleus\"):\n",
" # Go up two levels to the repo root\n",
" ROOT_DIR = os.path.dirname(os.path.dirname(ROOT_DIR))\n",
" \n",
"# Import Mask RCNN\n",
"sys.path.append(ROOT_DIR)\n",
"from mrcnn import utils\n",
"from mrcnn import visualize\n",
"from mrcnn.visualize import display_images\n",
"from mrcnn import model as modellib\n",
"from mrcnn.model import log\n",
"\n",
"import nucleus\n",
"\n",
"%matplotlib inline "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# Comment out to reload imported modules if they change\n",
"# %load_ext autoreload\n",
"# %autoreload 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Configurations"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Dataset directory\n",
"DATASET_DIR = os.path.join(ROOT_DIR, \"datasets/nucleus\")\n",
"\n",
"# Use configuation from nucleus.py, but override\n",
"# image resizing so we see the real sizes here\n",
"class NoResizeConfig(nucleus.NucleusConfig):\n",
" IMAGE_RESIZE_MODE = \"none\"\n",
" \n",
"config = NoResizeConfig()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Notebook Preferences"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def get_ax(rows=1, cols=1, size=16):\n",
" \"\"\"Return a Matplotlib Axes array to be used in\n",
" all visualizations in the notebook. Provide a\n",
" central point to control graph sizes.\n",
" \n",
" Adjust the size attribute to control how big to render images\n",
" \"\"\"\n",
" _, ax = plt.subplots(rows, cols, figsize=(size*cols, size*rows))\n",
" return ax"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dataset\n",
"\n",
"Download the dataset from the competition Website. Unzip it and save it in `mask_rcnn/datasets/nucleus`. If you prefer a different directory then change the `DATASET_DIR` variable above.\n",
"\n",
"https://www.kaggle.com/c/data-science-bowl-2018/data"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Image Count: 639\n",
"Class Count: 2\n",
" 0. BG \n",
" 1. nucleus \n"
]
}
],
"source": [
"# Load dataset\n",
"dataset = nucleus.NucleusDataset()\n",
"# The subset is the name of the sub-directory, such as stage1_train,\n",
"# stage1_test, ...etc. You can also use these special values:\n",
"# train: loads stage1_train but excludes validation images\n",
"# val: loads validation images from stage1_train. For a list\n",
"# of validation images see nucleus.py\n",
"dataset.load_nucleus(DATASET_DIR, subset=\"train\")\n",
"\n",
"# Must call before using the dataset\n",
"dataset.prepare()\n",
"\n",
"print(\"Image Count: {}\".format(len(dataset.image_ids)))\n",
"print(\"Class Count: {}\".format(dataset.num_classes))\n",
"for i, info in enumerate(dataset.class_info):\n",
" print(\"{:3}. {:50}\".format(i, info['name']))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Display Samples"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1008x1008 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAy8AAAGGCAYAAAByob4/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzsvX+sbd11HTT3O+f7Ykdu3QABN4EICqn4Ucm1YjVK49BQkCAGfYiqToQpkVCQKqSYGpCaBKUyaSRShUoEbLX8aHAQ1JBGAukjP9oov1rbTQ0xxqg0oFotihSI2qSOTJSv/t49b/PHu/O+ccYdY6513rvv3n3unUM6OufsvfZac8219jljzPVjL+u6RqPRaDQajUaj0WhsHY/u2oBGo9FoNBqNRqPRmEGLl0aj0Wg0Go1Go3EWaPHSaDQajUaj0Wg0zgItXhqNRqPRaDQajcZZoMVLo9FoNBqNRqPROAu0eGk0Go1Go9FoNBpngRYvjc1jWZZ/eFmWn6Jjn3uOfH58WZZ3XX5+77Isn1+WZbn8/v3LsvzrE3n8N8uy/NyyLL+wLMu/A8e/ZlmWn1yW5WeXZfn+y2PLsiwfXpbl48uy/OiyLH9Pke/vXJblL1/m/cllWd4J575jWZafujz3+8EnP3OZ9t8/1ReNRqPRuN9YluWHlmV5z13b0WjcNPZ3bUCjcYv4RER8fUR85vL90xHxT0XEX738/qcm8vi2dV3fXJZlHxG/uCzLn4mIL0bEn4iIP7Cu6/8Haf/5iPjSdV2/YVmWb42IPxoR32ny/RsR8fXruq6XAuW7I+J9y7J8U0S8fV3Xf47S/4mI+NC6rh+/FDb/w7qu/+eE/Y1Go9FoNBpnix55adwbLMvyp5Zl+dZlWR4ty/IXlmX5WkryiYjIKNQ7I+JPR8R7lmX5koj4B9Z1/b9HZazr+ublx7dExC9FxG9GxNdFxG9ExMcuR0O+4TLN74uIH738/D9FxO+7HI15fVmWb1yW5UuXZfn5ZVn+kXVdL9ZnT4z9rRHxv19+/uaIeMuyLD99Oerz9svjv3td149ffv6xy7IajUajcU9wOcL+6WVZ/ttlWf7XZVk+uCzLf7Asyx+6PP+eZVl+6PLzOy9H539uWZb/TuT1gctZAD+/LMu/eXnM5fUnL9P97LIs33Jb9W00ZtEjL41zwdcsy/JzgzT/bkT8TDwdRfnpdV0/Ref/54j4r5ZleSUi1oj4eET8yXg68vK/REQsy/J1EfF9Iu8/vq7rz1ym+ZF4Khb+9Lquh2VZviKeiqHfHRG/JSJ+elmWfyIi/t6I+Pzl9b8eEV92ObLybRHx4xHxuYj4j9d1/ZuX+X5NRHwkIr4qIv7A5XVfERG/tq7rP7ssy7dHxHfF09EbDDz8ekS8Y+CbRqPRaJwffntEfENEPImIX4yI/9qk+8/i6cyAv7Ysyw5PXP4f/QsR8U/H0/+Ojy/L8j8WZX5TRLxzXdeLZVk6yN3YHFq8NM4Fn8apU2rNy7quf3dZlo9GxPfH0x98df5vxVNh8Jl1Xf/WsizviKejMZ+4TPPzEfGNlSHrur5vWZYvjYi/tCzLD0fE34mIv7yu6xci4gvLsvxqRHz55fHfdnnZ2+NSyKzr+reXZfnJiPhX1nX9VyHfT0fE1y3L8nviqYj5PZd5/PnLJH8+Iv7Ty89PwKS3X6ZrNBqNxv3CL67r+psREcuyHOJp4C2xwOe/b13XvxYRsa7rgfL4XRHxT0bEz15+/60R8Q8VeX1nPA30PYmI/ygi/o8XrUSjcZNoRd24N1iW5bdHxLdFxPdGxH9okn0inq49+eTl9/8nIt4XT0dhYlmWr4Ohd3z9/sspX69eXvd3I+KNy9enIuJ3LsuyX5blt0TE3x8RvxYRfzEi3nuZ/r2X32NZlt8VEb83Il5fluXfvjz2FrDx1+PpdLSIiJ+LiHdffn53PB2tiYj47LIsv/fy8zdFxF+a8VGj0Wg0zgorff87EfEPXn7+Gjj+t5dl+ccjIsRoyS/G07We/8y6rt8YEe9a1/V/U3kty7JExE+t6/qtEfFnIuKP31A9Go0bQ4+8NO4FLn+sPxoRH1zX9a8sy/LfL8vy3nVdf5ySfiIi/r2I+CuX3z8ZEf9yPJ06Vo68XE43+8mnv+3xakT8OZjy9eF4KjReiYjvuJxO9hci4l9aluXjEfGFiPjWZVneGhH/RUT8oXi6ZuYnL89/xbIs3xERGTH74OX7D0XEf7ksy89GxOOI+NbL498VET94KaZ+Yl3XXzzFX41Go9E4S/y5eBr4+oaI+Jtw/N+KiP98WZY1Iv7fiMBR/b+6PN2x8y9ejt68sSzLayavfUT8xOX/3FuixUtjg1ierRFuNBqNRqPRaDQaje2ip401Go1Go9FoNBqNs0CLl0aj0Wg0Go1Go3EWaPHSaDQajUaj0Wg0zgItXhqNRqPRaDQajcZZoMVLo9FoNBqNRqPROAtsYqvk/X6/LssS67rG6N0B00XEVVq8Ls8hMM+qrMoe9xmvVUB73bWcD6fP748ePbpWDvoCbc4y8jO+VF0433Vd49GjR7aeed2jR4/kebQ98+dzWB9+57Lxem5/15eePMFnPMZR2idPnly9s18uLi7icDhYn50K5V+sF57Peu73+9jtdrHb7a78lP5O2zmffHGboK+yzplP5ceIZ30O7XP2pC8ZeR79nmWgrdwn13U9asNsE5XmcDjE4XC4yoevVXVTvkP78T7ic+mDbCNuvydPnhwdx3NcNvoJsdvtYl3Xq3rnPZHtl/XFtvy1X/s13dEaU3jru769t+Z8oPj6b/vX7tqEk/DJH/yzd21CvO1d33DXJpwVfuMzH7+zst/5Le8rz/8n73vnLVkS8bX/6G+b+p/ahHjBP38mEHg802I6Pu8ICOfnylbH1TmVjsm7qheT0cou9Tm/J7FDgofEEY8hyUZSykSuEmbO76pueQ4JVyXwkLglKUOblXjK65jUObHFdWa72P+OCDOpr4QpiiwlcLgeKi/V9kl++Tzblsg+wsIA250/qzbP89jnWIBie6GAdfcCfmchlK/D4SDvFcwjy+F7GYl8tqESndhnud6ujdk32B4pMGeFOZ5XwlqlUf0nBQ3WF+vXaNw1/sUP/BvDND/24Y/egiXzYDFwbmLmLvAbn/l4C5iNYyRaEn/kRz4bEbcrYkbYhHiJuD5KgMfyOKZxUASRCRYfz7Jm/+CVqGHbqkguk0ElaFRdkThmXRwRSuKIpG5d1yvSm0Q8r2dirgiZO471UHVWPnMCg33Fworrw3lilFy1E4sE7AcoCNXIgxI/eE61HeaPgsb1beUTzA9HRlCYuvLTh1xutrcTotwOLMZSQB0Oh6M+iCMp7Df2K4tqFi4otJTgVPdc1nW3212NuqD45DI5T/QB1kn5NcF9almWq1ExFrBYP0zPfdYJ7TynxBqPLqFPRoKo0XiZmBEsVfqtipkWMY2HhBQxiZsWM9/4B7873vjMR6bSbkK8sIiI8AJFRYT5D14RMpUnE8uK0Dg7M5/KXryWiYvKDz/z1Bw13QRJIR7jvBBJrJBssqBiOGGl/OryUe3LpBqPOaJaCSBOo0j66Do+70QL1wvTc/0UQeW2VCMwSuyyXZVoy3xTuGJ5qs54rBIOKRSQSHM5OJKG7YBioiL5yj4lWvI7lsfXIVgUV23LZbiAQ37Ge1b1UxwhZYGe7zytLd/TXxcXF0fn0Z9ZP76u0bgtnCpWZvLbmoCJ2KaI2cKUscbDwE2MyHzjH/zu57pu2cKf2quvvnplRGWPEiuJkehRkVU+7q6pyuTzjuRU5eB1+BlJEI4KYF5qrQuWz35R6xCS+BwOh2ukh/M7xT9VXZUgwdEBbJ8UbElMWQAiecY8FCGPeBYpV+t2OB0KhIuLi2sjB67uSrQ6jM6rKD2uecG+4dqJ+xDWAW3Ic24aW57DaWuq/tlm+/3+mh/X9XiUAPs7f8/+yv5Eu/N89o+IZ2tgcr1LrlXiemMbsK/xHPcrvufRx7vdLl599dWrdjocDke2cf/Fdkr/Yt3YFiUA+bPq+2+88Ua
"text/plain": [
"<Figure size 1008x1008 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1008x1008 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1008x1008 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Load and display random samples\n",
"image_ids = np.random.choice(dataset.image_ids, 4)\n",
"for image_id in image_ids:\n",
" image = dataset.load_image(image_id)\n",
" mask, class_ids = dataset.load_mask(image_id)\n",
" visualize.display_top_masks(image, mask, class_ids, dataset.class_names, limit=1)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"molded_image shape: (256, 320, 3) min: 28.00000 max: 232.00000 uint8\n",
"mask shape: (256, 320, 42) min: 0.00000 max: 1.00000 bool\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6gAAAL3CAYAAACH7mi+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzsvXe8XVd1LTzW2vucc++VrrqLZMuSewX3Ajb9JTGQACmkEiCQL5SQ5IV8vIQkQEIIj0ACafDSILyE5OWlfC+PBILpBgzYMa7YcpcsF1my+m3nnF3W98eec6+xdI4wGNu6tubgJ+72PnuvvXqbY43pQggwGAwGg8FgMBgMBoPhUMMf6ggYDAaDwWAwGAwGg8EA2ALVYDAYDAaDwWAwGAyLBLZANRgMBoPBYDAYDAbDooAtUA0Gg8FgMBgMBoPBsChgC1SDwWAwGAwGg8FgMCwK2ALVYDAYDAaDwWAwGAyLArZANRgMBoPBYDAYDAbDooAtUA0Gg8FgMBgMBoPBsChgC1SDwWAwGAwGg8FgMCwK2ALVYDAYDAaDwWAwGAyLArZANRgMBoPBYDAYDAbDooAtUA0Gg8FgMBgMBoPBsChgC1SDwWAwGAwGg8FgMCwK2ALVYDAYDAaDwWAwGAyLArZANRgMBoPBYDAYDAbDooAtUA0Gg8FgMBgMBoPBsChgC1SDwWAwGAwGg8FgMCwK2ALVYDAYDAaDwWAwGAyLArZANRgMBoPBYDAYDAbDooAtUA0Gg8FgMBgMBoPBsChgC1SDwWAwGAwGg8FgMCwK2ALVYDAYDAaDwWAwGAyLArZANRgMBoPBYDAYDAbDooAtUA0Gg8FgMBgMBoPBsChgC1SDwWAwGAwGg8FgMCwK2ALVYDAYDAaDwWAwGAyLArZANRgMBoPBYDAYDAbDooAtUA0Gg8FgMBgMBoPBsChgC1SDwWAwGAwGg8FgMCwK2ALVYDAYDAaDwWAwGAyLArZANRgMBoPBYDAYDAbDooAtUA0Gg8FgMBgMBoPBsChgC1SDwWAwGAwGg8FgMCwK5Ic6Ak8UvvTpG4Jed9wQAJCH+LtDFq99AQDY78v23oxk1STq9t5kN67v87z5vVu5GGjl6XICAJBNdNp73c4AAFDn8Tu1i+FXoT4wGPSy+Gwv9Jrf64n2Xlk36fAxGEDSAwABzft1iOnNKB86Ev+8otclSVWH0pPFdHg016GKHy3p+4Os+b5zBb3TJjLeCzH8IjT5WVDkMsT3s7qJVObod3o/c821o/IqXJP2Mo9l1KtiPkwN+k1865jH/U5MZ91t4hSymDlZ3Xy/M4jf9kOqA1lTxgWG7a0K3fa6I+UwMYzfmes2v8914ne6Iaa9i8kmPj6GU4d+/L6bl7jFtAdIWG4qPifhAIALze89N2jv9aguLkg2D6rYZWRSdsHFtFO1Ql01YXXcXHzH9eLvEv/0fbqW7xc+3iulHfbK+KEOYnktSH2Yr2O9mBrGfJxA01Z8xvnQ5F2RL8Rv+xjPKjRl40LMD0ff7Mq3hvEWBhLngvJjmMX3c6mXGdX/vIj1xtUD+XYsj2rY1IG5Mn5ozsd3Mmm0nRDjjkFM59A1eTfVi/nZWxLjNN1rrpeHmF99iXPZj3UN85QoaXMVlceQ2uS8dF5FP9b/hX1N/Pv74nfqYfz9uL86GZ39HTjqS1052rdQdsOF5pvOxXc8xcNLHfOUX576llqyhLrCto/iXdxAT2iMqNtDxZ11G2h8p61D1LY89VHOAQtrZrHjhXe397rd2LaznvSldczvWepPZqWMfR37E1c3+byU+oOpToxTOd3kSTUVwxxkMcz57lIAwCr6feXKJvenl8RSWElJH6Cpgws0EM1Q29YeoeuoHUlOh5LGlkF8vyvjWCfEuIWa+hMZZ0IW6xJkvBwglnuJOF72pG1P1LGd1RWNx3kTpqexp1PGbw7zJi5lFsMPclnXMb3dEH+flPAD1eCS8k4fDVwvZC7iENuMlisA1FIH5mlMWKC2MCnvT9HYBukXA9XwukNtTr4/Q/3SzAKNQ/2mXnZKamc6qcrj2JKH2Afl0g4XJuM3aehDXsq4Tn2Yq5s0uTyWa8hjPDSZE9QOuzTeavQLH+tvTuWVSwBDKi/tjjy190B12fsm72jogvM8F2kC8DSeZlJvPNWf2sXxVMe2gNjeQz0fPyB5kgUagyXuncD9HvWVEueC6n9G/Z5r79O4K/cqGpuGbrSOJGHSeAudExU8d3PyLo0dNJfVuuZrjgeN+zIOVTnNaSqapOoYT7dyyYcOOI9j3uvY3KF5fofmdkHS4QbULxZNZZ3txbQtpbo4XWvY8Zt14HGs+eur0Tl/lfM8nceM5rpyMR4F9e/5sOnPHJWRy5vrPMTvVNTfDPNMvh3jeel5p9LEdXHALKgGg8FgWBRY9bUjsHzT8malyP/g2n/tVXDxX/IEZDo05p3v6H8SThIX1/5zAc2/Md9u4tf8S9MhGHcPgC89Vt+6Dt1dUzAYDAaD4XDFYWNBNRgMBsPixaqvHYGjP3Esdp2/C9WSEp5ZCYO4sz0Qi02frQZi9fVkbc/IotER60mekxWlS5YGGQmZeJLL6pEZJjWtKCu5HvJG/pCG1EIsImS59LqjTZbDnK69B6pOhSOv2oD7X7IJBoPBYDAcjjhsFqj1IJrPS6fUFqJvEK0NQs+oaqKRKI2PaKpFZ2l73es0WckUhJwofZm85wqiMCj1iylgWZxAeaVu0e8gekcldoIQmCqhVE7QO0QLkrR7mhQ5ooQEoesqrRGIk7aapm91MpUTegZRCDxxLXL5vqN4tHPHhP7GeSPXNYfJEz2xkXA6HdEzmOvRht887EuiRoVIBepLpEqiUgTHlCqhWVHeBKGMlJ7SlvG3O/Idfodpgs2zBdG8dd6dEd3FUVNtKWBJvaBPjqHt6EtMG2MqkQZQcJug75dSHoE4vG39o7zmuqhUoTJESl1NVPpwgPVIAh2JE1PUNWl1HQuemEgt5apLgXtaqNRanj6Wu1P6NFPmuE1pXeMIE31UGW4VVUal7TDFvEMRzSQspkaFwGlqvl+U1G8Nmt/nB5GmNEOMPSd0SL9AxxWo36skzv1JordNx+v5qeZ6rktl1GvqredFVkl555RSSPUzRgleCowHmo6UB/eVx/zpyVhyx3LsvWQHMFkhQ5rfTNftlNoAmHKtlDtqh1T9ldnL9xzRGb3QT7kvdJoSShBT/jRKgXlIjjlmMs5QGcf+mcYGz3XVA8tLeJ8hX9lJPwSgkL6JhiZUcqRg57Id+I3X/BIGXW7XFLWxd7/VDw306845LFtYgWfc/QL87O2/2MRjGT04Rf2AxCHQcQqfx1rQkzR1KL+UklcnFYjHGaHGcqdP11pfAo8jEljmuM5SHZH+iNseUwu1Dwzgfo/HqTF1Ua4zomHz2FZJH1ol9E6aa0h/xH1H7Otp0yaMEuByqhg9Cj8Lmk5+WtPG6eV8aMrQ1THv+FiU13GSWJtKc+U+F+A+KD8gFUCX+xapbTzeKRs3o/xgumIlnX5yVIRpldLmMo4oXetchunTuW9/jM9RmKglfjROeJqrZNDjL/E7pc4/knGb5yxaf0fvNWFpPKk/0WMwju9RNNu5As3dau7jtF6M5l1NHQP3i17ONDCtmPvIdlqbxGO0k3E89snfMgkoOTsBAMh4XKa6Wkt51GF0Xsp3OD9R6fyZ6MvcjpXiSwFove7wXJTGdZ2X1FTGPKXRGHPTbY+K0ByRO2U3Jh2c4cEP5Dlqu5L5fAyGy0PDzMLoPHkx4bBZoBoMBoNh8WH6mpXt4rRaWrYTB8O3j53LduC3X/UWrNt5HI7ZsaHdVAHiZiAvCvgsbogrgBY8Oa1l4p9lDretvRFXnvIf+Mm7X4OpMm7QGgwGg8HwWOKwWaCyBVV3ohJBIt7NKUWghIQ7nFgNhj7uTg/yKEgw1W3ODAUSHZmYJGuqbN27giwN7Td5h50sqE4OPyfbeBRntcrSPkl7UJ/nePXojhsLFjk3ar2r6BB2NCSw9W10pypLLKi86yo7UWwR0dcd75jxNyW/EusD7/y
"text/plain": [
"<Figure size 1152x1152 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Example of loading a specific image by its source ID\n",
"source_id = \"ed5be4b63e9506ad64660dd92a098ffcc0325195298c13c815a73773f1efc279\"\n",
"\n",
"# Map source ID to Dataset image_id\n",
"# Notice the nucleus prefix: it's the name given to the dataset in NucleusDataset\n",
"image_id = dataset.image_from_source_map[\"nucleus.{}\".format(source_id)]\n",
"\n",
"# Load and display\n",
"image, image_meta, class_ids, bbox, mask = modellib.load_image_gt(\n",
" dataset, config, image_id, use_mini_mask=False)\n",
"log(\"molded_image\", image)\n",
"log(\"mask\", mask)\n",
"visualize.display_instances(image, bbox, mask, class_ids, dataset.class_names,\n",
" show_bbox=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dataset Stats\n",
"\n",
"Loop through all images in the dataset and collect aggregate stats."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total time: 59.5 seconds\n"
]
}
],
"source": [
"def image_stats(image_id):\n",
" \"\"\"Returns a dict of stats for one image.\"\"\"\n",
" image = dataset.load_image(image_id)\n",
" mask, _ = dataset.load_mask(image_id)\n",
" bbox = utils.extract_bboxes(mask)\n",
" # Sanity check\n",
" assert mask.shape[:2] == image.shape[:2]\n",
" # Return stats dict\n",
" return {\n",
" \"id\": image_id,\n",
" \"shape\": list(image.shape),\n",
" \"bbox\": [[b[2] - b[0], b[3] - b[1]]\n",
" for b in bbox\n",
" # Uncomment to exclude nuclei with 1 pixel width\n",
" # or height (often on edges)\n",
" # if b[2] - b[0] > 1 and b[3] - b[1] > 1\n",
" ],\n",
" \"color\": np.mean(image, axis=(0, 1)),\n",
" }\n",
"\n",
"# Loop through the dataset and compute stats over multiple threads\n",
"# This might take a few minutes\n",
"t_start = time.time()\n",
"with concurrent.futures.ThreadPoolExecutor() as e:\n",
" stats = list(e.map(image_stats, dataset.image_ids))\n",
"t_total = time.time() - t_start\n",
"print(\"Total time: {:.1f} seconds\".format(t_total))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Image Size Stats"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Image Count: 639\n",
"Height mean: 332.27 median: 256.00 min: 256.00 max: 1024.00\n",
"Width mean: 373.72 median: 256.00 min: 256.00 max: 1272.00\n",
"Color mean (RGB): 41.55 37.83 46.13\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1152x288 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Image stats\n",
"image_shape = np.array([s['shape'] for s in stats])\n",
"image_color = np.array([s['color'] for s in stats])\n",
"print(\"Image Count: \", image_shape.shape[0])\n",
"print(\"Height mean: {:.2f} median: {:.2f} min: {:.2f} max: {:.2f}\".format(\n",
" np.mean(image_shape[:, 0]), np.median(image_shape[:, 0]),\n",
" np.min(image_shape[:, 0]), np.max(image_shape[:, 0])))\n",
"print(\"Width mean: {:.2f} median: {:.2f} min: {:.2f} max: {:.2f}\".format(\n",
" np.mean(image_shape[:, 1]), np.median(image_shape[:, 1]),\n",
" np.min(image_shape[:, 1]), np.max(image_shape[:, 1])))\n",
"print(\"Color mean (RGB): {:.2f} {:.2f} {:.2f}\".format(*np.mean(image_color, axis=0)))\n",
"\n",
"# Histograms\n",
"fig, ax = plt.subplots(1, 3, figsize=(16, 4))\n",
"ax[0].set_title(\"Height\")\n",
"_ = ax[0].hist(image_shape[:, 0], bins=20)\n",
"ax[1].set_title(\"Width\")\n",
"_ = ax[1].hist(image_shape[:, 1], bins=20)\n",
"ax[2].set_title(\"Height & Width\")\n",
"_ = ax[2].hist2d(image_shape[:, 1], image_shape[:, 0], bins=10, cmap=\"Blues\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Nuclei per Image Stats"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Nuclei/Image\n",
"Image area <= 256**2: mean: 28.7 median: 22.0 min: 1.0 max: 101.0\n",
"Image area <= 600**2: mean: 34.5 median: 25.0 min: 1.0 max: 151.0\n",
"Image area <= 1300**2: mean: 103.0 median: 101.0 min: 4.0 max: 375.0\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1152x288 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Segment by image area\n",
"image_area_bins = [256**2, 600**2, 1300**2]\n",
"\n",
"print(\"Nuclei/Image\")\n",
"fig, ax = plt.subplots(1, len(image_area_bins), figsize=(16, 4))\n",
"area_threshold = 0\n",
"for i, image_area in enumerate(image_area_bins):\n",
" nuclei_per_image = np.array([len(s['bbox']) \n",
" for s in stats \n",
" if area_threshold < (s['shape'][0] * s['shape'][1]) <= image_area])\n",
" area_threshold = image_area\n",
" if len(nuclei_per_image) == 0:\n",
" print(\"Image area <= {:4}**2: None\".format(np.sqrt(image_area)))\n",
" continue\n",
" print(\"Image area <= {:4.0f}**2: mean: {:.1f} median: {:.1f} min: {:.1f} max: {:.1f}\".format(\n",
" np.sqrt(image_area), nuclei_per_image.mean(), np.median(nuclei_per_image), \n",
" nuclei_per_image.min(), nuclei_per_image.max()))\n",
" ax[i].set_title(\"Image Area <= {:4}**2\".format(np.sqrt(image_area)))\n",
" _ = ax[i].hist(nuclei_per_image, bins=10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Nuclei Size Stats"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Image Area <= 256**2\n",
" Total Nuclei: 9383\n",
" Nucleus Height. mean: 14.14 median: 13.00 min: 2.00 max: 60.00\n",
" Nucleus Width. mean: 14.37 median: 13.00 min: 2.00 max: 61.00\n",
" Nucleus Area. mean: 231.92 median: 168.00 min: 24.00 max: 2880.00\n",
"\n",
"Image Area <= 600**2\n",
" Total Nuclei: 7078\n",
" Nucleus Height. mean: 28.65 median: 23.00 min: 2.00 max: 120.00\n",
" Nucleus Width. mean: 29.74 median: 24.00 min: 1.00 max: 117.00\n",
" Nucleus Area. mean: 1094.10 median: 546.00 min: 21.00 max: 13560.00\n",
"\n",
"Image Area <= 1300**2\n",
" Total Nuclei: 11023\n",
" Nucleus Height. mean: 25.89 median: 26.00 min: 2.00 max: 91.00\n",
" Nucleus Width. mean: 25.91 median: 26.00 min: 3.00 max: 88.00\n",
" Nucleus Area. mean: 751.73 median: 693.00 min: 21.00 max: 5120.00\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1152x288 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Nuclei size stats\n",
"fig, ax = plt.subplots(1, len(image_area_bins), figsize=(16, 4))\n",
"area_threshold = 0\n",
"for i, image_area in enumerate(image_area_bins):\n",
" nucleus_shape = np.array([\n",
" b \n",
" for s in stats if area_threshold < (s['shape'][0] * s['shape'][1]) <= image_area\n",
" for b in s['bbox']])\n",
" nucleus_area = nucleus_shape[:, 0] * nucleus_shape[:, 1]\n",
" area_threshold = image_area\n",
"\n",
" print(\"\\nImage Area <= {:.0f}**2\".format(np.sqrt(image_area)))\n",
" print(\" Total Nuclei: \", nucleus_shape.shape[0])\n",
" print(\" Nucleus Height. mean: {:.2f} median: {:.2f} min: {:.2f} max: {:.2f}\".format(\n",
" np.mean(nucleus_shape[:, 0]), np.median(nucleus_shape[:, 0]),\n",
" np.min(nucleus_shape[:, 0]), np.max(nucleus_shape[:, 0])))\n",
" print(\" Nucleus Width. mean: {:.2f} median: {:.2f} min: {:.2f} max: {:.2f}\".format(\n",
" np.mean(nucleus_shape[:, 1]), np.median(nucleus_shape[:, 1]),\n",
" np.min(nucleus_shape[:, 1]), np.max(nucleus_shape[:, 1])))\n",
" print(\" Nucleus Area. mean: {:.2f} median: {:.2f} min: {:.2f} max: {:.2f}\".format(\n",
" np.mean(nucleus_area), np.median(nucleus_area),\n",
" np.min(nucleus_area), np.max(nucleus_area)))\n",
"\n",
" # Show 2D histogram\n",
" _ = ax[i].hist2d(nucleus_shape[:, 1], nucleus_shape[:, 0], bins=20, cmap=\"Blues\")"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Nucleus Aspect Ratio. mean: 1.08 median: 1.00 min: 0.10 max: 8.17\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1080x360 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Nuclei height/width ratio\n",
"nucleus_aspect_ratio = nucleus_shape[:, 0] / nucleus_shape[:, 1]\n",
"print(\"Nucleus Aspect Ratio. mean: {:.2f} median: {:.2f} min: {:.2f} max: {:.2f}\".format(\n",
" np.mean(nucleus_aspect_ratio), np.median(nucleus_aspect_ratio),\n",
" np.min(nucleus_aspect_ratio), np.max(nucleus_aspect_ratio)))\n",
"plt.figure(figsize=(15, 5))\n",
"_ = plt.hist(nucleus_aspect_ratio, bins=100, range=[0, 5])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Image Augmentation\n",
"\n",
"Test out different augmentation methods"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# List of augmentations\n",
"# http://imgaug.readthedocs.io/en/latest/source/augmenters.html\n",
"augmentation = iaa.Sometimes(0.9, [\n",
" iaa.Fliplr(0.5),\n",
" iaa.Flipud(0.5),\n",
" iaa.Multiply((0.8, 1.2)),\n",
" iaa.GaussianBlur(sigma=(0.0, 5.0))\n",
"])"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 2304x2304 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Load the image multiple times to show augmentations\n",
"limit = 4\n",
"ax = get_ax(rows=2, cols=limit//2)\n",
"for i in range(limit):\n",
" image, image_meta, class_ids, bbox, mask = modellib.load_image_gt(\n",
" dataset, config, image_id, use_mini_mask=False, augment=False, augmentation=augmentation)\n",
" visualize.display_instances(image, bbox, mask, class_ids,\n",
" dataset.class_names, ax=ax[i//2, i % 2],\n",
" show_mask=False, show_bbox=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Image Crops\n",
"\n",
"Microscoy images tend to be large, but nuclei are small. So it's more efficient to train on random crops from large images. This is handled by `config.IMAGE_RESIZE_MODE = \"crop\"`.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"class RandomCropConfig(nucleus.NucleusConfig):\n",
" IMAGE_RESIZE_MODE = \"crop\"\n",
" IMAGE_MIN_DIM = 256\n",
" IMAGE_MAX_DIM = 256\n",
"\n",
"crop_config = RandomCropConfig()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 2304x2304 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Load the image multiple times to show augmentations\n",
"limit = 4\n",
"image_id = np.random.choice(dataset.image_ids, 1)[0]\n",
"ax = get_ax(rows=2, cols=limit//2)\n",
"for i in range(limit):\n",
" image, image_meta, class_ids, bbox, mask = modellib.load_image_gt(\n",
" dataset, crop_config, image_id, use_mini_mask=False)\n",
" visualize.display_instances(image, bbox, mask, class_ids,\n",
" dataset.class_names, ax=ax[i//2, i % 2],\n",
" show_mask=False, show_bbox=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Mini Masks\n",
"\n",
"Instance binary masks can get large when training with high resolution images. For example, if training with 1024x1024 image then the mask of a single instance requires 1MB of memory (Numpy uses bytes for boolean values). If an image has 100 instances then that's 100MB for the masks alone. \n",
"\n",
"To improve training speed, we optimize masks:\n",
"* We store mask pixels that are inside the object bounding box, rather than a mask of the full image. Most objects are small compared to the image size, so we save space by not storing a lot of zeros around the object.\n",
"* We resize the mask to a smaller size (e.g. 56x56). For objects that are larger than the selected size we lose a bit of accuracy. But most object annotations are not very accuracy to begin with, so this loss is negligable for most practical purposes. Thie size of the mini_mask can be set in the config class.\n",
"\n",
"To visualize the effect of mask resizing, and to verify the code correctness, we visualize some examples."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"image_id: 245 3b957237bc1e09740b58a414282393d3a91dde996b061e7061f4198fb03dab2e\n",
"Original shape: (256, 256, 3)\n",
"image shape: (256, 256, 3) min: 9.00000 max: 255.00000 uint8\n",
"mask shape: (256, 256, 26) min: 0.00000 max: 1.00000 bool\n",
"class_ids shape: (26,) min: 1.00000 max: 1.00000 int32\n",
"bbox shape: (26, 4) min: 0.00000 max: 256.00000 int32\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1152x1152 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Load random image and mask.\n",
"image_id = np.random.choice(dataset.image_ids, 1)[0]\n",
"image = dataset.load_image(image_id)\n",
"mask, class_ids = dataset.load_mask(image_id)\n",
"original_shape = image.shape\n",
"# Resize\n",
"image, window, scale, padding, _ = utils.resize_image(\n",
" image, \n",
" min_dim=config.IMAGE_MIN_DIM, \n",
" max_dim=config.IMAGE_MAX_DIM,\n",
" mode=config.IMAGE_RESIZE_MODE)\n",
"mask = utils.resize_mask(mask, scale, padding)\n",
"# Compute Bounding box\n",
"bbox = utils.extract_bboxes(mask)\n",
"\n",
"# Display image and additional stats\n",
"print(\"image_id: \", image_id, dataset.image_reference(image_id))\n",
"print(\"Original shape: \", original_shape)\n",
"log(\"image\", image)\n",
"log(\"mask\", mask)\n",
"log(\"class_ids\", class_ids)\n",
"log(\"bbox\", bbox)\n",
"# Display image and instances\n",
"visualize.display_instances(image, bbox, mask, class_ids, dataset.class_names)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"image shape: (360, 360, 3) min: 3.00000 max: 50.00000 uint8\n",
"image_meta shape: (14,) min: 0.00000 max: 399.00000 int64\n",
"class_ids shape: (22,) min: 1.00000 max: 1.00000 int32\n",
"bbox shape: (22, 4) min: 0.00000 max: 360.00000 int32\n",
"mask shape: (360, 360, 22) min: 0.00000 max: 1.00000 bool\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1008x720 with 8 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"image_id = np.random.choice(dataset.image_ids, 1)[0]\n",
"image, image_meta, class_ids, bbox, mask = modellib.load_image_gt(\n",
" dataset, config, image_id, use_mini_mask=False)\n",
"\n",
"log(\"image\", image)\n",
"log(\"image_meta\", image_meta)\n",
"log(\"class_ids\", class_ids)\n",
"log(\"bbox\", bbox)\n",
"log(\"mask\", mask)\n",
"\n",
"display_images([image]+[mask[:,:,i] for i in range(min(mask.shape[-1], 7))])"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA5EAAAOICAYAAABPC3XsAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzsnXecHMWZ93/VPTO7klYZCQUUUCAHkYVMDiLJJBMMAoENPoQxDlgEv747h7uzjcHGGO7g7mwfIJINBmMQQQIThEACY5FEklYSQTlLmyZ01/vHbM9011TXVHX37K52n68/WDvdVU89XV1dXfU8T1UzzjkIgiAIgiAIgiAIQgersxUgCIIgCIIgCIIgdh5oEkkQBEEQBEEQBEFoQ5NIgiAIgiAIgiAIQhuaRBIEQRAEQRAEQRDa0CSSIAiCIAiCIAiC0IYmkQRBEARBEARBEIQ2NIkkCIIgCIIgCIIgtKFJJEEQBEEQBEEQBKENTSIJgiAIgiAIgiAIbWgSSRAEQRAEQRAEQWhDk0iCIAiCIAiCIAhCG5pEEgRBEARBEARBENrQJJIgCIIgCIIgCILQhiaRBEEQBEEQBEEQhDY0iSQIgiAIgiAIgiC0oUkkQRAEQRAEQRAEoQ1NIgmCIAiCIAiCIAhtaBJJEARBEARBEARBaEOTSIIgCIIgCIIgCEIbmkQSBEEQBEEQBEEQ2tAkkiAIgiAIgiAIgtCGJpEEQRAEQRAEQRCENjSJJAiCIAiCIAiCILShSSRBEARBEARBEAShDU0iCYIgCIIgCIIgCG1oEkkQBEEQBEEQBEFoQ5NIgiAIgiAIgiAIQhuaRBIEQRAEQRAEQRDa0CSSIAiCIAiCIAiC0IYmkQRBEARBEARBEIQ2qc5WoJbMYDgfwNc7W4+YLALwk/s4uFZqdgoDcBOAY2qpVAfwAPhz93e2EgRBEF2FGWBHAvghALuzdSFiUwDwo/vA/9HZihAEQUSBca43N9nZmMEwrcCaniywJiBk/tVsNyJnrwMAZApD0ccd336GVaTdUvda6e9+uQNg8wapzKy1Di2pRgCA5fZG/8KBgfP+6t6eegcFqxkA0KcwDnXuMCEtRx0GYxt7H3+rL84JGQvqZllW4O9Z2ZH4p9wwOL5r9mfhABqtLDakHQDA0IKN8U6d9FoA4LV0U+nvA/K90VDhvC4KX2fl0Wi3Fa+F2ziw0EsqjwN4J9WCZuYCAMYVMhjmZnxnixKH8AyeS23Bxb0/QaFQ8F1LsTzXLeb3t9+wtiw77smRnVM9E6p8Yn7/vZIdS7oMsW5MyqomW0d/ld7iOa/d1rL/kemqUzdxdVLVnw4697+zMb02k7YRVY4M8V7otG3ZOZPnNyoy2d5zwhhDv31cnPByFoUmgDtyPZqWWsiuL+ap29VFwwQ3tLxNC9JF2WDod2AeqQZ5nWbXWmhqLM5Z0w0c/Q4sSNMBwPZ3Uig0F8vvM76A+l3bZQrqFpoYdrybLv0eOCUXKrO50UZuXbH8zK4O+ox3QtNufi1det33OyCPlPeaFsrPrrPQ0lgs32pw0f+AfPg1vZuG01S8pt7j86jbVV6nhR3FtB6DpuQRZvttWmbBaQV2OcrB29/PYOSZhdLYYP654bZ9VdsMS+dPo9vfh6HzbjQt14SocuL2qbL8JjJl+cLukaxc770ly9/R74mkyjVtS1Fky+REGSf5dU167CJrGzrp8/l87V5GBnRnT+QJLrJwWHNogqy9Fq2plQAAzl3U8+HtZyrvjZcOAHoXxgKuPBI4b29CS2oFACDl9EeDMzFw3t/sWu0vkLe2AgDSbn+keD8hLUcbd9Cbjw69BpETCv1RAEcr83c6wfLX2nl8nioOBFyewnA3jTBWpMov97FOHayK56YofJNVKKUd4NqYGDIx5QC+sHPYyooDgf6uhX485TsL1PNi3WYRPgAiCILoSQw6zAV3gPx2FjrYaFtroWVlccLFOdBrRPhAp2VFMR0DQ+/dHTBL3t/mNlmltJmBHH0mhk/iWr+wkd9a7L/TA1yk+7bLFCeR2y20rCgPP/pNCp/EZdfaaF2ZKl1T/fDw90LLilTpJdt7rAPmvbCE8nObrJJMe4CDhgnhE+O2L1IotF9TaoCDVF95nRa2s8A19Z9UCA0faltroamRofdo9USfIAiiK9OdPZG/zrKN3ytY27Cm/vHSccsKWlFkl19+P3t/yCwFKmtM8JjrqqxXvCJN2cvmot4djgHuJPyt/qhAPpk1y7IsPNuyL8bwerQxF4/VbSmmscKtMTK1eckjqDB0yE6FNKWANdYrw6t/3znOOXZzMzglPxDf6LUM87CpQpbfIueXoyKq9dCkDFn6qJ7IqES5tqieSB3rt6o8HctuUtbIarJUFv0w3XTPhZVlWrc6iPlq2dZ0MPVW6liPo0YVRK2LpNqiyusQ5qX3n7MsC2NnFLD/L3LIrmdY/efw6BHTCASta2TeP5L+Quj4pe8NVX6vLrw0otUzBF5+YQXyS/No6M/KiXzZWLAsmR5Cu1O1Q/8513Ux4qwCPvyFjS8eTWHKI1kAwKtfSVfkk/3W6S+iehd1PJmqfsvkeTHpd5OMgKhFvih0xNjAFB0vqYoo16Tbt4fJVHkLo7bNWmLyTMl0zuVyXeJCurMnskfyvt2CSfkGrEF4eFBXoy+3YHOGgW4KZ+QHYnrvT/BialtxxQhB+MjYHCP7FTvWza0M29q6RD9KEB1C22qG9S/Ta5sgCILofOhttBPQwMdjSvZRvFZ3XtW0N2VWYnp+KIbzDGwOhCyd6TJMzjfgiEJftDIXDjieTG8uTiABPNK2DwDg/PoPOlNFoovQv55jzmU5DG3gyLsMDRmOs2dnsHg1bTJN9AzcHEN+C4MkuIQgCIIgOpQeMYkMRMeUvNpemJB4XJbf/8aWv739SYSISyG/GJ7i/RsM6wzCAfCKUBggGPrkui5yAO5PrcdJzgCcnRuEx9ObwFkgPqdSdMW1sOC5QP0JoT+K0KGSvv5o1vZjLncxudAXw90MDmhYjHVWvhzG64ihvpVrRlRhCqqF06rF1HFDV3Q2nYlKWKhikovbGWN47NJ86D29e6GNuUuL5Z6yB8fMyeFro86dnS7peMvpBYwbJNfz+WUW7l5U7IbGDXLxy9MKkFVVyuIY0RdoKTDMftvGISNd7L8rx4vfyOHNLxi2Z8uZVmy2cMOzmdK1PTo967veoNz/XmRj3rLieq+TJ7qYeUT4NX3l/nKY2a1nOL5rCgqdt9TCXQuLMscP4rjlDIlLvT3LrDk2GjcXdZ95RAFTJ/pk+eqhcRPDrDnlDTkfvzTcTX/O7Orduk5YnL9vSXoTAdUmMuq+MFymR5LhSqKsqM+djo5GYdH+JRaSMMyw9KXwTEkZLm9/pzCJUcbrypmk3JDf2vk13klS0a5wTliOAUjqWfIqrrjHksJUYbBefUnDWBWhvgwMPAsMPYZj9WNh44rqYW067zKdkNUkN9bRCWeMEsYfNZxdpW/UUFkxbdT+MqlQ+VqE85uWJ6bpLMRxXtxlO3GXQ/ip5TixM+jWk0iXtZY2rulJ3NBrJVKc4bWWA3FOfjCesLZ0OY/k5EJf7O/0xpF93sU6K3xTBaLjeOzSzrsPGZvj56cWcOzurnTAmLaAP71n4/NtDF6C5hzD6h3AEaM4sk65sz5ytIuTfZt/jOjnt2KU/2zJA/cvJi8msfOQGcwx8BAHW//RrV/dPYb1L6Uw9PgC9vv3PBacl0axb6v9OjyCIIgk6NYb62zMvPS9bZm3EOyU41p9iv9WVpvfei6cCVj9g8dkn6rwNtnhnKOeD8co51xstBZgQeY8LUu+R72dxu9aJ2B/tzceT2+Cw8ppStZTmUW7dEW84rjKsupZskU53nHvmiYX+mKkk8EZvZdgNbKBc/46eTS3LwDgvMySijQyxLqJ63WUWRhFD7Bs6+2oxLV6mVh0ZWk979a594fv1qujo8r6J6YBihPIBy7MYfxgjpeW29I0LmfY2iZf8N8nzVGXUj2blfoDwMEjXIwa4OKQO+qxta3SGinziJlYYXUt40l
"text/plain": [
"<Figure size 1152x1152 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"visualize.display_instances(image, bbox, mask, class_ids, dataset.class_names)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING:root:'augment' is depricated. Use 'augmentation' instead.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"mask shape: (56, 56, 22) min: 0.00000 max: 1.00000 bool\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1008x720 with 8 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Add augmentation and mask resizing.\n",
"image, image_meta, class_ids, bbox, mask = modellib.load_image_gt(\n",
" dataset, config, image_id, augment=True, use_mini_mask=True)\n",
"log(\"mask\", mask)\n",
"display_images([image]+[mask[:,:,i] for i in range(min(mask.shape[-1], 7))])"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1152x1152 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"mask = utils.expand_mask(bbox, mask, image.shape)\n",
"visualize.display_instances(image, bbox, mask, class_ids, dataset.class_names)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Anchors\n",
"\n",
"For an FPN network, the anchors must be ordered in a way that makes it easy to match anchors to the output of the convolution layers that predict anchor scores and shifts. \n",
"* Sort by pyramid level first. All anchors of the first level, then all of the second and so on. This makes it easier to separate anchors by level.\n",
"* Within each level, sort anchors by feature map processing sequence. Typically, a convolution layer processes a feature map starting from top-left and moving right row by row. \n",
"* For each feature map cell, pick any sorting order for the anchors of different ratios. Here we match the order of ratios passed to the function."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Count: 16368\n",
"Scales: (8, 16, 32, 64, 128)\n",
"ratios: [0.5, 1, 2]\n",
"Anchors per Cell: 3\n",
"Levels: 5\n",
"Anchors in Level 0: 12288\n",
"Anchors in Level 1: 3072\n",
"Anchors in Level 2: 768\n",
"Anchors in Level 3: 192\n",
"Anchors in Level 4: 48\n",
"Level 0. Anchors: 12288 Feature map Shape: [64 64]\n",
"Level 1. Anchors: 3072 Feature map Shape: [32 32]\n",
"Level 2. Anchors: 768 Feature map Shape: [16 16]\n",
"Level 3. Anchors: 192 Feature map Shape: [8 8]\n",
"Level 4. Anchors: 48 Feature map Shape: [4 4]\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"## Visualize anchors of one cell at the center of the feature map\n",
"\n",
"# Load and display random image\n",
"image_id = np.random.choice(dataset.image_ids, 1)[0]\n",
"image, image_meta, _, _, _ = modellib.load_image_gt(dataset, crop_config, image_id)\n",
"\n",
"# Generate Anchors\n",
"backbone_shapes = modellib.compute_backbone_shapes(config, image.shape)\n",
"anchors = utils.generate_pyramid_anchors(config.RPN_ANCHOR_SCALES, \n",
" config.RPN_ANCHOR_RATIOS,\n",
" backbone_shapes,\n",
" config.BACKBONE_STRIDES, \n",
" config.RPN_ANCHOR_STRIDE)\n",
"\n",
"# Print summary of anchors\n",
"num_levels = len(backbone_shapes)\n",
"anchors_per_cell = len(config.RPN_ANCHOR_RATIOS)\n",
"print(\"Count: \", anchors.shape[0])\n",
"print(\"Scales: \", config.RPN_ANCHOR_SCALES)\n",
"print(\"ratios: \", config.RPN_ANCHOR_RATIOS)\n",
"print(\"Anchors per Cell: \", anchors_per_cell)\n",
"print(\"Levels: \", num_levels)\n",
"anchors_per_level = []\n",
"for l in range(num_levels):\n",
" num_cells = backbone_shapes[l][0] * backbone_shapes[l][1]\n",
" anchors_per_level.append(anchors_per_cell * num_cells // config.RPN_ANCHOR_STRIDE**2)\n",
" print(\"Anchors in Level {}: {}\".format(l, anchors_per_level[l]))\n",
"\n",
"# Display\n",
"fig, ax = plt.subplots(1, figsize=(10, 10))\n",
"ax.imshow(image)\n",
"levels = len(backbone_shapes)\n",
"\n",
"for level in range(levels):\n",
" colors = visualize.random_colors(levels)\n",
" # Compute the index of the anchors at the center of the image\n",
" level_start = sum(anchors_per_level[:level]) # sum of anchors of previous levels\n",
" level_anchors = anchors[level_start:level_start+anchors_per_level[level]]\n",
" print(\"Level {}. Anchors: {:6} Feature map Shape: {}\".format(level, level_anchors.shape[0], \n",
" backbone_shapes[level]))\n",
" center_cell = backbone_shapes[level] // 2\n",
" center_cell_index = (center_cell[0] * backbone_shapes[level][1] + center_cell[1])\n",
" level_center = center_cell_index * anchors_per_cell \n",
" center_anchor = anchors_per_cell * (\n",
" (center_cell[0] * backbone_shapes[level][1] / config.RPN_ANCHOR_STRIDE**2) \\\n",
" + center_cell[1] / config.RPN_ANCHOR_STRIDE)\n",
" level_center = int(center_anchor)\n",
"\n",
" # Draw anchors. Brightness show the order in the array, dark to bright.\n",
" for i, rect in enumerate(level_anchors[level_center:level_center+anchors_per_cell]):\n",
" y1, x1, y2, x2 = rect\n",
" p = patches.Rectangle((x1, y1), x2-x1, y2-y1, linewidth=2, facecolor='none',\n",
" edgecolor=(i+1)*np.array(colors[level]) / anchors_per_cell)\n",
" ax.add_patch(p)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Generator"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"# Create data generator\n",
"random_rois = 2000\n",
"g = modellib.data_generator(\n",
" dataset, crop_config, shuffle=True, random_rois=random_rois, \n",
" batch_size=4,\n",
" detection_targets=True)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"# Uncomment to run the generator through a lot of images\n",
"# to catch rare errors\n",
"# for i in range(1000):\n",
"# print(i)\n",
"# _, _ = next(g)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"rois shape: (4, 128, 4) min: 0.00000 max: 255.00000 int32\n",
"mrcnn_class_ids shape: (4, 128, 1) min: 0.00000 max: 1.00000 int32\n",
"mrcnn_bbox shape: (4, 128, 2, 4) min: -3.33333 max: 3.00000 float32\n",
"mrcnn_mask shape: (4, 128, 28, 28, 2) min: 0.00000 max: 1.00000 float32\n",
"gt_class_ids shape: (4, 200) min: 0.00000 max: 1.00000 int32\n",
"gt_boxes shape: (4, 200, 4) min: 0.00000 max: 256.00000 int32\n",
"gt_masks shape: (4, 56, 56, 200) min: 0.00000 max: 1.00000 bool\n",
"rpn_match shape: (4, 16368, 1) min: -1.00000 max: 1.00000 int32\n",
"rpn_bbox shape: (4, 64, 4) min: -6.93147 max: 5.62500 float64\n",
"image_id: 168 edd36ed822e7ed760ff73e0524df22aa5bf5c565efcdc6c39603239c0896e7a8\n"
]
}
],
"source": [
"# Get Next Image\n",
"if random_rois:\n",
" [normalized_images, image_meta, rpn_match, rpn_bbox, gt_class_ids, gt_boxes, gt_masks, rpn_rois, rois], \\\n",
" [mrcnn_class_ids, mrcnn_bbox, mrcnn_mask] = next(g)\n",
" \n",
" log(\"rois\", rois)\n",
" log(\"mrcnn_class_ids\", mrcnn_class_ids)\n",
" log(\"mrcnn_bbox\", mrcnn_bbox)\n",
" log(\"mrcnn_mask\", mrcnn_mask)\n",
"else:\n",
" [normalized_images, image_meta, rpn_match, rpn_bbox, gt_boxes, gt_masks], _ = next(g)\n",
" \n",
"log(\"gt_class_ids\", gt_class_ids)\n",
"log(\"gt_boxes\", gt_boxes)\n",
"log(\"gt_masks\", gt_masks)\n",
"log(\"rpn_match\", rpn_match, )\n",
"log(\"rpn_bbox\", rpn_bbox)\n",
"image_id = modellib.parse_image_meta(image_meta)[\"image_id\"][0]\n",
"print(\"image_id: \", image_id, dataset.image_reference(image_id))\n",
"\n",
"# Remove the last dim in mrcnn_class_ids. It's only added\n",
"# to satisfy Keras restriction on target shape.\n",
"mrcnn_class_ids = mrcnn_class_ids[:,:,0]"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"anchors shape: (16368, 4) min: -90.50967 max: 282.50967 float64\n",
"refined_anchors shape: (32, 4) min: -0.00000 max: 256.00000 float32\n",
"Positive anchors: 32\n",
"Negative anchors: 32\n",
"Neutral anchors: 16304\n",
"BG : 86\n",
"nucleus : 42\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1152x1152 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"b = 0\n",
"\n",
"# Restore original image (reverse normalization)\n",
"sample_image = modellib.unmold_image(normalized_images[b], config)\n",
"\n",
"# Compute anchor shifts.\n",
"indices = np.where(rpn_match[b] == 1)[0]\n",
"refined_anchors = utils.apply_box_deltas(anchors[indices], rpn_bbox[b, :len(indices)] * config.RPN_BBOX_STD_DEV)\n",
"log(\"anchors\", anchors)\n",
"log(\"refined_anchors\", refined_anchors)\n",
"\n",
"# Get list of positive anchors\n",
"positive_anchor_ids = np.where(rpn_match[b] == 1)[0]\n",
"print(\"Positive anchors: {}\".format(len(positive_anchor_ids)))\n",
"negative_anchor_ids = np.where(rpn_match[b] == -1)[0]\n",
"print(\"Negative anchors: {}\".format(len(negative_anchor_ids)))\n",
"neutral_anchor_ids = np.where(rpn_match[b] == 0)[0]\n",
"print(\"Neutral anchors: {}\".format(len(neutral_anchor_ids)))\n",
"\n",
"# ROI breakdown by class\n",
"for c, n in zip(dataset.class_names, np.bincount(mrcnn_class_ids[b].flatten())):\n",
" if n:\n",
" print(\"{:23}: {}\".format(c[:20], n))\n",
"\n",
"# Show positive anchors\n",
"fig, ax = plt.subplots(1, figsize=(16, 16))\n",
"visualize.draw_boxes(sample_image, boxes=anchors[positive_anchor_ids], \n",
" refined_boxes=refined_anchors, ax=ax)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 864x864 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Show negative anchors\n",
"visualize.draw_boxes(sample_image, boxes=anchors[negative_anchor_ids])"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAArgAAAKvCAYAAACBE7wMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzsvXm8HEd57/2rnjmbFu82Glk2O5iwBI4s2QGzh9VHPobc1y+8DnBxfCzhBEJIbnITg2TJQK5vINyExZKOgQCXi0Nego8llsC97BAsWWINMSGLseRzjPdF0llmuuv+UV093TW9VPUy3dPzfD+f85kzNbX1Vv3UU8/zFOOcgyAIgiAIgiDqglV2BwiCIAiCIAgiT0jAJQiCIAiCIGoFCbgEQRAEQRBErSABlyAIgiAIgqgVJOASBEEQBEEQtYIEXIIgCIIgCKJWkIBLEARBEARB1AoScAmCIAiCIIhaQQIuQRAEQRAEUStIwCUIgiAIgiBqBQm4BEEQBEEQRK0gAZcgCIIgCIKoFSTgEgRBEARBELWCBFyCIAiCIAiiVpCASxAEQRAEQdQKEnAJgiAIgiCIWkECLkEQBEEQBFErSMAlCIIgCIIgagUJuARBEARBEEStIAGXIAiCIAiCqBUk4BIEQRAEQRC1ggRcgiAIgiAIolaQgEsQBEEQBEHUChJwCYIgCIIgiFpBAi5BEARBEARRK0jAJQiCIAiCIGoFCbgEQRAEQRBErSABlyAIgiAIgqgVJOASBEEQBEEQtYIEXIIgCIIgCKJWkIBLEARBEARB1AoScAmCIAiCIIhaQQIuQRAEQRAEUStIwCUIgiAIgiBqBQm4BEEQBEEQRK0gAZcgCIIgCIKoFSTgEgRBEARBELWCBFyCIAiCIAiiVpCASxAEQRAEQdQKEnAJgiAIgiCIWkECLkEQBEEQBFErSMAlCIIgCIIgagUJuARBEARBEEStIAGXIAiCIAiCqBUk4BIEQRAEQRC1ggRcQguG13GG13ElbZ+bvsWXdpWbtteXtt5Nm1fKH3LTN/rSrnXTrvWlbXTTDhVycARBEARB1AoScAmCIAiCIIhawTjnybmIoUZqUzluurbcnhAEQRAEQSRDGlxChx3uH0GUD3scB3scV9L2uelbfGlXuWl7fWnr3bSAuQzY4w656Rt9ade6adf60ja6aUFzGfa4eTd9vS9tr5t2lS9tS0/fCYIgiNxplt0BYiDYWXYHAEDa8HLctD4pL1FTBl84vLbsDhAEQQwDZKJADAzSyY3jJlZ2X4iSkJpTfsfG+IwVhT1uHwCA37ElPmN9uQ+MA8AZ4MyXtg/AFIBLzgDf56ZdBWCPmpcgCEIH0uASg8TZZXeAKJlBFWwlQyzYZmC27A4QBDF4kAaXSESG8eK4icJ0EQSRmvvA5gHgDHAyMyIIolBIg1siDFvdJfc9zJfmLdVx7NnnpsmlulmOPVe5aesB3KWWL4jbvO4RBEGkp1V2BwiCGA5IwB18FvrQxuE+tJGI3DyC46arkvISNUVGP+B3DKYGUDrJ8TuGdbJoZGZ0H9h6ADgDfD4pL0EQhB8yUSAGBnIyIzDoAuKg97/PhDmkEQRB6EBxcEuCYetehq17k3MSPra6f8TwcjYG2dmQ38FIuDViAQmrVAzrOcN6ZRvx9fvcdN824uuvctN824ivX++mKduIrz/kpg+2UyNBDDFkolAeM+4nLbdrwnETTQiGHX4HLVUPMPeB7QWAM8C1xj1yRiMIIi1kolASruMYOPakFtoYth5y6yhUy0AbLBAEkQd5mxxIzSvHPI1NBEEEIA1uSWQRbH1M5lCHDpXwfGZ43RYA4LhpX9l9IUpCbrvL7xjMlQ/a6CFvE6NCxyaG9dcCAMf8tUW2QxBE/pCAO9ic36d2qmLzeIv7STaMw8ugm/ZMld2BMjkD3Ghifx/YIbdc1CpV0WPTDvfz2oLbIQgiZ8hEoQAalpV4UvnUuQAAtv/OwvtTF5y5iwAA1vR3Su5JOuSzxhjJ57qo52yGrwYAzLLjpbSflSk+AQDYzxZzqa/u/MoR5/8xVjnPjLNjDQCAXfuo+Cz52aUxpD/I86sjHyXlVX8Pu3ZRv2W53h3bHvqbhATcAtARcB1HKKIsi3ahHBbo5WRO2ees7PbrxsunxPn8yn698/msSZH/x4dJsKxSP+oOCbj1gATcAogScP3nmt/yCgCANf2V1O04O4QJrrWz2H0YHNeHzdpKO/UOIkW9FOllWzwm53gQrkfeGllnz0kAAGvrI7nUl4R/DK/yeR50TATMfvRDkqY/cfeJ+sxGfTepU0ICLgm4haAj4OYxOPZLC+w4l7ntfLbQdohiqJOAO+hL/KYmFnUTcD81J/r4humcBFxnHQDAsu7OpT4VPincVNjhjvhOAm5fIAGXBNw8IAG3AHRMFPKgXxpcPvMEAACb/fdC20limAXtMOGlHwJN1YQmmwvb9Qarru163DnT7X/dBNu0/NEOcWzv2xl+bHxGTHjYbDETnqIF6CiyXNM63w9ZqIrQHEZU37JcQxJwScAthH4JuMMGCbgk4M7xMwEA0+zeknsSTdw5281PAwBsYw+kriNL3kGjdCezg6cDAKxN9/e1XRJw84cE3OGDBNwCqIOTGQ2S1SKLgFv2tVTbtz8jvjde3+3P3B9xTG0Epv8C2O86FM28hGO3GxTMn7dOkCATT5IGNw39NjPo93Ua9PvCPtcdH+70jQ9nckxNANP3AvsX3fFhNcfu04HZY8C2B9IdaxFCb5KjWNj9l3TN0gi+JOACVtkdINLDJ88Anzyj+HamWuBTldjrgRhCZv9P2T0g8uJXDve0sjq8byeLFW751Bicg6fDmTslkO446zzzAi9t7hQ4zjrwqbFu+ZkJkdd1VgMA3rJE2tEztftJEET1oI0eSiIPzS2/7TUAAFawFpjf8ny3neEzDSDy5chHOOYfBM65Oii0TL+vV4iZ/RrD7Nf61bP+0OINAMACs0vuST3gt5wq/pmn81kX/JpbyfS9IePDcYbZ/oTDJgYUEnBLxpl7ObDlsWCX/IO36QOfOQ98z/OB2X+GtVVsasBbq8DvuhyYPw5rw/8ShQ8VZ4cYWALZN19YOyYM+kYPkjRLpGH5qm6aIPG3v/7UbHWFOWlV5Th1OOpuvNWA6H/SkmTcMQ3C8aqY2tImxcGNcv4KS7emH+p+kedudrHHQY0tOGA5OpX1+zoN4n2RhVZD3CMLKVbkdWPX5lFnmry6URVM2x0WSMAdYKxNN/ennaoIlFvWl90DIiMbrjbL3zrVfXk9WI+X9jw6ZXdhoPjqbeLzMWRMNxQcWS+e93Pm9Z/3o+5mzY3qBlYhSoKczAqAoigUg7QDZvsXstdVoNZvkDSKVSfMIY2oH1GaKingvnxTftff/1w6jtOTptO/QWKQ+h7mYJZEGqHYlKIjMJg4poXlD4OczEiDSwwQeQi2xGAx/2DZPSDyxHSjhzwFW6L6nHOX+fUuUrAlBhta+CEAiBli1OzUcS7zYtDWBcZYYRqNIuseZDjn2H2l+NPlnKtZj0NaVYl7hgaFoo/h5VuAx/gsjd4wI6IqvH9vVyv1mBbHPRz48V3F9EEeI+dc+1mV+fxlB4UixqOizsO8nb+/YB7Hrx6rrNOk3rD86n0VlZfeKekgAZcYGPjME7xd1YjBZOal4i8tc/xMb7OHQeQAX4cDfF1yxhrzvp16+dZjIvB9jr8QNr8cU/xsL22GPwk2vxw2v7yn/KXcwaXcCaRdyOdwKXewjk95aY/lM6F5q4Qz4cCZCPbPGZ2DM+GAW91j4Y2Z0LwEMYyQiQIBIN6mx7I+K353Z5pqmX5pM/ie80W7JW8ZTKSDMYZts2ZewypTitBTJXQ0LBsxGppuummHbnumFK0leowlxxBxHJ+aZfiUEuXwVwsMZzBXYGWf7qmDo6t9lcziF5n7dgeSwy0OzIYcnXShI3XH9KKOZfdpol2TjRsOrBNlNt+tt0mCDknnISw9TRk1Lcr2dth3NEwLOZkVQB2dzHR2YSkaZ89GAIC19VBf2iP6jzpIH3iP+/K
"text/plain": [
"<Figure size 864x864 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Show neutral anchors. They don't contribute to training.\n",
"visualize.draw_boxes(sample_image, boxes=anchors[np.random.choice(neutral_anchor_ids, 100)])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ROIs\n",
"\n",
"Typically, the RPN network generates region proposals (a.k.a. Regions of Interest, or ROIs). The data generator has the ability to generate proposals as well for illustration and testing purposes. These are controlled by the `random_rois` parameter."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Positive ROIs: 42\n",
"Negative ROIs: 86\n",
"Positive Ratio: 0.33\n",
"Unique ROIs: 128 out of 128\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 864x864 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"if random_rois:\n",
" # Class aware bboxes\n",
" bbox_specific = mrcnn_bbox[b, np.arange(mrcnn_bbox.shape[1]), mrcnn_class_ids[b], :]\n",
"\n",
" # Refined ROIs\n",
" refined_rois = utils.apply_box_deltas(rois[b].astype(np.float32), bbox_specific[:,:4] * config.BBOX_STD_DEV)\n",
"\n",
" # Class aware masks\n",
" mask_specific = mrcnn_mask[b, np.arange(mrcnn_mask.shape[1]), :, :, mrcnn_class_ids[b]]\n",
"\n",
" visualize.draw_rois(sample_image, rois[b], refined_rois, mask_specific, mrcnn_class_ids[b], dataset.class_names)\n",
" \n",
" # Any repeated ROIs?\n",
" rows = np.ascontiguousarray(rois[b]).view(np.dtype((np.void, rois.dtype.itemsize * rois.shape[-1])))\n",
" _, idx = np.unique(rows, return_index=True)\n",
" print(\"Unique ROIs: {} out of {}\".format(len(idx), rois.shape[1]))"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1008x1224 with 16 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"if random_rois:\n",
" # Dispalay ROIs and corresponding masks and bounding boxes\n",
" ids = random.sample(range(rois.shape[1]), 8)\n",
"\n",
" images = []\n",
" titles = []\n",
" for i in ids:\n",
" image = visualize.draw_box(sample_image.copy(), rois[b,i,:4].astype(np.int32), [255, 0, 0])\n",
" image = visualize.draw_box(image, refined_rois[i].astype(np.int64), [0, 255, 0])\n",
" images.append(image)\n",
" titles.append(\"ROI {}\".format(i))\n",
" images.append(mask_specific[i] * 255)\n",
" titles.append(dataset.class_names[mrcnn_class_ids[b,i]][:20])\n",
"\n",
" display_images(images, titles, cols=4, cmap=\"Blues\", interpolation=\"none\")"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 42 0.33\n",
" 42 0.33\n",
" 42 0.33\n",
" 42 0.33\n",
" 42 0.33\n",
" 42 0.33\n",
" 42 0.33\n",
" 42 0.33\n",
" 42 0.33\n",
" 42 0.33\n",
"Average percent: 0.33\n"
]
}
],
"source": [
"# Check ratio of positive ROIs in a set of images.\n",
"if random_rois:\n",
" limit = 10\n",
" temp_g = modellib.data_generator(\n",
" dataset, crop_config, shuffle=True, random_rois=10000, \n",
" batch_size=1, detection_targets=True)\n",
" total = 0\n",
" for i in range(limit):\n",
" _, [ids, _, _] = next(temp_g)\n",
" positive_rois = np.sum(ids[0] > 0)\n",
" total += positive_rois\n",
" print(\"{:5} {:5.2f}\".format(positive_rois, positive_rois/ids.shape[1]))\n",
" print(\"Average percent: {:.2f}\".format(total/(limit*ids.shape[1])))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}