GeoYolo-SLAM/MaskRCNN_ROS/include/MaskRCNN/samples/balloon/inspect_balloon_model.ipynb

1218 lines
10 MiB
Plaintext
Raw Normal View History

2025-04-09 16:05:54 +08:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Mask R-CNN - Inspect Ballon Trained Model\n",
"\n",
"Code and visualizations to test, debug, and evaluate the Mask R-CNN model."
]
},
{
"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 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",
"from samples.balloon import balloon\n",
"\n",
"%matplotlib inline \n",
"\n",
"# Directory to save logs and trained model\n",
"MODEL_DIR = os.path.join(ROOT_DIR, \"logs\")\n",
"\n",
"# Path to Ballon trained weights\n",
"# You can download this file from the Releases page\n",
"# https://github.com/matterport/Mask_RCNN/releases\n",
"BALLON_WEIGHTS_PATH = \"/path/to/mask_rcnn_balloon.h5\" # TODO: update this path"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Configurations"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"config = balloon.BalloonConfig()\n",
"BALLOON_DIR = os.path.join(ROOT_DIR, \"datasets/balloon\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Configurations:\n",
"BACKBONE resnet101\n",
"BACKBONE_SHAPES [[256 256]\n",
" [128 128]\n",
" [ 64 64]\n",
" [ 32 32]\n",
" [ 16 16]]\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 100\n",
"DETECTION_MIN_CONFIDENCE 0.9\n",
"DETECTION_NMS_THRESHOLD 0.3\n",
"GPU_COUNT 1\n",
"IMAGES_PER_GPU 1\n",
"IMAGE_MAX_DIM 1024\n",
"IMAGE_MIN_DIM 800\n",
"IMAGE_PADDING True\n",
"IMAGE_SHAPE [1024 1024 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 100\n",
"MEAN_PIXEL [123.7 116.8 103.9]\n",
"MINI_MASK_SHAPE (56, 56)\n",
"NAME balloon\n",
"NUM_CLASSES 2\n",
"POOL_SIZE 7\n",
"POST_NMS_ROIS_INFERENCE 1000\n",
"POST_NMS_ROIS_TRAINING 2000\n",
"ROI_POSITIVE_RATIO 0.33\n",
"RPN_ANCHOR_RATIOS [0.5, 1, 2]\n",
"RPN_ANCHOR_SCALES (32, 64, 128, 256, 512)\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 256\n",
"STEPS_PER_EPOCH 100\n",
"TRAIN_ROIS_PER_IMAGE 200\n",
"USE_MINI_MASK True\n",
"USE_RPN_ROIS True\n",
"VALIDATION_STEPS 50\n",
"WEIGHT_DECAY 0.0001\n",
"\n",
"\n"
]
}
],
"source": [
"# Override the training configurations with a few\n",
"# changes for inferencing.\n",
"class InferenceConfig(config.__class__):\n",
" # Run detection on one image at a time\n",
" GPU_COUNT = 1\n",
" IMAGES_PER_GPU = 1\n",
"\n",
"config = InferenceConfig()\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",
"# TODO: code for 'training' test mode not ready yet\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",
" _, ax = plt.subplots(rows, cols, figsize=(size*cols, size*rows))\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: 13\n",
"Classes: ['BG', 'balloon']\n"
]
}
],
"source": [
"# Load validation dataset\n",
"dataset = balloon.BalloonDataset()\n",
"dataset.load_balloon(BALLOON_DIR, \"val\")\n",
"\n",
"# Must call before using the dataset\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": {},
"outputs": [],
"source": [
"# Create model in inference mode\n",
"with tf.device(DEVICE):\n",
" model = modellib.MaskRCNN(mode=\"inference\", model_dir=MODEL_DIR,\n",
" config=config)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Loading weights /deepmatter/libs/mask_rcnn/logs/balloon20180319T1239/mask_rcnn_balloon_0030.h5\n"
]
}
],
"source": [
"# Set path to balloon weights file\n",
"\n",
"# Download file from the Releases page and set its path\n",
"# https://github.com/matterport/Mask_RCNN/releases\n",
"# weights_path = \"/path/to/mask_rcnn_balloon.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": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"image ID: balloon.14898532020_ba6199dd22_k.jpg (2) /deepmatter/libs/mask_rcnn/datasets/balloon/val/14898532020_ba6199dd22_k.jpg\n",
"Processing 1 images\n",
"image shape: (1024, 1024, 3) min: 0.00000 max: 255.00000\n",
"molded_images shape: (1, 1024, 1024, 3) min: -123.70000 max: 151.10000\n",
"image_metas shape: (1, 10) min: 0.00000 max: 1024.00000\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA7MAAAOVCAYAAAC767dEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3WvMbdt5H/T/M8aca633vvc+F/vYPr4lVpqEtCU1EhIIpCRA6RUiqAKl7QeafkARKigiIBWogLYQFRGkfikNUkijqpSqpK1CSMUHipoinAA1jZOGuLbPOT6XfXv3u9/rWmvOMR4+PM8z5txHiR3cgDuT/8+yj8/e77vWvIw5xvOM2xRVBREREREREdGSpK/3ARARERERERH9v8VkloiIiIiIiBaHySwREREREREtDpNZIiIiIiIiWhwms0RERERERLQ4TGaJiIiIiIhocZjMEhERfQ1E5OMioiLS+b//pIj8oa/hcz4qItcikn/tj5KIiOjXLyazRET065qIfElE7jxhfCgiPyIix7/W36Oq/7yq/je/yuP5rtnvvamqx6pafq2PiYiI6NczJrNERPQbwe9W1WMA3w7g0wD+2PwvxbBNJCIiWhA23ERE9BuGqr4N4CcB/CMi8j+LyJ8QkZ8GcAvgkyJyJiL/tYi8KyJvi8h/EtN/RSSLyJ8WkSci8gUAv3P+2f55f3j2798rIr8gIlci8vMi8u0i8ucBfBTAX/eR4n/nl5mu/CER+Wsici4inxeR75195h8Xkb8kIj/qn/s5Efn07O9/wI/7SkR+UUS+8//Dy0lERPR1xWSWiIh+wxCR1wH8DgD/p//RHwDwRwCcAHgDwI8AGAF8I4B/FMA/CyAS1O8F8Lv8zz8N4F/6Ct/zLwP44wD+IIBTAL8HwFNV/QMA3oSPFKvqD/4yv/4XAXwZwIf8O/6kiHzH7O9/j//MPQB/DcCf8e/8JgDfB+AfU9UTAP8cgC991YtCRES0UExmiYjoN4IfF5ELAH8LwN8E8Cf9z39EVT+nqiOAB7BE94+q6o2qPgLwXwD4Hv/Z3wfgh1T1LVU9B/CnvsL3/WEAP6iqP6Pm86r6xlc7SE+2/wkAP6CqW1X9OwB+GJYUh7+lqv+Dr7H98wB+i/95AbAG8C0i0qvql1T173+17yQiIlqq7ut9AERERP8/+BdU9X+a/4GIAMBbsz/6GIAewLv+d4B1+sbPfOh9P/+VktPXAXwtieSHAJyr6tX7vufTs39/b/b/bwFsRKRT1c+LyB+FjQh/q4j8FIB/W1Xf+RqOg4iI6B96HJklIqLfyHT2/98CsAPwsqre8/+equq3+t+/C0tSw0e/wue+BeAbfhXf+X7vAHggIifv+563v8LvTB+s+hdU9Z+EJeYK4D/71fweERHREjGZJSIiAqCq7wL4GwD+cxE5FZEkIt8gIv+0/8hfAvBvishHROQ+gH/3K3zcDwP4fhH5bb5T8jeKyMf87x4C+OSvcAxvAfjbAP6UiGxE5DcD+NcB/NhXO34R+SYR+Q4RWQPYArgDUL/6mRMRES0Tk1kiIqLJHwSwAvDzAJ4B+MsAXvO/+3MAfgrAZwH8HwD+yq/0Iar63wH4EwD+AoArAD8OW5ML2FrbPyYiFyLy/b/Mr/8rAD4OG6X97wH8h++fIv0rWAP4TwE8gU1FfhXAv/er+D0iIqJFEtWvNNuJiIiIiIiI6B8+HJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLU739T6AfxAiol/vYyAiIiIiIloyVZWv9zF8LTgyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHGYzBIREREREdHiMJklIiIiIiKixWEyS0RERERERIvDZJaIiIiIiIgWh8ksERERERERLQ6TWSIiIiIiIlocJrNERERERES0OExmiYiIiIiIaHG6r/cB/IP4N77z43j43iUO1hv03YiUFPtRcX11h6PjjIwdqvQ4f17QJ8XrHzrEx167j3G/Q049jtZ32O32ePs8YygVX36suLnLeHS+xcOLGyQBTtYrnBz1yF3CW4+vcbjJ+ORrZ+g6xd1dxUtnG6zWGdCEJIqqFT/7uedQHaFasC8VHYAigk3X4eRgjQcP1jg6OMXJIfDgRHG3H7HXjA8/WOOf+q3P0K8EtXa
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc38a340eb8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"gt_class_id shape: (9,) min: 1.00000 max: 1.00000\n",
"gt_bbox shape: (9, 4) min: 11.00000 max: 1009.00000\n",
"gt_mask shape: (1024, 1024, 9) min: 0.00000 max: 1.00000\n"
]
}
],
"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",
"\n",
"# Run object detection\n",
"results = model.detect([image], verbose=1)\n",
"\n",
"# Display results\n",
"ax = get_ax(1)\n",
"r = results[0]\n",
"visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'], \n",
" dataset.class_names, r['scores'], ax=ax,\n",
" title=\"Predictions\")\n",
"log(\"gt_class_id\", gt_class_id)\n",
"log(\"gt_bbox\", gt_bbox)\n",
"log(\"gt_mask\", gt_mask)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Color Splash\n",
"\n",
"This is for illustration. You can call `balloon.py` with the `splash` option to get better images without the black padding."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc3481096d8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"splash = balloon.color_splash(image, r['masks'])\n",
"display_images([splash], cols=1)"
]
},
{
"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": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"target_rpn_match shape: (261888,) min: -1.00000 max: 1.00000\n",
"target_rpn_bbox shape: (256, 4) min: -2.05556 max: 1.32583\n",
"positive_anchors shape: (17, 4) min: 8.00000 max: 1012.00000\n",
"negative_anchors shape: (239, 4) min: -298.03867 max: 1082.50967\n",
"neutral anchors shape: (261632, 4) min: -362.03867 max: 1322.03867\n",
"refined_anchors shape: (17, 4) min: 11.00000 max: 1009.00000\n"
]
}
],
"source": [
"# 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, model.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 = model.anchors[positive_anchor_ix]\n",
"negative_anchors = model.anchors[negative_anchor_ix]\n",
"neutral_anchors = model.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, )\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA5cAAAOICAYAAABCFQWrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3V2sZVt2H/T/mHOtvfc5p86pj1t1v/ve7nR3bMeYGMd2QASLIAuCFEAhEuIhSsSHQSQ8wxuJFNnihXcsEMqLURSJIAIChABLIUKosSKabsXX7vb96Hv7fladU+dz773WmnPwMMaYa1cj8eDVqLnk/1OcW33q1N7rc645xhxzLlFVEBERERERES2RftIbQERERERERF9+DC6JiIiIiIhoMQaXREREREREtBiDSyIiIiIiIlqMwSUREREREREtxuCSiIiIiIiIFmNwSURERERERIsxuCQiIiIiIqLFGFwSERERERHRYgwuiYiIiIiIaDEGl0RERERERLQYg0siIiIiIiJajMElERERERERLcbgkoiIiIiIiBZjcElERERERESLMbgkIiIiIiKixRhcEhERERER0WIMLomIiIiIiGgxBpdERERERES0GINLIiIiIiIiWozBJRERERERES3G4JKIiIiIiIgWY3BJREREREREizG4JCIiIiIiosUYXBIREREREdFiDC6JiIiIiIhoMQaXREREREREtBiDSyIiIiIiIlqMwSUREREREREtxuCSiIiIiIiIFmNwSURERERERIsxuCQiIiIiIqLFGFwSERERERHRYgwuiYiIiIiIaDEGl0RERERERLQYg0siIiIiIiJajMElERERERERLcbgkoiIiIiIiBZjcElERERERESLMbgkIiIiIiKixRhcEhERERER0WIMLomIiIiIiGgxBpdERERERES0GINLIiIiIiIiWozBJRERERERES3G4JKIiIiIiIgWY3BJREREREREizG4JCIiIiIiosUYXBIREREREdFiDC6JiIiIiIhoMQaXREREREREtBiDSyIiIiIiIlqMwSUREREREREtxuCSiIiIiIiIFmNwSURERERERIsxuCQiIiIiIqLFGFwSERERERHRYgwuiYiIiIiIaDEGl0RERERERLQYg0siIiIiIiJajMElERERERERLcbgkoiIiIiIiBZjcElERERERESLMbgkIiIiIiKixRhcEhERERER0WIMLomIiIiIiGgxBpdERERERES0GINLIiIiIiIiWozBJRERERERES3G4JKIiIiIiIgWY3BJREREREREizG4JCIiIiIiosUYXBIREREREdFiDC6JiIiIiIhoMQaXREREREREtBiDSyIiIiIiIlqMwSUREREREREtxuCSiIiIiIiIFmNwSURERERERIsxuCQiIiIiIqLFup/0BtAfnojoT3obiIiIiIi+7FRVftLb8P8HHLkkIiIiIiKixRhcEhERERER0WIMLomIiIiIiGgxBpdERERERES0GINLIiIiIiIiWozBJRERERERES3G4JKIiIiIiIgWY3BJREREREREizG4JCIiIiIiosUYXBIREREREdFiDC6JiIiIiIhoMQaXREREREREtBiDSyIiIiIiIlqMwSUREREREREtxuCSiIiIiIiIFmNwSURERERERIsxuCQiIiIiIqLFGFwSERERERHRYgwuiYiIiIiIaDEGl0RERERERLQYg0siIiIiIiJajMElERERERERLcbgkoiIiIiIiBZjcElERERERESLMbgkIiIiIiKixRhcEhERERER0WIMLomIiIiIiGgxBpdERERERES0GINLIiIiIiIiWozBJRERERERES3G4JKIiIiIiIgWY3BJREREREREizG4JCIiIiIiosUYXBIREREREdFiDC6JiIiIiIhoMQaXREREREREtBiDSyIiIiIiIlqMwSUREREREREtxuCSiIiIiIiIFmNwSURERERERIsxuCQiIiIiIqLFGFwSERERERHRYgwuiYiIiIiIaDEGl0RERERERLQYg0siIiIiIiJajMElERERERERLcbgkoiIiIiIiBZjcElERERERESLMbgkIiIiIiKixRhcEhERERER0WIMLomIiIiIiGgxBpdERERERES0GINLIiIiIiIiWozBJRERERERES3G4JKIiIiIiIgWY3BJREREREREizG4JCIiIiIiosUYXBIREREREdFiDC6JiIiIiIhoMQaXREREREREtBiDSyIiIiIiIlqMwSUREREREREtxuCSiIiIiIiIFmNwSURERERERIsxuCQiIiIiIqLFGFwSERERERHRYgwuiYiIiIiIaDEGl0RERERERLQYg0siIiIiIiJajMElERERERERLcbgkoiIiIiIiBZjcElERERERESLMbgkIiIiIiKixRhcEhERERER0WIMLomIiIiIiGgxBpdERERERES0GINLIiIiIiIiWozBJRERERERES3G4JKIiIiIiIgWY3BJREREREREizG4JCIiIiIiosUYXBIREREREdFiDC6JiIiIiIhoMQaXREREREREtBiDSyIiIiIiIlqMwSUREREREREtxuCSiIiIiIiIFmNwSURERERERIsxuCQiIiIiIqLFGFwSERERERHRYgwuiYiIiIiIaDEGl0RERERERLQYg0siIiIiIiJajMElERERERERLcbgkoiIiIiIiBZjcElERERERESLMbgkIiIiIiKixRhcEhERERER0WIMLomIiIiIiGgxBpdERERERES0GINLIiIiIiIiWozBJRERERERES3G4JKIiIiIiIgWY3BJREREREREizG4JCIiIiIiosUYXBIREREREdFiDC6JiIiIiIhoMQaXREREREREtBiDSyIiIiIiIlqMwSUREREREREtxuCSiIiIiIiIFmNwSURERERERIsxuCQiIiIiIqLFGFwSERERERHRYgwuiYiIiIiIaDEGl0RERERERLQYg0siIiIiIiJajMElERERERERLcbgkoiIiIiIiBZjcElE9CX0BID6//UHP/87/rM/e/CzX/Of/ebBz17zn/3wRz73d/znv3Dws7/qP/urBz/7Bf/Z7/zIv/+h//y1g5/9pv/s1w5+9mf9Z3/nR/597NOh/6d9+tHfJSIiop+c7ie9AfSH91d+9avYXhdsdwM2K8XtdsAwTnj5pQ77YYvrG8HZ6RH+yNunmKaElUwQ3ePZpUKkw8uPFZfbFX77f7vEZ+d3KFXR9RlTKUiqKCJICTjNCV0WfP2rjwAAU1HsdiN++PkddpNirAUiig4Zm1WPr711Hy89PMFu3+Hx/Q6bbofU9TjeJPzcV5/i6Kjg4/M1dJyQIPjO97Y4PVHcO8l49ckJHp5lfP5UcLe7wbNnz/H4YYKqQtMj5H4N4Aa17DHsCob9CCjw5JWMUjP+xv/8Jr736Yi7sWCne4hmiAgEHVQLKgogFRkrTFoAJHQCqCpEEgBF0QmAQgFkdFBU+34BAEWXepQ6QpABCCoUWRRAgqpARKCogFYUVCR0SEiADBD0qFqgWiGS7c9SAAAZCaqAikCgSMjeeRYIavvuqhOKfzM0QzHZtqgAAqhWIGWIViiAJBlFFQkFSTr7Tiiy9AAqgIyp7pHEck2SAK3+OWLXmm2DfY9C23+BigogIUME0FqRUtf2MUn2799BtAdEUTEiSQdRQZIeiopSR9gHZEhSJABVxb+rQFH87xISEhSKLmfUoph0RE49VKttjdoxFxFUVAgUqoKcEqpWiChqLagQiCYoqm2PAKpAFr/eoIAAtdp1AihSElSt6FK2I1IHJMlQjSOhWOc1hrKzoySCigk9Nigofj4LBIKVrFG0oOjg583+NkEASSh1QpLkxx6oCiRRFFQcY4Nf1i2AawDAUwh+Gx3+e3R4lCpQ9/jTX/sp/OCix24c8Wj7BVDPcYQTfEVexoiCJzoB+BgZGW+mr6KoIkPQ64cABjzGm3hDjiBQnOozABd4iMf4SnqMqopXdQ/gfaywwTflm9hjgqIi6x8AmPAWvokEgYjiTD8HcIkzeYLX5T5
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc3873273c8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Display positive anchors before refinement (dotted) and\n",
"# after refinement (solid).\n",
"visualize.draw_boxes(image, boxes=positive_anchors, refined_boxes=refined_anchors, ax=get_ax())"
]
},
{
"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": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"rpn_class shape: (1, 261888, 2) min: 0.00000 max: 1.00000\n",
"pre_nms_anchors shape: (1, 6000, 4) min: -362.03867 max: 1152.00000\n",
"refined_anchors shape: (1, 6000, 4) min: -1513.88135 max: 2315.53491\n",
"refined_anchors_clipped shape: (1, 6000, 4) min: 0.00000 max: 1024.00000\n",
"post_nms_anchor_ix shape: (1000,) min: 0.00000 max: 5233.00000\n",
"proposals shape: (1, 1000, 4) min: 0.00000 max: 1.00000\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], [\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",
"])"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA5cAAAOICAYAAABCFQWrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3XvUbdlZ1/nvM9fa+72dS51T11OnqlJJpWICgZhKELED4hAc0F3SInY7hpbxGqKiYKtNY7dCGLZKCwLdihhoaVouw24EJYCCgiIgl3RIAuESqEqqktS96tzf8172Xms+/cfzzLX3Cd0i7gpFwe8zeKnKqvfde13nnM985pzL3B0RERERERGRTZQXewdERERERETkpU/BpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGxMwaWIiIiIiIhsTMGliIiIiIiIbEzBpYiIiIiIiGysf7F3QP7zmZm/2PsgIiIiIvJS5+72Yu/DbwbKXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIiIiIiMjGFFyKiIiIiIjIxhRcioiIiIiIyMYUXIqIvECch3AeumHbO/h0nId4kPPTtrfwSpyHeDufPG07xw7OQzzBH7zh79/FZ+M8xAOcnbZ9GZ+I8xBfxidO2x7gLM5DvIvPvuHvn+AP4jzEOXambW/nk3Ee4i28ctr2IOdxHuIdfPpGxyQiIiK/dSm4FBF5AawHir8VvW0t0BUREZHfmszdX+x9kP9MZqaLJ/IbRMvaGd/6Iu/Ji6MF12/lp17kPREREfm1c3d7sffhNwMFly9hCi5FfuNoQ0y/kUde5D0RERGRXysFly8MBZcvYQouRUREREQ2p+DyhaE5lyIisrFz7NywaJCIiIj81qPM5UuYMpciv3G0lVO/lyde5D15cfxWn3MqIiIvbcpcvjD6F3sHRER+M/gefg/wWze4epKDF3sXRERE5EWm4FJE5AXwPTz+Yu/Ci+o83/Vi74KIiIi8yDTnUkTkBfA5/DCfww9/zD7fn4ifGzf+DPjP8OBnrjbd89P/G/jl+Emn/8rngT8Z2x78rNh47lbwD4Bf5ubv+Nrpd297/LvAL7N77eFp2x3/8M+CPxN//8DrYuMDrwF/DPwyJ77yS6bfPXH9P4Bf5syHfmy1T9/3N8Cfj78/d0dsfPB3g38ktr3lj68d0y+DX+a2n/in/9Fj4i3/H8cE8VnrvyciIiK/bhRcioj8Bvcrgsr/iA8/8OaP3Y68SF5136/hl9/2Jb/674iIiMjHhrvr5yX6A7h+9KOfj/GPf0v8rG97x1+ObQ++frXtLb8ntv3gT6y2nbsptl34Z86dD662v+8fxvaHvmG17W++ObZ9+4+utj1wr+Pf4g988Gv9gf/i1avtz/wfjv+E80v/frXtm784/v7b/oPzwOti24Ovj23v+rfO9rlfeUyveMtq27/+itj2xd/5K4/pD/uNx/+md8S2tWN61/yP+bvO/PWPyTV4+/8SP/9Jv//2r42fF/u+0Y9+9KMf/bykfl7sdv1vlh/NuRQReQH4N56Hb/wB7Adf+YJ/9rv9fviF3Y/auguv+uhtwLMH8O6feWG++G2f+5/8q29YOCwee2G+96O89X/4tfzyX/qY7IOIiIj86vQqkpcwvYpE5DeOX/dXcTzwmvjnu3/xY/cdb/9T8c+3ftN/wu58Ve7OX/3Y7c9HO3dr/POp5379vlNERH5Tcr2K5AWhOZciIv9/3v6nVgHWr8L
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc387392668>"
]
},
"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=model.anchors[sorted_anchor_ids[:limit]], ax=get_ax())"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABysAAANOCAYAAACht+A3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3XuwbdlV3/ffmGvtfc6579sPdfelJdESyOgBsSUeibFjcKBCiNqhAq4KyJiqODIJYCMcm0Q4thSBy8G4gFQZbNkGpYwgwsSQKCZxUkklFWzxkoSELPGQkFqtfqhv3+6+z3PO3mutOfLHGHPt0wLcKqphdYvvp+tK3eeec/ba6zHnGHOOPae5uwAAAAAAAAAAAADgD1pZ+gAAAAAAAAAAAAAA/OHEZCUAAAAAAAAAAACARTBZCQAAAAAAAAAAAGARTFYCAAAAAAAAAAAAWASTlQAAAAAAAAAAAAAWwWQlAAAAAAAAAAAAgEUwWQkAAAAAAAAAAABgEUxWAgAAAAAAAAAAAFgEk5UAAAAAAAAAAAAAFsFkJQAAAAAAAAAAAIBFMFkJAAAAAAAAAAAAYBFMVgIAAAAAAAAAAABYBJOVAAAAAAAAAAAAABbBZCUAAAAAAAAAAACARTBZCQAAAAAAAAAAAGARTFYCAAAAAAAAAAAAWASTlQAAAAAAAAAAAAAWwWQlAAAAAAAAAAAAgEUwWQkAAAAAAAAAAABgEUxWAgAAAAAAAAAAAFgEk5UAAAAAAAAAAAAAFsFkJQAAAAAAAAAAAIBFMFkJAAAAAAAAAAAAYBFMVgIAAAAAAAAAAABYBJOVAAAAAAAAAAAAABbBZCUAAAAAAAAAAACARTBZCQAAAAAAAAAAAGARTFYCAAAAAAAAAAAAWASTlQAAAAAAAAAAAAAWwWQlAAAAAAAAAAAAgEUwWQkAAAAAAAAAAABgEUxWAgAAAAAAAAAAAFgEk5UAAAAAAAAAAAAAFsFkJQAAAAAAAAAAAIBFMFkJAAAAAAAAAAAAYBFMVgIAAAAAAAAAAABYBJOVAAAAAAAAAAAAABbBZCUAAAAAAAAAAACARTBZCQAAAAAAAAAAAGARTFYCAAAAAAAAAAAAWASTlQAAAAAAAAAAAAAWwWQlAAAAAAAAAAAAgEUwWQkAAAAAAAAAAABgEUxWAgAAAAAAAAAAAFgEk5UAAAAAAAAAAAAAFsFkJQAAAAAAAAAAAIBFMFkJAAAAAAAAAAAAYBFMVgIAAAAAAAAAAABYBJOVAAAAAAAAAAAAABbBZCUAAAAAAAAAAACARTBZCQAAAAAAAAAAAGARTFYCAAAAAAAAAAAAWASTlQAAAAAAAAAAAAAWwWQlAAAAAAAAAAAAgEUwWQkAAAAAAAAAAABgEUxWAgAAAAAAAAAAAFgEk5UAAAAAAAAAAAAAFsFkJQAAAAAAAAAAAIBFMFkJAAAAAAAAAAAAYBFMVgIAAAAAAAAAAABYBJOVAAAAAAAAAAAAABbBZCUAAAAAAAAAAACARTBZCQAAAAAAAAAAAGARTFYCAAAAAAAAAAAAWASTlQAAAAAAAAAAAAAWwWQlAAAAAAAAAAAAgEUwWQkAAAAAAAAAAABgEUxWAgAAAAAAAAAAAFgEk5UAAAAAAAAAAAAAFsFkJQAAAAAAAAAAAIBFMFkJAAAAAAAAAAAAYBFMVgIAAAAAAAAAAABYBJOVAAAAAAAAAAAAABbBZCUAAAAAAAAAAACARTBZCQAAAAAAAAAAAGARTFYCAAAAAAAAAAAAWES/9AHg02NmvvQxAAAA4A83d7eljwEAfjfkzQAAAFgaefPvDZ+sBAAAAAAAAAAAALAIJisBAAAAAAAAAAAALILJSgAAAAAAAAAAAACLYLISAAAAAAAAAAAAwCKYrAQAAAAAAAAAAACwCCYrAQAAAAAAAAAAACyCyUoAAAAAAAAAAAAAi2CyEgAAAAAAAAAAAMAimKwEAAAAAAAAAAAAsAgmKwEAAAAAAAAAAAAsgslKAAAAAAAAAAAAAItgshIAAAAAAAAAAADAIpisBAAAAAAAAAAAALAIJisBAAAAAAAAAAAALILJSgAAAAAAAAAAAACLYLISAAAAAAAAAAAAwCKYrAQAAAAAAAAAAACwCCYrAQAAAAAAAAAAACyCyUoAAAAAAAAAAAAAi2CyEgAAAAAAAAAAAMAimKwEAAAAAAAAAAAAsAgmKwEAAAAAAAAAAAAsgslKAAAAAAAAAAAAAItgshIAAAAAAAAAAADAIpisBAAAAAAAAAAAALAIJisBAAAAAAAAAAAALILJSgAAAAAAAAAAAACLYLISAAAAAAAAAAAAwCKYrAQAAAAAAAAAAACwCCYrAQAAAAAAAAAAACyCyUoAAAAAAAAAAAAAi2CyEgAAAAAAAAAAAMAimKwEAAAAAAAAAAAAsAgmKwEAAAAAAAAAAAAsgslKAAAAAAAAAAAAAItgshIAAAAAAAAAAADAIpisBAAAAAAAAAAAALAIJisBAAAAAAAAAAAALILJSgAAAAAAAAAAAACLYLISAAAAAAAAAAAAwCKYrAQAAAAAAAAAAACwCCYrAQAAAAAAAAAAACyCyUoAAAAAAAAAAAAAi2CyEgAAAAAAAAAAAMAimKwEAAAAAAAAAAAAsAgmKwEAAAAAAAAAAAAsgslKAAAAAAAAAAAAAItgshIAAAAAAAAAAADAIpisBAAAAAAAAAAAALAIJisBAAAAAAAAAAAALILJSgAAAAAAAAAAAACLYLISAAAAAAAAAAAAwCKYrAQAAAAAAAAAAACwCCYrAQAAAAAAAAAAACyCyUoAAAAAAAAAAAAAi2CyEgAAAAAAAAAAAMAimKwEAAAAAAAAAAAAsAgmKwEAAAAAAAAAAAAsgslKAAAAAAAAAAAAAItgshIAAAAAAAAAAADAIpisBAAAAAAAAAAAALAIJisBAAAAAAAAAAAALILJSgAAAAAAAAAAAACLYLISAAAAAAAAAAAAwCKYrAQAAAAAAAAAAACwCCYrAQAAAAAAAAAAACyCyUoAAAAAAAAAAAAAi2CyEgAAAAAAAAAAAMAimKwEAAAAAAAAAAAAsAgmKwEAAAAAAAAAAAAsgslKAAAAAAAAAAAAAItgshIAAAAAAAAAAADAIpisBAAAAAAAAAAAALAIJisBAAAAAAAAAAAALILJSgAAAAAAAAAAAACLYLISAAAAAAAAAAAAwCKYrAQAAAAAAAAAAACwCCYrAQAAAAAAAAAAACyCyUoAAAAAAAAAAAAAi2CyEgAAAAAAAAAAAMAimKwEAAAAAAAAAAAAsAgmKwEAAAAAAAAAAAAsgslKAAAAAAAAAAAAAItgshIAAAAAAAAAAADAIpisBAAAAAAAAAAAALAIJisBAAAAAAAAAAAALILJSgAAAAAAAAAAAACLYLISAAAAAAAAAAAAwCKYrAQAAAAAAAAAAACwCCYrAQAAAAAAAAAAACyCyUoAAAAAAAAAAAAAi2CyEgAAAAAAAAAAAMAimKwEAAAAAAAAAAAAsAgmKwEAAAAAAAAAAAAsgslKAAAAAAAAAAAAAItgshIAAAAAAAAAAADAIpisBAAAAAAAAAAAALAIJisBAAAAAAAAAAAALILJSgAAAAAAAAAAAACLYLISAAAAAAAAAAAAwCKYrAQAAAAAAAAAAACwCCYrAQAAAAAAAAAAACyCyUoAAAAAAAAAAAAAi2CyEgAAAAAAAAAAAMAimKwEAAAAAAAAAAAAsAgmKwHg2fLFXyy5x5/04kuSfyj+6LWvnb/+zn/+IvmHpNf+1LfMX3v9f3Ze/iHprR9+3fy1e+6Mn334N++RXv3q+evv/pf3yD8kvfoHXz9/7U3fc7f8Q9Kb3r/72qtfET//7o++WrrnnvnrD/9KvNY9b/iG+WtvfVsc0+v/390xvfbL4uff+eDu2KUT7+nEe33nD534OgAAAAAAAAAAnwYmKwHg2fK1X7v79xe/WJJ01x0LHcsflPvvf9p/vueD0v3f8rt8LwAAAAAAAAAAn8L8xKdi8NxlZlwo4Pngda+TfuiHJDPpW79
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc386a072b0>"
]
},
"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": 16,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc38736a7f0>"
]
},
"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": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA5cAAAOICAYAAABCFQWrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3UusLVmaH/T/t1bE3ufcc++5eV/5qMysqnZ12e3uNgbUFgMayYPm0UwsS8DAsmwJJJBAyEOQR0hAM0FiYsmykFAzQAJLNBNEiwG2hECyC9RQctld7XpkVmVWZt6b93Wee++ItdbH4Pu+FTsbIYSjmnKW/j+pKjPvPY+9Y0esWN9jrRBVBREREREREdEa6Wf9AoiIiIiIiOjLj8ElERERERERrcbgkoiIiIiIiFZjcElERERERESrMbgkIiIiIiKi1RhcEhERERER0WoMLomIiIiIiGg1BpdERERERES0GoNLIiIiIiIiWo3BJREREREREa3G4JKIiIiIiIhWY3BJREREREREqzG4JCIiIiIiotUYXBIREREREdFqDC6JiIiIiIhoNQaXREREREREtBqDSyIiIiIiIlqNwSURERERERGtxuCSiIiIiIiIVmNwSURERERERKsxuCQiIiIiIqLVGFwSERERERHRagwuiYiIiIiIaDUGl0RERERERLQag0siIiIiIiJajcElERERERERrcbgkoiIiIiIiFZjcElERERERESrMbgkIiIiIiKi1RhcEhERERER0WoMLomIiIiIiGg1BpdERERERES0GoNLIiIiIiIiWo3BJREREREREa3G4JKIiIiIiIhWY3BJREREREREqzG4JCIiIiIiotUYXBIREREREdFqDC6JiIiIiIhoNQaXREREREREtBqDSyIiIiIiIlqNwSURERERERGtxuCSiIiIiIiIVmNwSURERERERKsxuCQiIiIiIqLVGFwSERERERHRagwuiYiIiIiIaDUGl0RERERERLQag0siIiIiIiJajcElERERERERrcbgkoiIiIiIiFZjcElERERERESrMbgkIiIiIiKi1RhcEhERERER0WoMLomIiIiIiGg1BpdERERERES0GoNLIiIiIiIiWo3BJREREREREa3G4JKIiIiIiIhWY3BJREREREREqzG4JCIiIiIiotUYXBIREREREdFqDC6JiIiIiIhoNQaXREREREREtBqDSyIiIiIiIlqNwSURERERERGtxuCSiIiIiIiIVmNwSURERERERKsxuCQiIiIiIqLVGFwSERERERHRagwuiYiIiIiIaDUGl0RERERERLQag0siIiIiIiJajcElERERERERrcbgkoiIiIiIiFZjcElERERERESrMbgkIiIiIiKi1RhcEhERERER0WoMLomIiIiIiGg1BpdERERERES02vCzfgH0j05E9Gf9GoiIiIiIvuxUVX7Wr+HnASuXREREREREtBqDSyIiIiIiIlqNwSURERERERGtxuCSiIiIiIiIVmNwSURERERERKsxuCQiIiIiIqLVGFwSERERERHRagwuiYiIiIiIaDUGl0RERERERLQag0siIiIiIiJajcElERERERERrcbgkoiIiIiIiFZjcElERERERESrMbgkIiIiIiKi1RhcEhERERER0WoMLomIiIiIiGg1BpdERERERES0GoNLIiIiIiIiWo3BJREREREREa3G4JKIiIiIiIhWY3BJREREREREqzG4JCIiIiIiotUYXBIREREREdFqDC6JiIiIiIhoNQaXREREREREtBqDSyIiIiIiIlqNwSURERERERGtxuCSiIiIiIiIVmNwSURERERERKsxuCQiIiIiIqLVGFwSERERERHRagwuiYiIiIiIaDUGl0RERERERLQag0siIiIiIiJajcElERERERERrcbgkoiIiIiIiFZjcElERERERESrMbgkIiIiIiKi1RhcEhERERER0WoMLomIiIiIiGg1BpdERERERES0GoNLIiIiIiIiWo3BJREREREREa3G4JKIiIiIiIhWY3BJREREREREqzG4JCIiIiIiotUYXBIREREREdFqDC6JiIiIiIhoNQaXREREREREtBqDSyIiIiIiIlqNwSURERERERGtxuCSiIiIiIiIVmNwSURERERERKsxuCQiIiIiIqLVGFwSERERERHRagwuiYiIiIiIaDUGl0RERERERLQag0siIiIiIiJajcElERERERERrcbgkoiIiIiIiFZjcElERERERESrMbgkIiIiIiKi1RhcEhERERER0WoMLomIiIiIiGg1BpdERERERES0GoNLIiIiIiIiWo3BJREREREREa3G4JKIiIiIiIhWY3BJREREREREqzG4JCIiIiIiotUYXBIREREREdFqDC6JiIiIiIhoNQaXREREREREtBqDSyIiIiIiIlqNwSURERERERGtxuCSiIiIiIiIVmNwSURERERERKsxuCQiIiIiIqLVGFwSERERERHRagwuiYiIiIiIaDUGl0RERERERLQag0siIiIiIiJajcElERERERERrcbgkoiIiIiIiFZjcElERERERESrMbgkIiIiIiKi1RhcEhERERER0WoMLomIiIiIiGg1BpdERERERES0GoNLIiIiIiIiWo3BJREREREREa3G4JKIiIiIiIhWY3BJREREREREqzG4JCIiIiIiotUYXBIREREREdFqDC6JiIiIiIhoNQaXREREREREtBqDSyIiIiIiIlqNwSURERERERGtxuCSiIiIiIiIVmNwSURERERERKsxuCQiIiIiIqLVGFwSERERERHRagwuiYiIiIiIaDUGl0RERERERLQag0siIiIiIiJajcElERERERERrcbgkoiIiIiIiFZjcElERERERESrMbgkIiIiIiKi1RhcEhERERER0WoMLomIiIiIiGg1BpdERERERES0GoNLIiIiIiIiWo3BJREREREREa3G4JKIiIiIiIhWG37WL4CIiP4R/Yv6s34Ff3T+R/lZvwIiIiL6/4iVSyIiIiIiIlqNlUsioi+7n6cq389zNZaIiOjnHCuXREREREREtBorl19i/85vfB27q4rdfsLJRnGzmzDNBW8+GnCYdri6FpzfO8Uf+9o9lJKwkQLRA15cKEQGvPlYcbHb4G//nQs8fXmL2hTDmFFqRVJFFUFKwL2cMGTBN77+EABQqmK/n/GTZ7fYF8XcKkQUAzJONiN+4av38ejBGfaHAY/vDzgZ9kjDiDsnCX/q689xelrxycstdC5IEPy97+1w70xx9yzj7SdneHCe8ey54HZ/jRcvXuPxgwRVhaaHyOMWwDVaPWDaV0yHGVDgyVsZtWX89t96D9/7bMbtXLHXA0QzRASCAaoVDRWQhowNilYACYMAqgqRBEBRtQBQKICMAYpmv18AQDGkEbXNEGQAggZFFgWQoCoQESgaoA0VDQkDEhIgEwQjmlaoNohk+3epAICMBFVARSBQJGQoAIVA0PrvblpQ/TdDMxTFXosKIIBqA1KGaIMCSJJRVZFQkWSw3wlFlhFAA5BR2gFJLNckCdDmP8cLYvYa7PcotP8TaGgAEjJEAG0NKQ39PSbJ/vv3EB0BUTTMSDJAVJBkhKKhthn2AzIkKRKApuK/q0JR/e8SEhIUiiFntKooOiOnEarNXo3aMRcRNDQIFKqCnBKaNogoWqtoEIgmKJq9HgFUgSx+vkEBAVqz8wRQpCRo2jCkbEekTUiSoRpHQrHNW0x1b0dJBA0FI05QUf3zrBAINrJF1Yqqk39u9rcJAkhCbQVJkh97oCmQRFHRcAcnmFEx+VhwIo+w03/rj2qo+f9V1GAVf/X/9ndvpN/G+eYUAsHTwwVmnZHFrhMBIBCIAEXtXLVzE4Aoamv+GWv8qX12EKjOfv0L4pqAKhQFwAhIsevLP0HAxlAbJ5p/Qn7OaLIxQOvRzwQA+/OEjKoNqg1jzmgNqJghmvp5YN+f/FyxS8N+ToJqg4r9HqD6mDBDIYDG+ZWOxiH/eSh2DfmfJxnsQhexccdHlf7+sPX3VKAYIFohMtp
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc383a07278>"
]
},
"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(image, refined_boxes=proposals, ax=get_ax())"
]
},
{
"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": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"proposals shape: (1, 1000, 4) min: 0.00000 max: 1.00000\n",
"probs shape: (1, 1000, 2) min: 0.00000 max: 1.00000\n",
"deltas shape: (1, 1000, 2, 4) min: -5.36603 max: 3.75144\n",
"masks shape: (1, 100, 28, 28, 2) min: 0.00000 max: 1.00000\n",
"detections shape: (1, 100, 6) min: 0.00000 max: 1010.00000\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": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4 detections: ['balloon' 'balloon' 'balloon' 'balloon']\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA5cAAAOVCAYAAAD9XRTuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3XusbVl21/ffmGvtfc655z7qXV1V/YK2DbZBoAQSIgFxJEeJURCJyEsQ4qAohBBFUUSEI4FQiAiKIpQQJUgEBPIfOFiWAggkIIhAHihChlg4GNyO7e5yd7m6Xvd97zln77XmHPljjLnW7sRgx6tFq+jvR2r71r3n7L2ec80x5phzmbsLAAAAAIAtytd7AwAAAAAAH38ElwAAAACAzQguAQAAAACbEVwCAAAAADYjuAQAAAAAbEZwCQAAAADYjOASAICvIzP7u2b2HV/v7QAAYCuCSwDAP/LM7G0zuzazp2b2yMz+DzP77Wb2sz4Hzew7zOydr9F2fK+Z/f7Tv3P3b3f3/+Vr8fkAAHw9EVwCAL5R/Hp3vyPpM5L+C0nfI+mPf303CQCAf3QQXAIAvqG4+2N3/3OS/jVJ321mv8TMzszsD5rZl8zsfTP7I2Z2YWaXkv6ipDfN7Fn+700zK2b2n5jZT5rZfTP7ATN7qX+Hmf3qHB19ZGZfNrN/y8x+m6TfLOl35ef8+fzZt83sO/PPZ2b2h8zs3fzfHzKzs/y37zCzd8zsd5rZB2b2FTP7rSff+evM7O/l6OxPm9l//A/vqAIAQHAJAPgG5e4/KOkdSb9GMZL5LZJ+uaRvkvSWpN/r7s8lfZekd939dv7vXUn/gaR/UdI/LelNSQ8l/WFJMrPPKALS/1bSq/mZf9vd/6ik75P0X+bn/PqfYbN+t6Rflb/zyyT9E5J+z8m/f0LSvdy+f1vSHzazF/Pf/rikfzdHZ3+JpL+67QgBAPD/D8ElAOAb2buSXpL02yT9R+7+wN2fSvoDkv71f8Dv/XZJv9vd33H3g6T/VNK/bGajpN8k6a+4+59y98nd77v73/45bs9vlvSfufsH7v6hpN8n6bec/PuU/z65+1+Q9EzSLzr5t28zs7vu/tDdf+jn+J0AAHxNEFwCAL6RvSVplHRL0v+ZZayPJP0lxajj389nJP2Zk5//UUlV0uuSPiXpJ3+e2/OmpJ86+e+fyr/r7rv7fPLfV5Ju559/o6RfJ+mnzOx/NbN/6ue5DQAA/LwQXAIAviGZ2a9UBJd/VtK1pG939xfyf/fcvQdt/jP8+pclfdfJz7/g7ufu/tP5b5/7+3ztz/RZp95VBK7dp/Pvflbu/jfd/TdIei336Qd+Lr8HAMDXCsElAOAbipndNbN/QdL3S/qT7v7Dkv6YpP/azF7Ln3nLzP65/JX3Jb1sZvdOPuaPSPrPc36lzOxVM/sN+W/fJ+k7zexfNbPRzF42s19+8lm/8B+weX9K0u/Jz3tF0u+V9Cd/Dvu0N7PfbGb33H2S9ERS+9mPBgAAXzsElwCAbxR/3syeKkYWf7ek/0pSX231eyT9hKS/YWZPJP0V5VxGd/+8Iuj7QpbBvinpv5H05yT95fzMvyHpn8yf/5KiPPV3Snog6W8rFueRYtGdb8vP+bM/wzb+fkl/S9L/JenvSPqh/Lufi98i6e3c/t+umL8JAMA/NOb+s1XoAAAAAADwD8bIJQAAAABgM4JLAAAAAMBmBJcAAAAAgM0ILgEAAAAAmxFcAgAAAAA2I7gEAAAAAGxGcAkAAAAA2IzgEgAAAACwGcElAAAAAGAzgksAAAAAwGYElwAAAACAzQguAQAAAACbEVwCAAAAADYjuAQAAAAAbEZwCQAAAADYjOASAAAAALAZwSUAAAAAYDOCSwAAAADAZgSXAAAAAIDNCC4BAAAAAJsRXAIAAAAANiO4BAAAAABsRnAJAAAAANiM4BIAAAAAsBnBJQAAAABgM4JLAAAAAMBmBJcAAAAAgM0ILgEAAAAAmxFcAgAAAAA2I7gEAAAAAGxGcAkAAAAA2IzgEgAAAACwGcElAAAAAGAzgksAAAAAwGYElwAAAACAzQguAQAAAACbEVwCAAAAADYjuAQAAAAAbEZwCQAAAADYjOASAAAAALAZwSUAAAAAYDOCSwAAAADAZgSXAAAAAIDNCC4BAAAAAJsRXAIAAAAANiO4BAAAAABsRnAJAAAAANiM4BIAAAAAsBnBJQAAAABgM4JLAAAAAMBmBJcAAAAAgM0ILgEAAAAAmxFcAgAAAAA2I7gEAAAAAGxGcAkAAAAA2IzgEgAAAACwGcElAAAAAGAzgksAAAAAwGYElwAAAACAzQguAQAAAACbEVwCAAAAADYjuAQAAAAAbEZwCQAAAADYjOASAAAAALAZwSUAAAAAYDOCSwAAAADAZgSXAAAAAIDNCC4BAAAAAJsRXAIAAAAANiO4BAAAAABsRnAJAAAAANiM4BIAAAAAsBnBJQAAAABgM4JLAAAAAMBmBJcAAAAAgM0ILgEAAAAAm41f7w3Az5+Z+dd7GwAAAICPO3e3r/c2/KOAkUsAAAAAwGYElwAAAACAzQguAQAAAACbEVwCAAAAADYjuAQAAAAAbEZwCQAAAADYjOASAAAAALAZwSUAAAAAYDOCSwAAAADAZgSXAAAAAIDNCC4BAAAAAJsRXAIAAAAANiO4BAAAAABsRnAJAAAAANiM4BIAAAAAsBnBJQAAAABgM4JLAAAAAMBmBJcAAAAAgM0ILgEAAAAAmxFcAgAAAAA2I7gEAAAAAGxGcAkAAAAA2IzgEgAAAACwGcElAAAAAGAzgksAAAAAwGYElwAAAACAzQguAQAAAACbEVwCAAAAADYjuAQAAAAAbEZwCQAAAADYjOASAAAAALAZwSUAAAAAYDOCSwAAAADAZgSXAAAAAIDNCC4BAAAAAJsRXAIAAAAANiO4BAAAAABsRnAJAAAAANiM4BIAAAAAsBnBJQAAAABgM4JLAAAAAMBmBJcAAAAAgM0ILgEAAAAAmxFcAgAAAAA2I7gEAAAAAGxGcAkAAAAA2IzgEgAAAACwGcElAAAAAGAzgksAAAAAwGYElwAAAACAzQguAQAAAACbEVwCAAAAADYjuAQAAAAAbEZwCQAAAADYjOASAAAAALAZwSUAAAAAYDOCSwAAAADAZgSXAAAAAIDNCC4BAAAAAJsRXAIAAAAANiO4BAAAAABsRnAJAAAAANiM4BIAAAAAsBnBJQAAAABgM4JLAAAAAMBmBJcAAAAAgM0ILgEAAAAAmxFcAgAAAAA2I7gEAAAAAGxGcAkAAAAA2IzgEgAAAACwGcElAAAAAGAzgksAAAAAwGYElwAAAACAzQguAQAAAACbEVwCAAAAADYjuAQAAAAAbEZwCQAAAADYjOASAAAAALAZwSUAAAAAYDOCSwAAAADAZgSXAAAAAIDNCC4BAAAAAJsRXAIAAAAANiO4BAAAAABsRnAJAAAAANiM4BIAAAAAsBnBJQAAAABgM4JLAAAAAMBmBJcAAAAAgM0ILgEAAAAAmxFcAgAAAAA2I7gEAAAAAGxGcAkAAAAA2IzgEgAAAACwGcElAAAAAGAzgksAAAAAwGYElwAAAACAzQguAQAAAACbEVwCAAAAADYjuAQAAAAAbEZwCQAAAADYjOASAAAAALAZwSUAAAAAYDOCSwAAAADAZgSXAAAAAIDNCC4BAAAAAJsRXAIAAAAANiO4BAAAAABsRnAJAAAAANiM4BIAAAAAsBnBJQAAAABgM4JLAAAAAMBmBJcAAAAAgM0ILgEAAAAAmxFcAgAAAAA2I7gEAAAAAGxGcAkAAAAA2IzgEgAAAACwGcElAAAAAGCz8eu9Afj5+/e/87O6flp1fXPU+d71/Pqo4zTrtZdHHY7XevrMdPfOhX7hZ+5onov2Nsv8oPuPXWajXnvF9fh6r7/2Nx7r/QdXqs017gbNtaq4q5qpFOnOUDQOps999iVJ0lxdNzeTfvqDK93MrqlVmblGDTrf7/QLPn1PL794qZvDqFfujTofb1TGnW6dF/3Sz36ki4uqdx+
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc32c1d1588>"
]
},
"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": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1000 Valid proposals out of 1000\n",
"24 Positive ROIs\n",
"[('BG', 976), ('balloon', 24)]\n"
]
}
],
"source": [
"# Proposals are in normalized coordinates. Scale them\n",
"# to image coordinates.\n",
"h, w = config.IMAGE_SHAPE[:2]\n",
"proposals = np.around(mrcnn[\"proposals\"][0] * np.array([h, w, h, w])).astype(np.int32)\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": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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fRzwZe7+sXv4iEQEdbcT3Uy/Evjee1nlt5WZR48A/wS8hxK0lhlZrwR+leii+3HKJDcn8P3AUWLSnncDv0dMhHOiff1j4GeA/2Fmh4APEhManaw/Ldt1ZQluLyfGJ95EZFL/OzHB0Ew+g+Nwb591C1AnMrqbyGS+gpOoV7j7MvBq4mtoDpRJjURE5EHA3NU7RURERERERGajzKWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMTMGliIiIiIiIzEzBpYiIiIiIiMxMwaWIiIiIiIjMrD3dGyCfOTPz070NIiIiIiJnOne3070NDwbKXIqIiIiIiMjMFFyKiIiIiIjIzBRcioiIiIiIyMwUXIqIiIiIiMjMFFyKiIiIiIjIzBRcioiIiIiIyMwUXIqIiIiIiMjMFFyKiIiIiIjIzBRcioiIiIiIyMwUXIqIiIiIiMjMFFyKiIiIiIjIzBRcioiIiIiIyMwUXIqIiIiIiMjMFFyKiIiIiIjIzBRcioiIiIiIyMwUXIqIiIiIiMjMFFyKiIiIiIjIzBRcioiIiIiIyMwUXIqIiIiIiMjMFFyKiIiIiIjIzBRcioiIiIiIyMwUXIqIiIiIiMjMFFyKiIiIiIjIzBRcioiIiIiIyMwUXIqIiIiIiMjMFFyKiIiIiIjIzBRcioiIiIiIyMwUXIqIiIiIiMjMFFyKiIiIiIjIzBRcioiIiIiIyMwUXIqIiIiIiMjMFFyKiIiIiIj
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc34809a358>"
]
},
"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(image, boxes=proposals[ixs],\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": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"roi_bbox_specific shape: (1000, 4) min: -4.02370 max: 3.75144\n",
"refined_proposals shape: (1000, 4) min: -347.00000 max: 1334.00000\n"
]
},
{
"data": {
"image/png": "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LM7TA7/rXWziXwK+KUs/P8fdfxL4IuBriDLeNwN/9Fe428/j7j8L/BDw5flHn08sxPPv8jv+L168VPhX+j1PAp8O/FfAc0T28ct5L5777n6HWGjodcSxfwb4H4GDd/d7e/4Se8f1V/r9IiLy0mHu71FFj4iIiIiIiMi7pMyliIiIiIiILKbgUkRERERERBZTcCkiIiIiIiKLKbgUERERERGRxRRcioiIiIiIyGIKLkVERERERGQxBZciIiIiIiKymIJLERERERERWUzBpYiIiIiIiCym4FJEREREREQWU3ApIiIiIiIiiym4FBERERERkcUUXIqIiIiIiMhiCi5FRERERERkMQWXIiIiIiIispiCSxEREREREVlMwaWIiIiIiIgspuBSREREREREFlNwKSIiIiIiIospuBQREREREZHFFFyKiIiIiIjIYgouRUREREREZDEFlyIiIiIiIrKYgksRERERERFZTMGliIiIiIiILKbgUkRERERERBZTcCkiIiIiIiKLKbgUERERERGRxRRcioiIiIiIyGIKLkVERERERGQxBZciIiIiIiKymIJLERERERERWUzBpYiIiIiIiCym4FJEREREREQWU3ApIiIiIiIiiym4FBERERERkcUUXIqIiIiIiMhiCi5FRERERERkMQWXIiIiIiIispiCSxEREREREVlMwaWIiIiIiIgspuBSREREREREFlNwKSIiIiIiIospuBQREREREZHFFFyKiIiIiIjIYgouRUREREREZDEFlyIiIiIiIrKYgksRERERERFZTMGliIiIiIiILKbgUkRERERERBZTcCkiIiIiIiKLKbgUERERERGRxRRcioiIiIiIyGIKLkVERERERGQxBZciIiIiIiKymIJLERERERERWUzBpYiIiIiIiCym4FJEREREREQWU3ApIiIiIiIiiym4FBERERERkcUUXIqIiIiIiMhiCi5FRERERERkMQWXIiIiIiIispiCSxEREREREVlMwaWIiIiIiIgspuBSREREREREFlNwKSIiIiIiIospuBQREREREZHFFFyKiIiIiIjIYgouRUREREREZDEFlyIiIiIiIrKYgksRERERERFZTMGliIiIiIiILKbgUkRERERERBZTcCkiIiIiIiKLKbgUERERERGRxfoP9AbIe8/M/AO9DSIiIiIiL3Xubh/obfjVQJlLERERERERWUzBpYiIiIiIiCym4FJEREREREQWU3ApIiIiIiIiiym4FBERERERkcUUXIqIiIiIiMhiCi5FRERERERkMQWXIiIiIiIispiCSxEREREREVlMwaWIiIiIiIgspuBSREREREREFlNwKSIiIiIiIospuBQREREREZHFFFyKiIiIiIjIYgouRUREREREZDEFlyIiIiIiIrKYgksRERERERFZTMGliIiIiIiILKbgUkRERERERBZTcCkiIiIiIiKLKbgUERERERGRxRRcioiIiIiIyGIKLkVERERERGQxBZciIiIiIiKymIJLERERERERWUzBpYiIiIiIiCym4FJEREREREQWU3ApIiIiIiIiiym4FBERERERkcUUXIqIiIiIiMhiCi5FRERERERkMQWXIiIiIiIispiCSxEREREREVlMwaWIiIiIiIgspuBSREREREREFlNwKSIiIiIiIos
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc32c1ad320>"
]
},
"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).astype(np.int32)\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(image, boxes=proposals[roi_positive_ixs][ids],\n",
" refined_boxes=refined_proposals[roi_positive_ixs][ids],\n",
" visibilities=np.where(roi_class_ids[roi_positive_ixs][ids] > 0, 1, 0),\n",
" captions=captions, title=\"ROIs After Refinement\",\n",
" ax=get_ax())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Filter Low Confidence Detections"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Keep 24 detections:\n",
"[ 0 1 4 5 9 10 13 18 21 25 47 62 74 78 87 133 160 162\n",
" 176 178 234 317 660 928]\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": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Remove boxes below 0.9 confidence. Keep 20:\n",
"[ 0 1 4 5 9 10 13 21 25 47 62 74 78 160 162 176 178 317\n",
" 660 928]\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": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"balloon : [ 0 1 4 5 9 10 13 21 25 47 62 74 78 160 162 176 178 317\n",
" 660 928] -> [1 4 0 5]\n",
"\n",
"Kept after per-class NMS: 4\n",
"[0 1 4 5]\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": 26,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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wN/O9/024J/P13+MKE/97UTZ7XcSi/NALLrzRfk+f+1ttvMPAv8Q+H+B7wa+gx/56zq6Xwu8lNv/G4n5m2/n9wM/A7gH/K9E2emn8pZtdvcK/DJi0aGPEiO//wOx0NCn6+uAT7zTD939FXf/1nf6MTH6+SYxyvtLgH/F3R+u2B4REXmXMfcfS9WMiIiIiIiIyD9JI5ciIiIiIiKymoJLERERERERWU3BpYiIiIiIiKym4FJERERERERWU3ApIiIiIiIiqym4FBERERERkdUUXIqIiIiIiMhqCi5FRERERERkNQWXIiIiIiIispqCSxEREREREVlNwaWIiIiIiIispuBSREREREREVlNwKSIiIiIiIqspuBQREREREZHVFFyKiIiIiIjIagouRUREREREZDUFlyIiIiIiIrKagksRERERERFZTcGliIiIiIiIrKbgUkRERERERFZTcCkiIiIiIiKrKbgUERERERGR1RRcioiIiIiIyGoKLkVERERERGQ1BZciIiIiIiKymoJLERERERERWU3BpYiIiIiIiKym4FJERERERERWU3ApIiIiIiIiqym4FBERERERkdUUXIqIiIiIiMhqCi5FRERERERkNQWXIiIiIiIispqCSxEREREREVlNwaWIiIiIiIispuBSREREREREVlNwKSIiIiIiIqspuBQREREREZHVFFyKiIiIiIjIagouRUREREREZDUFlyIiIiIiIrKagksRERERERFZTcGliIiIiIiIrKbgUkRERERERFZTcCkiIiIiIiKrKbgUERERERGR1RRcioiIiIiIyGoKLkVERERERGQ1BZciIiIiIiKymoJLERERERERWU3BpYiIiIiIiKym4FJERERERERWU3ApIiIiIiIiqym4FBERERERkdUUXIqIiIiIiMhqCi5FRERERERkNQWXIiIiIiIispqCSxEREREREVlNwaWIiIiIiIispuBSREREREREVlNwKSIiIiIiIqspuBQREREREZHVFFyKiIiIiIjIagouRUREREREZDUFlyIiIiIiIrKagksRERERERFZTcGliIiIiIiIrKbgUkRERERERFZTcCkiIiIiIiKrKbgUERERERGR1RRcioiIiIiIyGoKLkVERERERGQ1BZciIiIiIiKymoJLERERERERWU3BpYiIiIiIiKym4FJERERERERWGz/bGyCfPjPzz/Y2iIiIiIi827m7fba34ScCjVyKiIiIiIjIagouRUREREREZDUFlyIiIiIiIrKagksRERERERFZTcGliIiIiIiIrKbgUkRERERERFZTcCkiIiIiIiKrKbgUERERERGR1RRcioiIiIiIyGoKLkVERERERGQ1BZciIiIiIiKymoJLERERERERWU3BpYiIiIiIiKym4FJERERERERWU3ApIiIiIiIiqym4FBERERERkdUUXIqIiIiIiMhqCi5FRERERERkNQWXIiIiIiIispqCSxEREREREVlNwaWIiIiIiIispuBSREREREREVlNwKSIiIiIiIqspuBQREREREZHVFFyKiIiIiIjIagouRUREREREZDUFlyIiIiIiIrKagksRERERERFZTcGliIiIiIiIrKbgUkRERERERFZTcCkiIiIiIiKrKbgUERERERGR1RRcioiIiIiIyGoKLkVERER
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc383be53c8>"
]
},
"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, boxes=proposals[keep][ixs],\n",
" refined_boxes=refined_proposals[keep][ixs],\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": 27,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc3480a4470>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display_images(np.transpose(gt_mask, [2, 0, 1]), cmap=\"Blues\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.b Predicted Masks"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"detections shape: (1, 100, 6) min: 0.00000 max: 1010.00000\n",
"masks shape: (1, 100, 28, 28, 2) min: 0.00000 max: 1.00000\n",
"4 detections: ['balloon' 'balloon' 'balloon' 'balloon']\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": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"det_mask_specific shape: (4, 28, 28) min: 0.00000 max: 1.00000\n",
"det_masks shape: (4, 1024, 1024) min: 0.00000 max: 1.00000\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": 30,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc348328b38>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display_images(det_mask_specific[:4] * 255, cmap=\"Blues\", interpolation=\"none\")"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc3484677b8>"
]
},
"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": 32,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"input_image shape: (1, 1024, 1024, 3) min: -123.70000 max: 151.10001\n",
"res2c_out shape: (1, 256, 256, 256) min: 0.00000 max: 30.27820\n",
"res3c_out shape: (1, 128, 128, 512) min: 0.00000 max: 32.50589\n",
"res4w_out shape: (1, 64, 64, 1024) min: 0.00000 max: 76.81063\n",
"rpn_bbox shape: (1, 261888, 4) min: -7.21691 max: 89.27760\n",
"roi shape: (1, 1000, 4) min: 0.00000 max: 1.00000\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",
" (\"res4w_out\", model.keras_model.get_layer(\"res4w_out\").output), # for resnet100\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": 33,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc3485376a0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Input image (normalized)\n",
"_ = plt.imshow(modellib.unmold_image(activations[\"input_image\"][0],config))"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc3485bb470>"
]
},
"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
}