1291 lines
6.6 MiB
Plaintext
1291 lines
6.6 MiB
Plaintext
|
{
|
||
|
"cells": [
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"# Mask R-CNN - Inspect Nucleus Trained Model\n",
|
||
|
"\n",
|
||
|
"Code and visualizations to test, debug, and evaluate the Mask R-CNN model."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 1,
|
||
|
"metadata": {
|
||
|
"scrolled": false
|
||
|
},
|
||
|
"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 random\n",
|
||
|
"import math\n",
|
||
|
"import re\n",
|
||
|
"import time\n",
|
||
|
"import numpy as np\n",
|
||
|
"import tensorflow as tf\n",
|
||
|
"import matplotlib\n",
|
||
|
"import matplotlib.pyplot as plt\n",
|
||
|
"import matplotlib.patches as patches\n",
|
||
|
"\n",
|
||
|
"# Root directory of the project\n",
|
||
|
"ROOT_DIR = os.path.abspath(\"../../\")\n",
|
||
|
"\n",
|
||
|
"# Import Mask RCNN\n",
|
||
|
"sys.path.append(ROOT_DIR) # To find local version of the library\n",
|
||
|
"from mrcnn import utils\n",
|
||
|
"from mrcnn import visualize\n",
|
||
|
"from mrcnn.visualize import display_images\n",
|
||
|
"import mrcnn.model as modellib\n",
|
||
|
"from mrcnn.model import log\n",
|
||
|
"\n",
|
||
|
"import nucleus\n",
|
||
|
"\n",
|
||
|
"%matplotlib inline \n",
|
||
|
"\n",
|
||
|
"# Directory to save logs and trained model\n",
|
||
|
"LOGS_DIR = os.path.join(ROOT_DIR, \"logs\")"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"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": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"\n",
|
||
|
"Configurations:\n",
|
||
|
"BACKBONE resnet50\n",
|
||
|
"BACKBONE_STRIDES [4, 8, 16, 32, 64]\n",
|
||
|
"BATCH_SIZE 1\n",
|
||
|
"BBOX_STD_DEV [0.1 0.1 0.2 0.2]\n",
|
||
|
"DETECTION_MAX_INSTANCES 400\n",
|
||
|
"DETECTION_MIN_CONFIDENCE 0\n",
|
||
|
"DETECTION_NMS_THRESHOLD 0.3\n",
|
||
|
"GPU_COUNT 1\n",
|
||
|
"GRADIENT_CLIP_NORM 5.0\n",
|
||
|
"IMAGES_PER_GPU 1\n",
|
||
|
"IMAGE_MAX_DIM 512\n",
|
||
|
"IMAGE_META_SIZE 14\n",
|
||
|
"IMAGE_MIN_DIM 512\n",
|
||
|
"IMAGE_MIN_SCALE 2.0\n",
|
||
|
"IMAGE_RESIZE_MODE pad64\n",
|
||
|
"IMAGE_SHAPE [512 512 3]\n",
|
||
|
"LEARNING_MOMENTUM 0.9\n",
|
||
|
"LEARNING_RATE 0.001\n",
|
||
|
"MASK_POOL_SIZE 14\n",
|
||
|
"MASK_SHAPE [28, 28]\n",
|
||
|
"MAX_GT_INSTANCES 200\n",
|
||
|
"MEAN_PIXEL [43.53 39.56 48.22]\n",
|
||
|
"MINI_MASK_SHAPE (56, 56)\n",
|
||
|
"NAME nucleus\n",
|
||
|
"NUM_CLASSES 2\n",
|
||
|
"POOL_SIZE 7\n",
|
||
|
"POST_NMS_ROIS_INFERENCE 2000\n",
|
||
|
"POST_NMS_ROIS_TRAINING 1000\n",
|
||
|
"ROI_POSITIVE_RATIO 0.33\n",
|
||
|
"RPN_ANCHOR_RATIOS [0.5, 1, 2]\n",
|
||
|
"RPN_ANCHOR_SCALES (8, 16, 32, 64, 128)\n",
|
||
|
"RPN_ANCHOR_STRIDE 1\n",
|
||
|
"RPN_BBOX_STD_DEV [0.1 0.1 0.2 0.2]\n",
|
||
|
"RPN_NMS_THRESHOLD 0.7\n",
|
||
|
"RPN_TRAIN_ANCHORS_PER_IMAGE 64\n",
|
||
|
"STEPS_PER_EPOCH 105\n",
|
||
|
"TRAIN_BN False\n",
|
||
|
"TRAIN_ROIS_PER_IMAGE 128\n",
|
||
|
"USE_MINI_MASK True\n",
|
||
|
"USE_RPN_ROIS True\n",
|
||
|
"VALIDATION_STEPS 4\n",
|
||
|
"WEIGHT_DECAY 0.0001\n",
|
||
|
"\n",
|
||
|
"\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Dataset directory\n",
|
||
|
"DATASET_DIR = os.path.join(ROOT_DIR, \"datasets/nucleus\")\n",
|
||
|
"\n",
|
||
|
"# Inference Configuration\n",
|
||
|
"config = nucleus.NucleusInferenceConfig()\n",
|
||
|
"config.display()"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Notebook Preferences"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 4,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"# Device to load the neural network on.\n",
|
||
|
"# Useful if you're training a model on the same \n",
|
||
|
"# machine, in which case use CPU and leave the\n",
|
||
|
"# GPU for training.\n",
|
||
|
"DEVICE = \"/cpu:0\" # /cpu:0 or /gpu:0\n",
|
||
|
"\n",
|
||
|
"# Inspect the model in training or inference modes\n",
|
||
|
"# values: 'inference' or 'training'\n",
|
||
|
"# Only inference mode is supported right now\n",
|
||
|
"TEST_MODE = \"inference\""
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 5,
|
||
|
"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",
|
||
|
" fig, ax = plt.subplots(rows, cols, figsize=(size*cols, size*rows))\n",
|
||
|
" fig.tight_layout()\n",
|
||
|
" return ax"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Load Validation Dataset"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 6,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"Images: 25\n",
|
||
|
"Classes: ['BG', 'nucleus']\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Load validation dataset\n",
|
||
|
"dataset = nucleus.NucleusDataset()\n",
|
||
|
"dataset.load_nucleus(DATASET_DIR, \"val\")\n",
|
||
|
"dataset.prepare()\n",
|
||
|
"\n",
|
||
|
"print(\"Images: {}\\nClasses: {}\".format(len(dataset.image_ids), dataset.class_names))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Load Model"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 7,
|
||
|
"metadata": {
|
||
|
"scrolled": false
|
||
|
},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"# Create model in inference mode\n",
|
||
|
"with tf.device(DEVICE):\n",
|
||
|
" model = modellib.MaskRCNN(mode=\"inference\",\n",
|
||
|
" model_dir=LOGS_DIR,\n",
|
||
|
" config=config)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 8,
|
||
|
"metadata": {
|
||
|
"scrolled": false
|
||
|
},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"Loading weights /deeplearning/mask_rcnn/logs/nucleus20180408T2244/mask_rcnn_nucleus_0032.h5\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Path to a specific weights file\n",
|
||
|
"# weights_path = \"/path/to/mask_rcnn_nucleus.h5\"\n",
|
||
|
"\n",
|
||
|
"# Or, load the last model you trained\n",
|
||
|
"weights_path = model.find_last()\n",
|
||
|
"\n",
|
||
|
"# Load weights\n",
|
||
|
"print(\"Loading weights \", weights_path)\n",
|
||
|
"model.load_weights(weights_path, by_name=True)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Run Detection"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 9,
|
||
|
"metadata": {
|
||
|
"scrolled": false
|
||
|
},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"image ID: nucleus.4193474b2f1c72f735b13633b219d9cabdd43c21d9c2bb4dfc4809f104ba4c06 (20) 4193474b2f1c72f735b13633b219d9cabdd43c21d9c2bb4dfc4809f104ba4c06\n",
|
||
|
"Original image shape: [256 320 3]\n",
|
||
|
"Processing 1 images\n",
|
||
|
"image shape: (512, 640, 3) min: 1.00000 max: 229.00000 uint8\n",
|
||
|
"molded_images shape: (1, 512, 640, 3) min: 1.00000 max: 229.00000 uint8\n",
|
||
|
"image_metas shape: (1, 14) min: 0.00000 max: 640.00000 float64\n",
|
||
|
"anchors shape: (1, 81840, 4) min: -0.17712 max: 1.05188 float32\n",
|
||
|
"gt_class_id shape: (12,) min: 1.00000 max: 1.00000 int32\n",
|
||
|
"gt_bbox shape: (12, 4) min: 4.00000 max: 588.00000 int32\n",
|
||
|
"gt_mask shape: (512, 640, 12) min: 0.00000 max: 1.00000 bool\n",
|
||
|
"AP @0.50:\t 0.903\n",
|
||
|
"AP @0.55:\t 0.903\n",
|
||
|
"AP @0.60:\t 0.903\n",
|
||
|
"AP @0.65:\t 0.787\n",
|
||
|
"AP @0.70:\t 0.354\n",
|
||
|
"AP @0.75:\t 0.354\n",
|
||
|
"AP @0.80:\t 0.167\n",
|
||
|
"AP @0.85:\t 0.042\n",
|
||
|
"AP @0.90:\t 0.042\n",
|
||
|
"AP @0.95:\t 0.000\n",
|
||
|
"AP @0.50-0.95:\t 0.445\n"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 1152x1152 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"image_id = random.choice(dataset.image_ids)\n",
|
||
|
"image, image_meta, gt_class_id, gt_bbox, gt_mask =\\\n",
|
||
|
" modellib.load_image_gt(dataset, config, image_id, use_mini_mask=False)\n",
|
||
|
"info = dataset.image_info[image_id]\n",
|
||
|
"print(\"image ID: {}.{} ({}) {}\".format(info[\"source\"], info[\"id\"], image_id, \n",
|
||
|
" dataset.image_reference(image_id)))\n",
|
||
|
"print(\"Original image shape: \", modellib.parse_image_meta(image_meta[np.newaxis,...])[\"original_image_shape\"][0])\n",
|
||
|
"\n",
|
||
|
"# Run object detection\n",
|
||
|
"results = model.detect_molded(np.expand_dims(image, 0), np.expand_dims(image_meta, 0), verbose=1)\n",
|
||
|
"\n",
|
||
|
"# Display results\n",
|
||
|
"r = results[0]\n",
|
||
|
"log(\"gt_class_id\", gt_class_id)\n",
|
||
|
"log(\"gt_bbox\", gt_bbox)\n",
|
||
|
"log(\"gt_mask\", gt_mask)\n",
|
||
|
"\n",
|
||
|
"# Compute AP over range 0.5 to 0.95 and print it\n",
|
||
|
"utils.compute_ap_range(gt_bbox, gt_class_id, gt_mask,\n",
|
||
|
" r['rois'], r['class_ids'], r['scores'], r['masks'],\n",
|
||
|
" verbose=1)\n",
|
||
|
"\n",
|
||
|
"visualize.display_differences(\n",
|
||
|
" image,\n",
|
||
|
" gt_bbox, gt_class_id, gt_mask,\n",
|
||
|
" r['rois'], r['class_ids'], r['scores'], r['masks'],\n",
|
||
|
" dataset.class_names, ax=get_ax(),\n",
|
||
|
" show_box=False, show_mask=False,\n",
|
||
|
" iou_threshold=0.5, score_threshold=0.5)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 10,
|
||
|
"metadata": {
|
||
|
"scrolled": false
|
||
|
},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"# Display predictions only\n",
|
||
|
"# visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'], \n",
|
||
|
"# dataset.class_names, r['scores'], ax=get_ax(1),\n",
|
||
|
"# show_bbox=False, show_mask=False,\n",
|
||
|
"# title=\"Predictions\")"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 11,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"# Display Ground Truth only\n",
|
||
|
"# visualize.display_instances(image, gt_bbox, gt_mask, gt_class_id, \n",
|
||
|
"# dataset.class_names, ax=get_ax(1),\n",
|
||
|
"# show_bbox=False, show_mask=False,\n",
|
||
|
"# title=\"Ground Truth\")"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### Compute AP on Batch of Images"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 12,
|
||
|
"metadata": {
|
||
|
"scrolled": false
|
||
|
},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
" 0 [256 320 3] AP: 0.41\n",
|
||
|
" 1 [256 320 3] AP: 0.44\n",
|
||
|
" 2 [256 320 3] AP: 0.69\n",
|
||
|
" 3 [1040 1388 3] AP: 0.74\n",
|
||
|
" 4 [256 320 3] AP: 0.33\n",
|
||
|
"Mean AP overa 5 images: 0.5215\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"def compute_batch_ap(dataset, image_ids, verbose=1):\n",
|
||
|
" APs = []\n",
|
||
|
" for image_id in image_ids:\n",
|
||
|
" # Load image\n",
|
||
|
" image, image_meta, gt_class_id, gt_bbox, gt_mask =\\\n",
|
||
|
" modellib.load_image_gt(dataset, config,\n",
|
||
|
" image_id, use_mini_mask=False)\n",
|
||
|
" # Run object detection\n",
|
||
|
" results = model.detect_molded(image[np.newaxis], image_meta[np.newaxis], verbose=0)\n",
|
||
|
" # Compute AP over range 0.5 to 0.95\n",
|
||
|
" r = results[0]\n",
|
||
|
" ap = utils.compute_ap_range(\n",
|
||
|
" gt_bbox, gt_class_id, gt_mask,\n",
|
||
|
" r['rois'], r['class_ids'], r['scores'], r['masks'],\n",
|
||
|
" verbose=0)\n",
|
||
|
" APs.append(ap)\n",
|
||
|
" if verbose:\n",
|
||
|
" info = dataset.image_info[image_id]\n",
|
||
|
" meta = modellib.parse_image_meta(image_meta[np.newaxis,...])\n",
|
||
|
" print(\"{:3} {} AP: {:.2f}\".format(\n",
|
||
|
" meta[\"image_id\"][0], meta[\"original_image_shape\"][0], ap))\n",
|
||
|
" return APs\n",
|
||
|
"\n",
|
||
|
"# Run on validation set\n",
|
||
|
"limit = 5\n",
|
||
|
"APs = compute_batch_ap(dataset, dataset.image_ids[:limit])\n",
|
||
|
"print(\"Mean AP overa {} images: {:.4f}\".format(len(APs), np.mean(APs)))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Step by Step Prediction"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Stage 1: Region Proposal Network\n",
|
||
|
"\n",
|
||
|
"The Region Proposal Network (RPN) runs a lightweight binary classifier on a lot of boxes (anchors) over the image and returns object/no-object scores. Anchors with high *objectness* score (positive anchors) are passed to the stage two to be classified.\n",
|
||
|
"\n",
|
||
|
"Often, even positive anchors don't cover objects fully. So the RPN also regresses a refinement (a delta in location and size) to be applied to the anchors to shift it and resize it a bit to the correct boundaries of the object."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### 1.a RPN Targets\n",
|
||
|
"\n",
|
||
|
"The RPN targets are the training values for the RPN. To generate the targets, we start with a grid of anchors that cover the full image at different scales, and then we compute the IoU of the anchors with ground truth object. Positive anchors are those that have an IoU >= 0.7 with any ground truth object, and negative anchors are those that don't cover any object by more than 0.3 IoU. Anchors in between (i.e. cover an object by IoU >= 0.3 but < 0.7) are considered neutral and excluded from training.\n",
|
||
|
"\n",
|
||
|
"To train the RPN regressor, we also compute the shift and resizing needed to make the anchor cover the ground truth object completely."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 13,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"anchors shape: (81840, 4) min: -91.00000 max: 667.00000 int32\n",
|
||
|
"target_rpn_match shape: (81840,) min: -1.00000 max: 1.00000 int32\n",
|
||
|
"target_rpn_bbox shape: (64, 4) min: -2.60870 max: 2.50000 float64\n",
|
||
|
"positive_anchors shape: (12, 4) min: 0.00000 max: 589.00000 int32\n",
|
||
|
"negative_anchors shape: (52, 4) min: -2.00000 max: 642.00000 int32\n",
|
||
|
"neutral anchors shape: (81776, 4) min: -91.00000 max: 667.00000 int32\n",
|
||
|
"refined_anchors shape: (12, 4) min: 4.00000 max: 588.00000 float32\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Get anchors and convert to pixel coordinates\n",
|
||
|
"anchors = model.get_anchors(image.shape)\n",
|
||
|
"anchors = utils.denorm_boxes(anchors, image.shape[:2])\n",
|
||
|
"log(\"anchors\", anchors)\n",
|
||
|
"\n",
|
||
|
"# Generate RPN trainig targets\n",
|
||
|
"# target_rpn_match is 1 for positive anchors, -1 for negative anchors\n",
|
||
|
"# and 0 for neutral anchors.\n",
|
||
|
"target_rpn_match, target_rpn_bbox = modellib.build_rpn_targets(\n",
|
||
|
" image.shape, anchors, gt_class_id, gt_bbox, model.config)\n",
|
||
|
"log(\"target_rpn_match\", target_rpn_match)\n",
|
||
|
"log(\"target_rpn_bbox\", target_rpn_bbox)\n",
|
||
|
"\n",
|
||
|
"positive_anchor_ix = np.where(target_rpn_match[:] == 1)[0]\n",
|
||
|
"negative_anchor_ix = np.where(target_rpn_match[:] == -1)[0]\n",
|
||
|
"neutral_anchor_ix = np.where(target_rpn_match[:] == 0)[0]\n",
|
||
|
"positive_anchors = anchors[positive_anchor_ix]\n",
|
||
|
"negative_anchors = anchors[negative_anchor_ix]\n",
|
||
|
"neutral_anchors = anchors[neutral_anchor_ix]\n",
|
||
|
"log(\"positive_anchors\", positive_anchors)\n",
|
||
|
"log(\"negative_anchors\", negative_anchors)\n",
|
||
|
"log(\"neutral anchors\", neutral_anchors)\n",
|
||
|
"\n",
|
||
|
"# Apply refinement deltas to positive anchors\n",
|
||
|
"refined_anchors = utils.apply_box_deltas(\n",
|
||
|
" positive_anchors,\n",
|
||
|
" target_rpn_bbox[:positive_anchors.shape[0]] * model.config.RPN_BBOX_STD_DEV)\n",
|
||
|
"log(\"refined_anchors\", refined_anchors, )"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 14,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 1152x1152 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Display positive anchors before refinement (dotted) and\n",
|
||
|
"# after refinement (solid).\n",
|
||
|
"visualize.draw_boxes(\n",
|
||
|
" image, ax=get_ax(),\n",
|
||
|
" boxes=positive_anchors,\n",
|
||
|
" refined_boxes=refined_anchors)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### 1.b RPN Predictions\n",
|
||
|
"\n",
|
||
|
"Here we run the RPN graph and display its predictions."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 15,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"rpn_class shape: (1, 81840, 2) min: 0.00000 max: 1.00000 float32\n",
|
||
|
"pre_nms_anchors shape: (1, 6000, 4) min: -0.17712 max: 1.05188 float32\n",
|
||
|
"refined_anchors shape: (1, 6000, 4) min: -0.15117 max: 1.23829 float32\n",
|
||
|
"refined_anchors_clipped shape: (1, 6000, 4) min: 0.00000 max: 1.00000 float32\n",
|
||
|
"post_nms_anchor_ix shape: (2000,) min: 0.00000 max: 2684.00000 int32\n",
|
||
|
"proposals shape: (1, 2000, 4) min: 0.00000 max: 1.00000 float32\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Run RPN sub-graph\n",
|
||
|
"pillar = model.keras_model.get_layer(\"ROI\").output # node to start searching from\n",
|
||
|
"\n",
|
||
|
"# TF 1.4 and 1.9 introduce new versions of NMS. Search for all names to support TF 1.3~1.10\n",
|
||
|
"nms_node = model.ancestor(pillar, \"ROI/rpn_non_max_suppression:0\")\n",
|
||
|
"if nms_node is None:\n",
|
||
|
" nms_node = model.ancestor(pillar, \"ROI/rpn_non_max_suppression/NonMaxSuppressionV2:0\")\n",
|
||
|
"if nms_node is None: #TF 1.9-1.10\n",
|
||
|
" nms_node = model.ancestor(pillar, \"ROI/rpn_non_max_suppression/NonMaxSuppressionV3:0\")\n",
|
||
|
"\n",
|
||
|
"rpn = model.run_graph(image[np.newaxis], [\n",
|
||
|
" (\"rpn_class\", model.keras_model.get_layer(\"rpn_class\").output),\n",
|
||
|
" (\"pre_nms_anchors\", model.ancestor(pillar, \"ROI/pre_nms_anchors:0\")),\n",
|
||
|
" (\"refined_anchors\", model.ancestor(pillar, \"ROI/refined_anchors:0\")),\n",
|
||
|
" (\"refined_anchors_clipped\", model.ancestor(pillar, \"ROI/refined_anchors_clipped:0\")),\n",
|
||
|
" (\"post_nms_anchor_ix\", nms_node),\n",
|
||
|
" (\"proposals\", model.keras_model.get_layer(\"ROI\").output),\n",
|
||
|
"], image_metas=image_meta[np.newaxis])"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 16,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 1152x1152 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Show top anchors by score (before refinement)\n",
|
||
|
"limit = 100\n",
|
||
|
"sorted_anchor_ids = np.argsort(rpn['rpn_class'][:,:,1].flatten())[::-1]\n",
|
||
|
"visualize.draw_boxes(image, boxes=anchors[sorted_anchor_ids[:limit]], ax=get_ax())"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 17,
|
||
|
"metadata": {
|
||
|
"scrolled": false
|
||
|
},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 2304x1152 with 2 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Show top anchors with refinement. Then with clipping to image boundaries\n",
|
||
|
"limit = 50\n",
|
||
|
"ax = get_ax(1, 2)\n",
|
||
|
"pre_nms_anchors = utils.denorm_boxes(rpn[\"pre_nms_anchors\"][0], image.shape[:2])\n",
|
||
|
"refined_anchors = utils.denorm_boxes(rpn[\"refined_anchors\"][0], image.shape[:2])\n",
|
||
|
"refined_anchors_clipped = utils.denorm_boxes(rpn[\"refined_anchors_clipped\"][0], image.shape[:2])\n",
|
||
|
"visualize.draw_boxes(image, boxes=pre_nms_anchors[:limit],\n",
|
||
|
" refined_boxes=refined_anchors[:limit], ax=ax[0])\n",
|
||
|
"visualize.draw_boxes(image, refined_boxes=refined_anchors_clipped[:limit], ax=ax[1])"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 18,
|
||
|
"metadata": {
|
||
|
"scrolled": false
|
||
|
},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 1152x1152 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Show refined anchors after non-max suppression\n",
|
||
|
"limit = 50\n",
|
||
|
"ixs = rpn[\"post_nms_anchor_ix\"][:limit]\n",
|
||
|
"visualize.draw_boxes(image, refined_boxes=refined_anchors_clipped[ixs], ax=get_ax())"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 19,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 1152x1152 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Show final proposals\n",
|
||
|
"# These are the same as the previous step (refined anchors \n",
|
||
|
"# after NMS) but with coordinates normalized to [0, 1] range.\n",
|
||
|
"limit = 50\n",
|
||
|
"# Convert back to image coordinates for display\n",
|
||
|
"# h, w = config.IMAGE_SHAPE[:2]\n",
|
||
|
"# proposals = rpn['proposals'][0, :limit] * np.array([h, w, h, w])\n",
|
||
|
"visualize.draw_boxes(\n",
|
||
|
" image, ax=get_ax(),\n",
|
||
|
" refined_boxes=utils.denorm_boxes(rpn['proposals'][0, :limit], image.shape[:2]))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Stage 2: Proposal Classification\n",
|
||
|
"\n",
|
||
|
"This stage takes the region proposals from the RPN and classifies them."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### 2.a Proposal Classification\n",
|
||
|
"\n",
|
||
|
"Run the classifier heads on proposals to generate class propbabilities and bounding box regressions."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 20,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"proposals shape: (1, 2000, 4) min: 0.00000 max: 1.00000 float32\n",
|
||
|
"probs shape: (1, 2000, 2) min: 0.00000 max: 1.00000 float32\n",
|
||
|
"deltas shape: (1, 2000, 2, 4) min: -3.47788 max: 3.38944 float32\n",
|
||
|
"masks shape: (1, 400, 28, 28, 2) min: 0.00004 max: 0.99984 float32\n",
|
||
|
"detections shape: (1, 400, 6) min: 0.00000 max: 1.00000 float32\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Get input and output to classifier and mask heads.\n",
|
||
|
"mrcnn = model.run_graph([image], [\n",
|
||
|
" (\"proposals\", model.keras_model.get_layer(\"ROI\").output),\n",
|
||
|
" (\"probs\", model.keras_model.get_layer(\"mrcnn_class\").output),\n",
|
||
|
" (\"deltas\", model.keras_model.get_layer(\"mrcnn_bbox\").output),\n",
|
||
|
" (\"masks\", model.keras_model.get_layer(\"mrcnn_mask\").output),\n",
|
||
|
" (\"detections\", model.keras_model.get_layer(\"mrcnn_detection\").output),\n",
|
||
|
"])"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 21,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"19 detections: ['nucleus' 'nucleus' 'nucleus' 'nucleus' 'nucleus' 'nucleus' 'nucleus'\n",
|
||
|
" 'nucleus' 'nucleus' 'nucleus' 'nucleus' 'nucleus' 'nucleus' 'nucleus'\n",
|
||
|
" 'nucleus' 'nucleus' 'nucleus' 'nucleus' 'nucleus']\n"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 1152x1152 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Get detection class IDs. Trim zero padding.\n",
|
||
|
"det_class_ids = mrcnn['detections'][0, :, 4].astype(np.int32)\n",
|
||
|
"det_count = np.where(det_class_ids == 0)[0][0]\n",
|
||
|
"det_class_ids = det_class_ids[:det_count]\n",
|
||
|
"detections = mrcnn['detections'][0, :det_count]\n",
|
||
|
"\n",
|
||
|
"print(\"{} detections: {}\".format(\n",
|
||
|
" det_count, np.array(dataset.class_names)[det_class_ids]))\n",
|
||
|
"\n",
|
||
|
"captions = [\"{} {:.3f}\".format(dataset.class_names[int(c)], s) if c > 0 else \"\"\n",
|
||
|
" for c, s in zip(detections[:, 4], detections[:, 5])]\n",
|
||
|
"visualize.draw_boxes(\n",
|
||
|
" image, \n",
|
||
|
" refined_boxes=utils.denorm_boxes(detections[:, :4], image.shape[:2]),\n",
|
||
|
" visibilities=[2] * len(detections),\n",
|
||
|
" captions=captions, title=\"Detections\",\n",
|
||
|
" ax=get_ax())"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### 2.c Step by Step Detection\n",
|
||
|
"\n",
|
||
|
"Here we dive deeper into the process of processing the detections."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 22,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"2000 Valid proposals out of 2000\n",
|
||
|
"69 Positive ROIs\n",
|
||
|
"[('BG', 1931), ('nucleus', 69)]\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Proposals are in normalized coordinates\n",
|
||
|
"proposals = mrcnn[\"proposals\"][0]\n",
|
||
|
"\n",
|
||
|
"# Class ID, score, and mask per proposal\n",
|
||
|
"roi_class_ids = np.argmax(mrcnn[\"probs\"][0], axis=1)\n",
|
||
|
"roi_scores = mrcnn[\"probs\"][0, np.arange(roi_class_ids.shape[0]), roi_class_ids]\n",
|
||
|
"roi_class_names = np.array(dataset.class_names)[roi_class_ids]\n",
|
||
|
"roi_positive_ixs = np.where(roi_class_ids > 0)[0]\n",
|
||
|
"\n",
|
||
|
"# How many ROIs vs empty rows?\n",
|
||
|
"print(\"{} Valid proposals out of {}\".format(np.sum(np.any(proposals, axis=1)), proposals.shape[0]))\n",
|
||
|
"print(\"{} Positive ROIs\".format(len(roi_positive_ixs)))\n",
|
||
|
"\n",
|
||
|
"# Class counts\n",
|
||
|
"print(list(zip(*np.unique(roi_class_names, return_counts=True))))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 23,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 1152x1152 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Display a random sample of proposals.\n",
|
||
|
"# Proposals classified as background are dotted, and\n",
|
||
|
"# the rest show their class and confidence score.\n",
|
||
|
"limit = 200\n",
|
||
|
"ixs = np.random.randint(0, proposals.shape[0], limit)\n",
|
||
|
"captions = [\"{} {:.3f}\".format(dataset.class_names[c], s) if c > 0 else \"\"\n",
|
||
|
" for c, s in zip(roi_class_ids[ixs], roi_scores[ixs])]\n",
|
||
|
"visualize.draw_boxes(\n",
|
||
|
" image,\n",
|
||
|
" boxes=utils.denorm_boxes(proposals[ixs], image.shape[:2]),\n",
|
||
|
" visibilities=np.where(roi_class_ids[ixs] > 0, 2, 1),\n",
|
||
|
" captions=captions, title=\"ROIs Before Refinement\",\n",
|
||
|
" ax=get_ax())"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"#### Apply Bounding Box Refinement"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 24,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"roi_bbox_specific shape: (2000, 4) min: -2.55332 max: 3.38944 float32\n",
|
||
|
"refined_proposals shape: (2000, 4) min: -0.00621 max: 1.06598 float32\n"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 1152x1152 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Class-specific bounding box shifts.\n",
|
||
|
"roi_bbox_specific = mrcnn[\"deltas\"][0, np.arange(proposals.shape[0]), roi_class_ids]\n",
|
||
|
"log(\"roi_bbox_specific\", roi_bbox_specific)\n",
|
||
|
"\n",
|
||
|
"# Apply bounding box transformations\n",
|
||
|
"# Shape: [N, (y1, x1, y2, x2)]\n",
|
||
|
"refined_proposals = utils.apply_box_deltas(\n",
|
||
|
" proposals, roi_bbox_specific * config.BBOX_STD_DEV)\n",
|
||
|
"log(\"refined_proposals\", refined_proposals)\n",
|
||
|
"\n",
|
||
|
"# Show positive proposals\n",
|
||
|
"# ids = np.arange(roi_boxes.shape[0]) # Display all\n",
|
||
|
"limit = 5\n",
|
||
|
"ids = np.random.randint(0, len(roi_positive_ixs), limit) # Display random sample\n",
|
||
|
"captions = [\"{} {:.3f}\".format(dataset.class_names[c], s) if c > 0 else \"\"\n",
|
||
|
" for c, s in zip(roi_class_ids[roi_positive_ixs][ids], roi_scores[roi_positive_ixs][ids])]\n",
|
||
|
"visualize.draw_boxes(\n",
|
||
|
" image, ax=get_ax(),\n",
|
||
|
" boxes=utils.denorm_boxes(proposals[roi_positive_ixs][ids], image.shape[:2]),\n",
|
||
|
" refined_boxes=utils.denorm_boxes(refined_proposals[roi_positive_ixs][ids], image.shape[:2]),\n",
|
||
|
" visibilities=np.where(roi_class_ids[roi_positive_ixs][ids] > 0, 1, 0),\n",
|
||
|
" captions=captions, title=\"ROIs After Refinement\")"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"#### Filter Low Confidence Detections"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 25,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"Keep 69 detections:\n",
|
||
|
"[ 0 1 2 3 4 5 6 7 8 9 10 12 13 16\n",
|
||
|
" 17 19 21 24 29 37 39 44 47 50 53 54 58 69\n",
|
||
|
" 70 77 85 87 117 123 125 126 128 133 148 158 187 198\n",
|
||
|
" 214 221 243 255 259 269 282 318 354 476 662 705 770 812\n",
|
||
|
" 885 971 980 1048 1073 1143 1211 1366 1378 1481 1483 1893 1914]\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Remove boxes classified as background\n",
|
||
|
"keep = np.where(roi_class_ids > 0)[0]\n",
|
||
|
"print(\"Keep {} detections:\\n{}\".format(keep.shape[0], keep))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 26,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"Remove boxes below 0 confidence. Keep 69:\n",
|
||
|
"[ 0 1 2 3 4 5 6 7 8 9 10 12 13 16\n",
|
||
|
" 17 19 21 24 29 37 39 44 47 50 53 54 58 69\n",
|
||
|
" 70 77 85 87 117 123 125 126 128 133 148 158 187 198\n",
|
||
|
" 214 221 243 255 259 269 282 318 354 476 662 705 770 812\n",
|
||
|
" 885 971 980 1048 1073 1143 1211 1366 1378 1481 1483 1893 1914]\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Remove low confidence detections\n",
|
||
|
"keep = np.intersect1d(keep, np.where(roi_scores >= config.DETECTION_MIN_CONFIDENCE)[0])\n",
|
||
|
"print(\"Remove boxes below {} confidence. Keep {}:\\n{}\".format(\n",
|
||
|
" config.DETECTION_MIN_CONFIDENCE, keep.shape[0], keep))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"#### Per-Class Non-Max Suppression"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 27,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"nucleus : [ 0 1 2 3 4 5 6 7 8 9 10 12 13 16\n",
|
||
|
" 17 19 21 24 29 37 39 44 47 50 53 54 58 69\n",
|
||
|
" 70 77 85 87 117 123 125 126 128 133 148 158 187 198\n",
|
||
|
" 214 221 243 255 259 269 282 318 354 476 662 705 770 812\n",
|
||
|
" 885 971 980 1048 1073 1143 1211 1366 1378 1481 1483 1893 1914] -> [ 13 8 0 4 3 9 318 85 12 2 54 44 126 19\n",
|
||
|
" 50 47 1914 29 133]\n",
|
||
|
"\n",
|
||
|
"Kept after per-class NMS: 19\n",
|
||
|
"[ 0 2 3 4 8 9 12 13 19 29 44 47 50 54\n",
|
||
|
" 85 126 133 318 1914]\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Apply per-class non-max suppression\n",
|
||
|
"pre_nms_boxes = refined_proposals[keep]\n",
|
||
|
"pre_nms_scores = roi_scores[keep]\n",
|
||
|
"pre_nms_class_ids = roi_class_ids[keep]\n",
|
||
|
"\n",
|
||
|
"nms_keep = []\n",
|
||
|
"for class_id in np.unique(pre_nms_class_ids):\n",
|
||
|
" # Pick detections of this class\n",
|
||
|
" ixs = np.where(pre_nms_class_ids == class_id)[0]\n",
|
||
|
" # Apply NMS\n",
|
||
|
" class_keep = utils.non_max_suppression(pre_nms_boxes[ixs], \n",
|
||
|
" pre_nms_scores[ixs],\n",
|
||
|
" config.DETECTION_NMS_THRESHOLD)\n",
|
||
|
" # Map indicies\n",
|
||
|
" class_keep = keep[ixs[class_keep]]\n",
|
||
|
" nms_keep = np.union1d(nms_keep, class_keep)\n",
|
||
|
" print(\"{:22}: {} -> {}\".format(dataset.class_names[class_id][:20], \n",
|
||
|
" keep[ixs], class_keep))\n",
|
||
|
"\n",
|
||
|
"keep = np.intersect1d(keep, nms_keep).astype(np.int32)\n",
|
||
|
"print(\"\\nKept after per-class NMS: {}\\n{}\".format(keep.shape[0], keep))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 28,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 1152x1152 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Show final detections\n",
|
||
|
"ixs = np.arange(len(keep)) # Display all\n",
|
||
|
"# ixs = np.random.randint(0, len(keep), 10) # Display random sample\n",
|
||
|
"captions = [\"{} {:.3f}\".format(dataset.class_names[c], s) if c > 0 else \"\"\n",
|
||
|
" for c, s in zip(roi_class_ids[keep][ixs], roi_scores[keep][ixs])]\n",
|
||
|
"visualize.draw_boxes(\n",
|
||
|
" image,\n",
|
||
|
" boxes=utils.denorm_boxes(proposals[keep][ixs], image.shape[:2]),\n",
|
||
|
" refined_boxes=utils.denorm_boxes(refined_proposals[keep][ixs], image.shape[:2]),\n",
|
||
|
" visibilities=np.where(roi_class_ids[keep][ixs] > 0, 1, 0),\n",
|
||
|
" captions=captions, title=\"Detections after NMS\",\n",
|
||
|
" ax=get_ax())"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Stage 3: Generating Masks\n",
|
||
|
"\n",
|
||
|
"This stage takes the detections (refined bounding boxes and class IDs) from the previous layer and runs the mask head to generate segmentation masks for every instance."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### 3.a Mask Targets\n",
|
||
|
"\n",
|
||
|
"These are the training targets for the mask branch"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 29,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 1008x720 with 8 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"limit = 8\n",
|
||
|
"display_images(np.transpose(gt_mask[..., :limit], [2, 0, 1]), cmap=\"Blues\")"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### 3.b Predicted Masks"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 30,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"detections shape: (1, 400, 6) min: 0.00000 max: 1.00000 float32\n",
|
||
|
"masks shape: (1, 400, 28, 28, 2) min: 0.00004 max: 0.99984 float32\n",
|
||
|
"19 detections: ['nucleus' 'nucleus' 'nucleus' 'nucleus' 'nucleus' 'nucleus' 'nucleus'\n",
|
||
|
" 'nucleus' 'nucleus' 'nucleus' 'nucleus' 'nucleus' 'nucleus' 'nucleus'\n",
|
||
|
" 'nucleus' 'nucleus' 'nucleus' 'nucleus' 'nucleus']\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Get predictions of mask head\n",
|
||
|
"mrcnn = model.run_graph([image], [\n",
|
||
|
" (\"detections\", model.keras_model.get_layer(\"mrcnn_detection\").output),\n",
|
||
|
" (\"masks\", model.keras_model.get_layer(\"mrcnn_mask\").output),\n",
|
||
|
"])\n",
|
||
|
"\n",
|
||
|
"# Get detection class IDs. Trim zero padding.\n",
|
||
|
"det_class_ids = mrcnn['detections'][0, :, 4].astype(np.int32)\n",
|
||
|
"det_count = np.where(det_class_ids == 0)[0][0]\n",
|
||
|
"det_class_ids = det_class_ids[:det_count]\n",
|
||
|
"\n",
|
||
|
"print(\"{} detections: {}\".format(\n",
|
||
|
" det_count, np.array(dataset.class_names)[det_class_ids]))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 31,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"det_mask_specific shape: (19, 28, 28) min: 0.00004 max: 0.99984 float32\n",
|
||
|
"det_masks shape: (19, 512, 640) min: 0.00000 max: 1.00000 bool\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Masks\n",
|
||
|
"det_boxes = utils.denorm_boxes(mrcnn[\"detections\"][0, :, :4], image.shape[:2])\n",
|
||
|
"det_mask_specific = np.array([mrcnn[\"masks\"][0, i, :, :, c] \n",
|
||
|
" for i, c in enumerate(det_class_ids)])\n",
|
||
|
"det_masks = np.array([utils.unmold_mask(m, det_boxes[i], image.shape)\n",
|
||
|
" for i, m in enumerate(det_mask_specific)])\n",
|
||
|
"log(\"det_mask_specific\", det_mask_specific)\n",
|
||
|
"log(\"det_masks\", det_masks)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 32,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 1008x504 with 4 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"display_images(det_mask_specific[:4] * 255, cmap=\"Blues\", interpolation=\"none\")"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 33,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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\n",
|
||
|
"text/plain": [
|
||
|
"<Figure size 1008x504 with 4 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"display_images(det_masks[:4] * 255, cmap=\"Blues\", interpolation=\"none\")"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Visualize Activations\n",
|
||
|
"\n",
|
||
|
"In some cases it helps to look at the output from different layers and visualize them to catch issues and odd patterns."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 34,
|
||
|
"metadata": {
|
||
|
"scrolled": false
|
||
|
},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"input_image shape: (1, 1024, 1280, 3) min: -38.56000 max: 184.47000 float32\n",
|
||
|
"res2c_out shape: (1, 256, 320, 256) min: 0.00000 max: 18.96384 float32\n",
|
||
|
"res3c_out shape: (1, 128, 160, 512) min: 0.00000 max: 14.29902 float32\n",
|
||
|
"rpn_bbox shape: (1, 327360, 4) min: -14.41855 max: 60.67371 float32\n",
|
||
|
"roi shape: (1, 2000, 4) min: 0.00000 max: 1.00000 float32\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Get activations of a few sample layers\n",
|
||
|
"activations = model.run_graph([image], [\n",
|
||
|
" (\"input_image\", tf.identity(model.keras_model.get_layer(\"input_image\").output)),\n",
|
||
|
" (\"res2c_out\", model.keras_model.get_layer(\"res2c_out\").output),\n",
|
||
|
" (\"res3c_out\", model.keras_model.get_layer(\"res3c_out\").output),\n",
|
||
|
" (\"rpn_bbox\", model.keras_model.get_layer(\"rpn_bbox\").output),\n",
|
||
|
" (\"roi\", model.keras_model.get_layer(\"ROI\").output),\n",
|
||
|
"])"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 35,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 1008x504 with 4 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Backbone feature map\n",
|
||
|
"display_images(np.transpose(activations[\"res2c_out\"][0,:,:,:4], [2, 0, 1]), cols=4)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"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
|
||
|
}
|