GeoYolo-SLAM/MaskRCNN_ROS/include/MaskRCNN/samples/coco/inspect_model.ipynb

1394 lines
9.8 MiB
Plaintext
Raw Normal View History

2025-04-09 16:05:54 +08:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Mask R-CNN - Inspect 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": [
"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",
"%matplotlib inline \n",
"\n",
"# Directory to save logs and trained model\n",
"MODEL_DIR = os.path.join(ROOT_DIR, \"logs\")\n",
"\n",
"# Local path to trained weights file\n",
"COCO_MODEL_PATH = os.path.join(ROOT_DIR, \"mask_rcnn_coco.h5\")\n",
"# Download COCO trained weights from Releases if needed\n",
"if not os.path.exists(COCO_MODEL_PATH):\n",
" utils.download_trained_weights(COCO_MODEL_PATH)\n",
"\n",
"# Path to Shapes trained weights\n",
"SHAPES_MODEL_PATH = os.path.join(ROOT_DIR, \"mask_rcnn_shapes.h5\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Configurations"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Run one of the code blocks\n",
"\n",
"# Shapes toy dataset\n",
"# import shapes\n",
"# config = shapes.ShapesConfig()\n",
"\n",
"# MS COCO Dataset\n",
"import coco\n",
"config = coco.CocoConfig()\n",
"COCO_DIR = \"path to COCO dataset\" # TODO: enter value here"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Configurations:\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.5\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.002\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 coco\n",
"NUM_CLASSES 81\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 2\n",
"RPN_BBOX_STD_DEV [ 0.1 0.1 0.2 0.2]\n",
"RPN_TRAIN_ANCHORS_PER_IMAGE 256\n",
"STEPS_PER_EPOCH 1000\n",
"TRAIN_ROIS_PER_IMAGE 128\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": {
"collapsed": true
},
"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": {
"collapsed": true
},
"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": [
"loading annotations into memory...\n",
"Done (t=4.86s)\n",
"creating index...\n",
"index created!\n",
"Images: 35185\n",
"Classes: ['BG', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']\n"
]
}
],
"source": [
"# Build validation dataset\n",
"if config.NAME == 'shapes':\n",
" dataset = shapes.ShapesDataset()\n",
" dataset.load_shapes(500, config.IMAGE_SHAPE[0], config.IMAGE_SHAPE[1])\n",
"elif config.NAME == \"coco\":\n",
" dataset = coco.CocoDataset()\n",
" dataset.load_coco(COCO_DIR, \"minival\")\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": {
"collapsed": true,
"scrolled": false
},
"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)\n",
"\n",
"# Set weights file path\n",
"if config.NAME == \"shapes\":\n",
" weights_path = SHAPES_MODEL_PATH\n",
"elif config.NAME == \"coco\":\n",
" weights_path = COCO_MODEL_PATH\n",
"# Or, uncomment to 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": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"image ID: coco.392144 (34940) http://cocodataset.org/#explore?id=392144\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, 89) min: 0.00000 max: 1024.00000\n",
"gt_class_id shape: (10,) min: 1.00000 max: 40.00000\n",
"gt_bbox shape: (10, 5) min: 0.00000 max: 1024.00000\n",
"gt_mask shape: (1024, 1024, 10) min: 0.00000 max: 1.00000\n"
]
},
{
"data": {
"image/png": "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\nl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGE\nEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBC\nCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJ\nqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKI\nl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGE\nEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBC\nCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJ\nqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKI\nl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGE\nEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBC\nCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJ\nqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKI\nl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGE\nEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBC\nCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJ\nqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKI\nl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGE\nEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBC\nCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJ\nqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKIl0AJqhBCCCGEEEKI\nl0AJqhBCCCGEEEKIl0A
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08baf8f780>"
]
},
"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",
"# 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": [
"### Precision-Recall"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n/nPN/uuDBlUzaFB1AUI
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08c3caadd8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Draw precision-recall curve\n",
"AP, precisions, recalls, overlaps = utils.compute_ap(gt_bbox, gt_class_id, gt_mask,\n",
" r['rois'], r['class_ids'], r['scores'], r['masks'])\n",
"visualize.plot_precision_recall(AP, precisions, recalls)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n+inH8/HHC9hs82789Zb
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08ba44d6d8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Grid of ground truth objects and their predictions\n",
"visualize.plot_overlaps(gt_class_id, r['class_ids'], r['scores'],\n",
" overlaps, dataset.class_names)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Compute mAP @ IoU=50 on Batch of Images"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.5/dist-packages/scipy/ndimage/interpolation.py:600: UserWarning: From scipy 0.13.0, the output shape of zoom() is calculated with round() instead of int() - for these inputs the size of the returned array has changed.\n",
" \"the returned array has changed.\", UserWarning)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"mAP @ IoU=50: 0.656323084916\n"
]
}
],
"source": [
"# Compute VOC-style Average Precision\n",
"def compute_batch_ap(image_ids):\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([image], verbose=0)\n",
" # Compute AP\n",
" r = results[0]\n",
" AP, precisions, recalls, overlaps =\\\n",
" utils.compute_ap(gt_bbox, gt_class_id, gt_mask,\n",
" r['rois'], r['class_ids'], r['scores'], r['masks'])\n",
" APs.append(AP)\n",
" return APs\n",
"\n",
"# Pick a set of random images\n",
"image_ids = np.random.choice(dataset.image_ids, 10)\n",
"APs = compute_batch_ap(image_ids)\n",
"print(\"mAP @ IoU=50: \", 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": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"target_rpn_match shape: (65472,) min: -1.00000 max: 1.00000\n",
"target_rpn_bbox shape: (256, 4) min: -5.19860 max: 2.59641\n",
"positive_anchors shape: (14, 4) min: 5.49033 max: 973.25483\n",
"negative_anchors shape: (242, 4) min: -22.62742 max: 1038.62742\n",
"neutral anchors shape: (65216, 4) min: -362.03867 max: 1258.03867\n",
"refined_anchors shape: (14, 4) min: 0.00000 max: 1023.99994\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": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6gAAAOZCAYAAAATZw0gAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvVuSJDvOrbdAz+pjmoHGp0npUSPQPDQQDUAvMtPpTif0\nACwA9Iis3t3/kXWUbH3bdmVmhF9IkMSFV3N3CCGEEEIIIYQQ/2nWfzoBQgghhBBCCCEEoABVCCGE\nEEIIIcSHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABV\nCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRH\noABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEII\nIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGE\nEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABV\nCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRH\noABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEII\nIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGE\nEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABV\nCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRH\noABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEII\nIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGE\nEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABV\n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\nvh3ra+U9LMlM28yL765
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08b7ff9080>"
]
},
"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": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"rpn_class shape: (1, 65472, 2) min: 0.00000 max: 1.00000\n",
"pre_nms_anchors shape: (1, 10000, 4) min: -362.03867 max: 1258.03870\n",
"refined_anchors shape: (1, 10000, 4) min: -1385.67920 max: 2212.44043\n",
"refined_anchors_clipped shape: (1, 10000, 4) min: 0.00000 max: 1024.00000\n",
"post_nms_anchor_ix shape: (1000,) min: 0.00000 max: 1477.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": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6gAAAOZCAYAAAATZw0gAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvduu7Vt21ve1PubaxFJyj5RLginvKhNksPMAkRXJ4BO2\nAWMDEUbAG+UqyhPkBuyyy65dJhIydngNHiAXiRSq5ugtF619rbX+H2Ot2lUmqrGk77e19pxzjP+h\n99Z7b4d+NHeHEEIIIYQQQgjxk2b9pBMghBBCCCGEEEIAClCFEEIIIYQQQrwIClCFEEIIIYQQQrwE\nClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQ\nQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEII\nIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCF\nEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwE\nClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQ\nQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEII\nIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCF\nEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwE\nClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQ\nQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEII\nIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCF\nEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwE\nClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQ\nQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEII\nIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCF\nEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEClCFEEIIIYQQQrwEbz/pBIgfHTO7Afir\nP+l0CCGEEEIIIQ7+L3f/f37SificUYD6efJXAfynn3QihBBCCCGEEAf/HMD/9pNOxOeMpvgKIYQQ\nQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAK\nIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJ\nFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQggh\nhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQ\nQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAK\nIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJ\nFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQggh\nhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQ\nQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAK\nIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJ\nFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQggh\nhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQ\nQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAK\nIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJ\nFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQggh\nhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQ\nQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAK\nIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJ\nFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQggh\nhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQ\nQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAK\nIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJ\nFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQggh\nhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQ\nQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJFKAK\nIYQQQgghhHgJFKAKIYQQQgghhHgJFKAKIYQQQgghhHgJ3n7SCRA/Ov/L//7nAAAD4FiAe/xtxg/h\ncMA3YAar7wwA4O5wy4eZYWHBsAFsvK0FM8PezsvhcBgMay0sM5gDcIctw23FnYADuGHfN/beMDPY\n4iscZo5lhnixRXoueOaj8nL5bH4Od9xu53PiPYYVb8h7HTDHWiuS2LfHHwbcd/zt7nmPwfP+ug7A\ne+Xz0z07ZiErsveGe+Tf8llm8a4olwWY1ft5fXwO3AxYBtxuwFv+Hvm2yu+DHFdIYe+N+95wLIwq\nUHKNfFfKcd8b73fH3QxT8uaR951/L1uRE3esZVhmuFlUvpBd/mYeSXHHsoXbWnB33O933LHq3Y6z\nfsY7UiYIOZkZsCMFN9ZFOHbUdphZ3ZvSmTmAW9RjPNQzzyKwesasf/VsGHytqhOPddSwVty/AfhC\nVL+UX8grf2ZbDTmdeYZ
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08b7d81f60>"
]
},
"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": 16,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAByUAAANICAYAAABpJzOZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Ut65UiSnuHfHIxqPVpJj7US7U4r0FD70D60iu4k3DSw\nixsOGVnVg1PJlr63uzIiyENcHH4xA5wOc3cBAAAAAAAAAAAAwLusv/oAAAAAAAAAAAAAAPy/jYeS\nAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IA\nAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAA\nAAAAAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADeioeSAAAA\nAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IAAAAA\nAAAAAAAA3oqHkgAAAAAAAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAAAAAA\nAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADeioeSAAAAAAAA\nAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IAAAAAAAAA\nAAAA3oqHkgAAAAAAAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAAAAAAAAAA\nAADeioeSAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADeioeSAAAAAAAAAAAA\nAN6Kh5IAAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA\n3oqHkgAAAAAAAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADe\nioeSAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADeioeSAAAAAAAAAAAAAN6K\nh5IAAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqH\nkgAAAAAAAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADeioeS\nAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IA\nAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAA\nAAAAAAAAAADeioeSAAAAAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3oqHkgAAAAAAAAAAAADeioeSAAAA\nAAAAAAAAAN6Kh5IAAAAAAAAAAAAA3urjrz4A/J6Z/U9J//pXHwcAAAD+v/ff3f3//NUHAQCvyJsB\nAADwQ5A3/wN4KPmz/auk//ZXHwQAAAD+v/cvf/UBAMBvkDcDAADgJyBv/gewfCsAAAAAAAAAAACA\nt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC3\n4qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfi\noSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+Kh\nJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEk\nAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQA\nAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAA\nAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAA\nAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAA\nAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAA\nAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAA\nAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAA\nAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAA\nAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAA\ngLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACA\nt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC3\n4qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfi\noSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+Kh\nJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEk\nAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQA\nAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAA\nAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAA\nAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAA\nAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAA\nAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAA\nAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAA\nAACAt+KhJAAAAAAAAAAAAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAA\nAIC34qEkAAAAAAAAAAAAgLfioSQAAAAAAAAAAACAt+KhJAAAAAAAAAAAAIC3+virDwC/9z/+1/+W\nSXKZ5JLMZIo/3V3yLcklMy0zmZlckrvLLbZhdmnJJd261tIy094uy++7XMuW1lpanjt218fH0s5P\nmC7d99beW+uyPr61tpZMMpM89v/K3fM47PHvYmaSu9YyrWXj6y6r83LJfUvmWmtlWfShSorz3i7t\n7bmPOK74t/oHPvucehNfmFnsp8oy/3fZ6mNzj+PTuvpze0cZyZZk0jLpMum6pI/8t5nJbH3Zv7v3\ntu771p3HbFm851jqnKM
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08b7bbf240>"
]
},
"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": 17,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6gAAAOZCAYAAAATZw0gAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvVuSJDvOrbdAz+pjmoHGp0npUSPQPDQQDUAvMtPpTif0\nACwA9Iis3t3/kXWUbH3bdmVmhF9IkMSFV3N3CCGEEEIIIYQQ/2nWfzoBQgghhBBCCCEEoABVCCGE\nEEIIIcSHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABV\nCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRH\noABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEII\nIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGE\nEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABV\nCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRH\noABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEII\nIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGE\nEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABV\nCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRH\noABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEII\nIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGE\nEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABV\n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\nvh3ra+U9LMlM28yL765
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08b7bc2860>"
]
},
"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": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6gAAAOZCAYAAAATZw0gAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvVuSJDvOrbdAz+pjmoHGp0npUSPQPDQQDUAvMtPpTif0\nACwA9Iis3t3/kXWUbH3bdmVmhF9IkMSFV3N3CCGEEEIIIYQQ/2nWfzoBQgghhBBCCCEEoABVCCGE\nEEIIIcSHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABV\nCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRH\noABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEII\nIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGE\nEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABV\nCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRH\noABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEII\nIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGE\nEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABV\nCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRH\noABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEII\nIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGE\nEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABV\nCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRH\noABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEII\nIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGEEEIIIcRHoABVCCGE\nEEIIIcRH8PWfToD41zGzC8D//J9OhxBCCCGEEOLg/3L3//s/nYg/GQWofyb/M4D/8z+dCCGEEEII\nIcTB/wLgf/tPJ+JPRlN8hRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGE\nEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBC\nCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQ\nhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8\nBApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGE\nEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBC\nCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQ\nhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8\nBApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGE\nEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBC\nCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQ\nhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8\nBApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGE\nEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBC\nCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQ\nhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8\nBApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGE\nEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBC\nCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQ\nhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8\nBApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGE\nEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBC\nCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQ\nhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8\nBApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGE\nEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BApQhRBCCCGEEEJ8BF//6QSI\nf53/9X//PwAABsCxAPf424wfwuGAb8AMVt8ZAMDd4ZYPM8PCgmED2PhaC2aGvZ2Xw+EwGNZaWGYw\nB+AOW4ZrxZ2AA7iw7429N8wMtvgKh5ljmSFebJGeB575qLw8Ppufwx3XdT4n3mNY8Ya81wFzrLUi\niX17/GHAveNvd897DJ7313UAviufv+/ZMQtZkb033CP/ls8yi3dFuSzArN7P6+Nz4DJgGXBdwFf+\nHvm2yu+LHFdIYe+Ne284FkYVKLlGvivluPfG9+24zTAlbx553/n3shU5ccdahmWGy6LyhezyN/NI\nijuWLVxrwd1x3zdurHq346yf8Y6UCUJOZgbsSMHFugjHjtoOM6t7UzozB3CLeoyXeuZZBFbPmPWv\nng2Dr1V14rWOGtaK+zcAX4jql/ILeeXPbKshpzPPsK6qnqVgzjdErrquAntnPQewrqxL8bBqr74d\nvh3ra+U9LMlM28yL765
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08b77de9e8>"
]
},
"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": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"All Anchors (65472) Recall: 0.400 Positive anchors: 8\n",
"Refined Anchors (10000) Recall: 0.900 Positive anchors: 65\n",
"Post NMS Anchors ( 50) Recall: 0.800 Positive anchors: 9\n"
]
}
],
"source": [
"# Measure the RPN recall (percent of objects covered by anchors)\n",
"# Here we measure recall for 3 different methods:\n",
"# - All anchors\n",
"# - All refined anchors\n",
"# - Refined anchors after NMS\n",
"iou_threshold = 0.7\n",
"\n",
"recall, positive_anchor_ids = utils.compute_recall(model.anchors, gt_bbox, iou_threshold)\n",
"print(\"All Anchors ({:5}) Recall: {:.3f} Positive anchors: {}\".format(\n",
" model.anchors.shape[0], recall, len(positive_anchor_ids)))\n",
"\n",
"recall, positive_anchor_ids = utils.compute_recall(rpn['refined_anchors'][0], gt_bbox, iou_threshold)\n",
"print(\"Refined Anchors ({:5}) Recall: {:.3f} Positive anchors: {}\".format(\n",
" rpn['refined_anchors'].shape[1], recall, len(positive_anchor_ids)))\n",
"\n",
"recall, positive_anchor_ids = utils.compute_recall(proposals, gt_bbox, iou_threshold)\n",
"print(\"Post NMS Anchors ({:5}) Recall: {:.3f} Positive anchors: {}\".format(\n",
" proposals.shape[0], recall, len(positive_anchor_ids)))\n"
]
},
{
"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, 1000, 4) min: 0.00000 max: 1.00000\n",
"probs shape: (1, 1000, 81) min: 0.00000 max: 0.99999\n",
"deltas shape: (1, 1000, 81, 4) min: -3.26400 max: 3.83929\n",
"masks shape: (1, 100, 28, 28, 81) min: 0.00000 max: 0.99984\n",
"detections shape: (1, 100, 6) min: 0.00000 max: 844.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": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"8 detections: ['person' 'person' 'person' 'person' 'person' 'airplane' 'airplane' 'car']\n"
]
},
{
"data": {
"image/png": "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\nAAAAeAkIUAEAAAAAAOA
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08b76bd6d8>"
]
},
"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": [
"1000 Valid proposals out of 1000\n",
"71 Positive ROIs\n",
"[('BG', 929), ('airplane', 23), ('car', 11), ('person', 37)]\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": 23,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6gAAAOoCAYAAADcQdkoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvXvwt+ld1/f+XPfv2QGCiYQcIAludhMI2c0JsLBJgBxW\nQGoRp1Vop1OxTLHW2jodWkUcijqF6h9tZQaxDG1p1RnB2grDdBwtARSp2NFSNYRqOSYgBMPBIJHs\n/u7r0z8+x+v+fp8nuxtk74e+XzvPPs/3+70P1/Fzuk6iqiCEEEIIIYQQQp5txrOdAEIIIYQQQggh\nBKCDSgghhBBCCCHkJNBBJYQQQgghhBByCuigEkIIIYQQQgg5BXRQCSGEEEIIIYScAjqohBBCCCGE\nEEJOAR1UQggh5GkgIp8kIv+XiPwzEfkDz3Z6PhQi8s0i8vMi8v0i8pki8kPPdpoIIYSQu0EHlRBC\nyK85IvLjIvIBEXm/iPwTd6I+6nDNm0TkHX7NL4jIt4vIq9vvbxGR9zyDd3+1iDzhz32/iPygiPzr\nT+MRfwjAd6vq81T165/u+58OIvKgiMyW1h8VkT/8NO7/TACPA3iJqj6mqn9LVV/9oe77tcbr5M89\n2+kghBDy7EMHlRBCyLOBAvhtqvpcAG8A8CkA/kj8KCJvBPDXAPwVAB8P4CEA/wDA94nIyw/PeSZ8\ni6o+19//nwD4CyLywqd474MAfvCZvFREtmdwmwJ4nqf1dwH4KhF5/Cne+3IAP66qv/IM3ksIIYT8\nmkMHlRBCyLOFAICq/izMGX1D++1PAfgfVfXrVfWXVfUXVfWrAHw/gD929WEiv0dEfsRHGn9ERP6t\np5IIVf3rAH4JwCvas/41EfkBH7n9WyLyGv/+HQDeBuDP+HteKSLPFZE/JyI/KyI/JiJ/tD3nS/z+\n/1pEfg7AV/v3Xyoi7xKRnxORvyoiv+kpltXfgznHWVYi8vEi8pf9/T8iIv9RvAPANwF4o6f1q4+j\nzp7eLxeRv+95/Ysi8oD/9hYReY+I/Gci8l4R+SkR+UIR+XwR+Uci8j4R6UEFEZGvEJEfFpF/KiLf\nIiK/0X+LkeDfLSI/4Wn9Sv/t8wB8JYAvFpFfEpEfeCr1Rggh5NcndFAJIYQ8q4jIywB8PoD/1z9/\nJIA3AfjLVy7/SwA+58ozPgrA1wH4PB9pfBOA//spvv+3AbgD4F3++VMB/PcAvgzA8wF8I4DvEJE7\nqvo4gO8F8B/6COwPA/h6AL8BNlr5VgC/W0T+3faKzwDwwwBeCOBrROR3APgKAL/Dv/teAH/xQyXT\n0/YYgEf9eRARAfAdAH4ANtL8OIA/KCKfo6r/A4DfB+Bve1r/uD/rOOr8uwB8LmyU+vUAfk/77eMA\nPADgJTDn+psA/NuwEe/PBvCftxHtPwjgtwP4LL/+FwB8w+FdbwbwiQB+i9/7KlX9awC+FsC3qupv\nUNVP+RBlQQgh5NcxdFAJIYQ8W3ybiLwfwLsBvBc1Mvp8mH766Sv3/DSAF9zleTuA14rIR6jqe1X1\nXpsBfbFvHPTLAL4NwNeq6vv9t38PwH+rqn9XjT8P4IMAHjs+REQGgC8C8BWq+gFV/QkA/xWAf6dd\n9lOq+g2qOlX1gwB+L4D/UlX/sapOAH8SwBtE5BPuklYB8E9F5AMAvg/AN6jqt/tv/wqAF6jq16jq\nrqo/DuC/A/Bv3iPvR77Oy+sXYc5uH8l+wstmB/AtsLL/057Xd8FGc1/n1/5eAH9UVX9aVZ8E8CcA\n/E4vI8Ac4z+mqk+o6j8A8PdhDjEhhBCS0EElhBDybPGFPtr5FgCfjHI8fwHAhI0IHvl4AO87fqmq\nHwDwxQD+AwA/LSLfISKvuse7v1VVn6+qz4FN7f0SEfky/+1BAF/uDuzPi8gvAHgZbFTwyAtgo6/v\nbt/9BICXts/HjZweBPB18XwAPwdz3l6K6yiAjwXwHAD/KYC3ishNe9ZLD2n9IwBedI+8H3lv+/cH\nAHx0+/xzqhojrv/C//7Z9vu/aNc/COCvtHy9C8CTAF78FN9FCCGE0EElhBDyrBHrKr8XwP8EG3kM\nZ/Nvw6aeHvkiAN957WGq+r+r6ufCpqX+I9h01A+Jqr4bwF8F8AX+1XsAfI07sM9X1Y9R1Y9W1W+9\ncvv7YE7Yg+27BwH8VH/F4Z53A/j3rzz/+++RTPHR3P8GNpr7+1taf/TwrOep6hfc/VH/0ng3gM8/\npOU5qnptJPzIM93sihBCyK8z6KASQgg5A38awOeISEwX/QrYqOYfEJGPFpGPEZH/AjbN9o8fbxaR\nF4nIF/ha1CcB/HMAt/d4n7R7XwbgtwJ4p3/1TQB+n4h8uv/+HBH5V0XkOceH+BTdvwRbW/rRIvIg\nbFfgP3+Pd38jgK8UkUf8+c8Tkd/5VNLq/EkAf9g3M/o/AbxfRP6QiHyEiGwi8qiI/OZ7PO9fFt8I\n4GtjwycReaGI/Pb2+zEfnfcCeLmvqSWEEPL/Y+igEkIIeTZYRsxU9X2wUdSv8s/fB+DzAPwbsHWn\nPwZbr/hmVf3RK88bAL4cNnL5PtgGPr//ynXBF/nOtu8H8HdgGxX9CX/334NtkPT1PlX1HwP4krul\nHcB/DJuu+qMA/iaAv6Cq33zXjKt+G8zJ/BYR+UXY8Tm/9R5pPZbV/wbg5wF8mTvIXwBbN/pjsOm3\n3wTgufd43l2f/Qyu75+/DsC3A/jrIvLPAPwfAD79Kd77P8Mc2J8Tkb/7NNNECCHk1xFSS0sIIYQQ\nQgghhJBnD46gEkIIIYQQQgg5BXRQCSGEEEIIIYScAjqohBBCCCGEEEJOAR1UQgghhBBCCCGngA4q\nIYQQQgghhJBTQAeVEEIIIYQQQsgpoINKCCGEEEIIIeQU0EElhBBCCCGEEHIK6KASQgghhBBCCDkF\ndFAJIYQQQgghhJwCOqiEEEIIIYQQQk4BHVRCCCGEEEIIIaeADiohhBBCCCGEkFNAB5UQQgghhBBC\nyCmgg0oIIYQQQggh5BTQQSWEEEIIIYQQcgrooBJCCCGEEEIIOQV0UAkhhBBCCCGEnAI6qIQQQggh\nhBBCTgEdVEIIIYQQQgghp4AOKiGEEEIIIYSQU0AHlRBCCCGEEELIKaCDSgghhBBCCCHkFNBBJYQQ\nQgghhBByCuigEkIIIYQQQgg5BXRQCSGEEEIIIYScAjqohBBCCCGEEEJOAR1UQgghhBBCCCGngA4q\nIYQQQgghhJBTQAeVEEIIIYQQQsgpoINKCCGEEEIIIeQU0EElhBBCCCGEEHIK6KASQgghhBBCCDkF\ndFAJIYQQQgghhJwCOqiEEEIIIYQQQk4BHVRCCCGEEEIIIaeADiohhBBCCCGEkFNAB5UQQgghhBBC\nyCmgg0oIIYQQQggh5BTQQSWEEEIIIYQQcgrooBJCCCGEEEIIOQV0UAkhhBBCCCGEnAI6qIQQQggh\nhBBCTgEdVEIIIYQQQgghp4AOKiGEEEIIIYSQU0AHlRBCCCGEEELIKaCDSgghhBBCCCHkFNBBJYQQ\nQgghhBByCuigEkIIIYQQQgg5BXRQCSGEEEIIIYScAjqohBBCCCGEEEJOAR1UQgghhBBCCCGngA4q\nIYQQQgghhJBTQAeVEEIIIYQQQsgpoINKCCGEEEIIIeQU0EElhBBCCCGEEHIK6KASQgghhBBCCDkF\ndFAJIYQQQgghhJwCOqiEEEIIIYQQQk4BHVRCCCGEEEIIIaeADiohhBBCCCGEkFNAB5UQQgghhBBC\nyCmgg0oIIYQQQggh5BTQQSWEEEIIIYQQcgrooBJCCCGEEEIIOQV0UAkhhBBCCCGEnAI6qIQQQggh\nhBBCTgEdVEIIIYQQQgghp4AOKiGEEEIIIYSQU0AHlRBCCCGEEELIKaCDSgghhBBCCCHkFNBBJYQQ\nQgghhBByCuigEkIIIYQQQgg5BXRQCSGEEEIIIYScAjqohBBCCCGEEEJOAR1UQgghhBBCCCGn4ObZ\nTgB5+ojIBuDjnu10EEI
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08b7def0b8>"
]
},
"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": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"roi_bbox_specific shape: (1000, 4) min: -2.44748 max: 2.94838\n",
"refined_proposals shape: (1000, 4) min: -8.00000 max: 1028.00000\n"
]
},
{
"data": {
"image/png": "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\nVAAAAAAAAHgJCFABAAA
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08b76dd0f0>"
]
},
"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": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Keep 71 detections:\n",
"[ 0 2 3 4 5 6 8 9 16 17 18 19 25 30 36 37 38 40\n",
" 42 50 51 67 68 74 78 79 92 158 162 177 187 191 209 225 261 284\n",
" 292 314 328 374 402 403 409 429 473 490 499 516 545 557 572 575 607 624\n",
" 638 639 671 703 719 744 753 754 778 790 813 815 848 862 865 876 911]\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.5 confidence. Keep 67:\n",
"[ 0 2 4 5 6 8 9 16 17 18 19 25 30 36 37 38 40 42\n",
" 50 51 67 68 74 78 79 158 162 177 187 191 209 225 284 292 314 328\n",
" 374 402 403 409 429 473 490 499 516 545 557 575 607 624 638 639 671 703\n",
" 719 744 753 754 778 790 813 815 848 862 865 876 911]\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": [
"person : [ 0 2 5 6 9 67 68 74 79 158 162 187 191 225 284 374 403 409\n",
" 429 490 545 557 575 607 638 671 703 744 753 754 778 790 813 848 862 876\n",
" 911] -> [ 0 162 9 2 671]\n",
"car : [ 16 18 30 36 51 177 314 328 499 624 815] -> [30]\n",
"airplane : [ 4 8 17 19 25 37 38 40 42 50 78 209 292 402 473 516 639 719\n",
" 865] -> [78 19]\n",
"\n",
"Kept after per-class NMS: 8\n",
"[ 0 2 9 19 30 78 162 671]\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": "iVBORw0KGgoAAAANSUhEUgAAA6gAAAOoCAYAAADcQdkoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvXnM9cuW1/VdtZ9zUbC7Ebq1AaUjEoiCYCKofwhEiAMg\nqJEEQRlCAE2AoERBYjswSggJmKhEkaAMYkBAgpEEgxhRxAFFIkQIc0M3YzO3cu+7a/lHrbVq1W/v\n973n3r7m7gOfz8l7nufZ+zdUrapaQ43m7gIAAAAAAAD4YjO+2AkAAAAAAAAAkAhQAQAAAAAA4EUg\nQAUAAAAAAICXgAAVAAAAAAAAXgICVAAAAAAAAHgJCFABAAAAAADgJSBABQAA+BiY2f9lZt/zi52O\nxMy+g5n972b2F8zsx3+x0wMAAPCFgAAVAABeAjP7w2b2DRFwfb2Z/Q9m9i+YmX3M+7+XmX3NFygt\nv8TMfnr/zN2/s7v/91+I53+B+MmSfou7f5m7/3vP0vyNxcz+EzObZvbd2md/p5nN9vd/F9f8PZd7\n/8v4/HvG319mZr/YzL4uyvj/NrN/9QuZXgAA+ORDgAoAAK+CS/r+7v5lkr5K0s+R9FMk/eKPeb/F\nM/564ask/e4v1MPM7PbkY5f0ZyX9zCef999/r6Qf3p71LST9A5L+VLvuF0j6ZpK+Y5TxD5T0B77x\nKQcAgL+WIEAFAIBXwiTJ3f+Su/9Xkn6wpB9hZn+3JJnZp8zs55nZH4mRuF9oZt/EzL6ppP9a0rc2\ns79kZn/RzL7SFv+amf1+M/vTZvafm9k3r5eZ/UNm9j+a2Z+LZ/5wM/sxkv45ST85nvPr49o/ZGbf\nu6XjF5jZHzezP2ZmP9/MPorvvpeZfY2Z/SQz+5NxzY9s7/x+Zva749lfY2Y/6akgzL6dmf1mM/sz\nZvanzOyXm9mXxne/WdI/LOnfj+e8L83fysz+i7j/D5jZT2jP/7fM7Feb2S8zsz8v6Ue8p0z+U0nf\nxcy+xwfK7VdI+sFttPuHSPq1kj7drvlukv4zd/+LUca/z91/7QeeCQAAfx1CgAoAAC+Lu/+vkv6Y\npAyOfq6kby/pu8TPby3p33T3b5D0fSV9rbt/ibt/qbv/CUk/UWuk7nvEtX9O0n8gSWb2bbWC2n9X\n0pdL+nsl/U53/0VaAdfPjef8k0+S9tWS/v5Ix3eN37+6ff+Vkr4k3vmjtQLJL4vv/mNJP8bdv1TS\n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\nqAAAAAAAAPASEKACAAA
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08b3d87358>"
]
},
"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": 29,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\ntYkdgC45fA0A6k3sAHT
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08b7e4c7b8>"
]
},
"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": 30,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"detections shape: (1, 100, 6) min: 0.00000 max: 844.00000\n",
"masks shape: (1, 100, 28, 28, 81) min: 0.00000 max: 0.99984\n",
"8 detections: ['person' 'person' 'person' 'person' 'person' 'airplane' 'airplane' 'car']\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: (8, 28, 28) min: 0.00001 max: 0.99984\n",
"det_masks shape: (8, 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": 32,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nlRWOYp5j8rwez+jS2cdO6vU+tHOnnH/gfbvl/LfeuU3Otw7oCp+rjWVtDclVj9bnsR+Cf+1uXUSz\n6yvu8V09rDuvL8FundrzVFWv0+ii3kreN1OndK/p4utvyPnnZnWF7PC7d8n5b9+n18tov66HDffo\na0VsDWz9rpa107T7PTN368XdH84X9T3XaJ8+RkZ3bJDzY9dc5dLMTVHPXtPcPWMIYX72ipy/ePqk\nnL+6YaucH3zP2+T8X7/nVjnfO9wj5wNd+nrk6nwrwV9YAAAAACSLDQsAAACAZLFhAQAAAJAsNiwA\nAAAAksWGBQAAAECy1qwS5rg6hKsYnbmmKwp//PwZOf/Wd3Uxa+GsrhuFwrSeh+DLLM2qGMWKLby4\ngszirJ4X5+S4ZkpPY6d/oucv6RrYs3v36OcNIfzeR+6S8w/s1vWOjpyuhK3XxIurrLg6Ssmsl7Nm\nvfznZ3VZ5Mkn9We4NK6/P5R16ceuiWbVnJrJvVY3v3ZGjidNbezLr/5Qz02Fr3unrrj8ymN3yvnH\nH7pVzjf369JeW24l/26VxkJqWg3MPb59Xj1367FgqpWFqj4HFwqmHFkp6rldX02sgTnusWq6yBlM\n3Wj2kL7Wfn3suJw/+dSonN99v66KfeIRXec7sK1fzrvb9O1Ri63tyTEaiTwMlyNrYG7dXZjR6+ip\no5NyPn5OV2TDvJlXTN3LrQmrwb2kq8uac0RtQf9uzxX1909O6fkff+SAnPd06PXSbq4VK1kv/IUF\nAAAAQLLYsAAAAABIFhsWAAAAAMliwwIAAAAgWWxYAAAAACRr1SthS6Yg4mpg80VdPvj2CV0W+dTX\nDsv5hZde0i9oYUrP16rstZ64GsxyZFXJ1JOuHdQVshBC+G9tOTnf/XinnPe060O7I2/qYYns3V1l\nyFVQJuZ1qe5PXzon55//+ptyPnvkDf2CivN6znr5ezYZZSp8bl69JscLpp70FyffkvNvfu9uOf/k\nr7vS3kb9ekIIIz1tcm4rfImzp7DI61SlptdjqaLXxZX5kpw/PaY/20vnddEnzF3V85opVqZY4Ytd\nF2VdXKqY2tgLZ/S6+I2Xb5fzTzz+gJx/9MA2Oe/r1NeirKmHpVLUux7cOrK1PfOV2Cpm0ay7UxML\ncv7v/1ZfBw9919w3uhqYq35djzqfE3s/duGIHB+evCDnf2hqk5/+8B1ynsvoe6u2bPw9Vxp3aQAA\nAAAgsGEBAAAAkCw2LAAAAACSxYYFAAAAQLLYsAAAAABI1upXwkzVoWoqK8+f0XWUTz7xopzPvfWa\nfmJTFqFulABX0CjpokcIIVw8flbOv/jaZjnfNdQt57kVlCmup0pNH58zBV3P+8Onjsv5X331B/oJ\nJnQ9LFR1xSjJytDNxp2zFmfl+NqrL8j5Jy7oqtLXH7nTPvWnHt0n5/fv6rc/kwJ32LpqZdVU+OaL\nulx1/Kqu5/3PN/V7/M3vj8n5xEVT/bp6Rs9Zp3/PrQtzHSmdOCjnn/6CLt4Ndenbo3942xY57zZl\nyhuRq3j5H3CPo+fmtjH
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08b3df7400>"
]
},
"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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\niCAAACDK//Yx3fIh11y6AAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08b7d37cf8>"
]
},
"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, 1024, 3) min: -123.70000 max: 151.10001\n",
"res4w_out shape: (1, 64, 64, 1024) min: 0.00000 max: 54.64681\n",
"rpn_bbox shape: (1, 65472, 4) min: -12.26412 max: 18.18265\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",
" (\"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": 35,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nQDgkBEYcSuZ870w10rR
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08ba48a4a8>"
]
},
"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": 36,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\neht5PsvbjwLy3BRwdXr
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08ba466e80>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Backbone feature map\n",
"display_images(np.transpose(activations[\"res4w_out\"][0,:,:,:4], [2, 0, 1]))"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n4Xsz8KOy3ouZ9ZoX8Qh
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08b7ff2898>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Histograms of RPN bounding box deltas\n",
"plt.figure(figsize=(12, 3))\n",
"plt.subplot(1, 4, 1)\n",
"plt.title(\"dy\")\n",
"_ = plt.hist(activations[\"rpn_bbox\"][0,:,0], 50)\n",
"plt.subplot(1, 4, 2)\n",
"plt.title(\"dx\")\n",
"_ = plt.hist(activations[\"rpn_bbox\"][0,:,1], 50)\n",
"plt.subplot(1, 4, 3)\n",
"plt.title(\"dw\")\n",
"_ = plt.hist(activations[\"rpn_bbox\"][0,:,2], 50)\n",
"plt.subplot(1, 4, 4)\n",
"plt.title(\"dh\")\n",
"_ = plt.hist(activations[\"rpn_bbox\"][0,:,3], 50)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAmAAAAFCCAYAAABW52FwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvXt0ZeV93/3dOtq3c9ORbBnDAKMZaQYGZsSIvLi2kyaD\nAzb269hJHDIvBBs6AnOJOjgmK8iTYnBUJYEpbqwmjNBk3spJGKSVZtEs6qSHOtakVVtXvA42WTl2\nbDcRNnXio6SJY9zBXPJ7/3ie5+zbs891n5v0+6ylpds+e28d2N/5Pr/ndzGICAzDMAzDMEznGOj2\nDTAMwzAMw+w02IAxDMMwDMN0GDZgDMMwDMMwHYYNGMMwDMMwTIdhA8YwDMMwDNNh2IAxDMMwDMN0\nGDZgDMMwDMMwHYYNGNNWDMO40TCM/2oYxvcMw/hcgud9s2EYv28Yxv8yDOMfDcO4NKlzMwzDAIBh\nGCcNw/iqYRjfMQyjZBjGBxM673sMw/gvhmH8nWEY3zIM43HDMLJJnJvpH9iAMe3mbwH8awC/kvB5\n/xHAHwL4SQDcTZhhmHbwEoD/m4iGANwG4FOGYbw1gfPmAcwBuBDAAQCXAHgkgfMyfQQbMKYlDMP4\necMw/l3oZ//GMIxPAgARfY6I/h2Av2ri3J8xDONf+b5fNQzjN+V5y0S0COD/A2C09EcwDLMjqUO/\nPkFEX5NfbwD4LwDeVue5q+nXChE9Q0QvE9F3AJwG8IPJ/FVMvzDY7Rtg+p7fAfCgYRh5IvoHwzBS\nAH4awLsSOPcxAF8yDOM/ANgF4AcATCZwXoZhGKAB/TIMwwVwDYDfqPPcjejXjwD4s0Zvnulv2IAx\nLUFEf20Yxn8GcCOAMwDeDWCLiL6YwLm/bRjGXQB+C4AD4P1E9H9aPS/DMAzQsH4tAniOiJ6p89x1\n6ZdhGNcD+CCAtzT5ZzB9Cm9BMknwWwBukV//DIDfTvDcnwGQAvDnRPTfEzwvwzAMUId+GYZxEsAV\nAI42eO6q+iXzyZ4A8AEi+p8Nnpvpc9iAMUnw7wFMGoZxJYD3QghKUvwygBKACw3D+H8SPC/DMAxQ\nQ78Mw/gExJbk9UT0UoPnjtUvwzCm5LVvI6JzTd4708ewAWNahoi+D+D3AJwF8D+I6EX1O8MwBgzD\nsAGYAFKGYdiGYQz6fv+XhmF8SHdewzB+GMCtEOH5WwH8G8MwLvT93oYI7QOAI79nGIapmxr69TEA\nN0GYr78Pv7ZZ/TIM4yBEFfc/J6I/SPhPYvoENmBMUnwawCGIcL6fDwI4D5G4+kMA/g+AJQAwDMMC\nMALg8+GTGYaRk+f8WSL6ayL6rwB+E8C/9R12HsA/QLSh+Io8N8MwTKPE6dc8RIuIrxmG8V3DMP7B\nMIxZADAMw0Tz+vVRAG8EcEae97uGYfxpO/4wpncxiFpvoWQYxhmI0O23iShS5WEYxs0A7of4h/Il\nAHcTEf/Pto0wDOMSAF8G8OZ6w/SGYfwggHuI6GfaenMMUwXWL4b1i+kGSRmwH4IQpt+KEbC3Avgy\nEX3HMIwbADxEREk0s2N6AMMwBgB8EkCWiG7v9v0wTCOwfu1sWL+YbpFIGwoiWjcMY3eV3/tDtJ+H\n6InCbAMMw0gD+DaAv4Qo4WaYvoL1a+fC+sV0k270AbsdIvmQ2QbIvja5bt8Hw3QI1q9tBOsX0006\nasAMw7gWwD+DSMZmGIbpG1i/GIZJko4ZMMMwJiGq324gor+LOYaHKjPMDoSIenqeZz36JY9jDWOY\nHUaz+pVkGwoDMUORDcO4FKLPygdrdfsloq59PPjgg3z9HXjtnX79bv/tPUIi+gV0V8P65b/5drvP\nfrpXvs9kP1ohkQiYYRhnARwB8AbDML4B4EEAFgAioiUAD0D0S3nMMAwDwKtExHOvGIbpOqxfDMN0\ng6SqIG+u8fs7ANyRxLUYhmGShPWLYZhuwJ3wfRw5coSvvwOvvdOv3+2/nek8/fLfvF/uE+ife+X7\n7B0SacSaFIZhUC/dD8Mw7ccwDFCPJ+HXC2sYw+wsWtEvjoAxDMMwDMN0GDZgDMMwDMMwHYYNGMMw\nDMMwTIdhA8YwDMMwDNNh2IAxDMMwDMN0GDZgDMMwDMMwHYYNGMMwDMMwTIdhA8YwDMMwDNNh2IAx\nDMMwDMN0GDZgDMMwDMMwHYYNGMMwDMMwTIdhA8YwDMMwDNNh2IAxDMMwDMN0GDZgDMMwDMMwHYYN\nGMMwDMMwTIdhA8YwDMMwDNNh2IAxDMMwDMN0GDZgDMMwDMMwHYYNGMMwDMMwTIdhA8YwDMMwDNNh\n2IAxDMMwDMN0GDZgDMMwDMMwHYYNGMMwDMMwTIdhA8YwDMMwDNNh2IAxDMMwDMN0GDZgDMMwDMMw\nHYYNGMMwDMMwTIdhA8YwDMMwDNNh2IAxDMMwDMN0mEQMmGEYZwzD+LZhGM9XOWbBMIyvGYbxRcMw\nDidxXYZhmFZh/WIYphskFQH7twDeFfdLwzDeDWCciPYBuBPAYkLXZRiGaRXWL4ZhOs5gEichonXD\nMHZXOeT9AH5LHvs/DMMYMgzjAiL6dhLXZxiGaRbWr+3B1tYWNjc3MTY2htHR0cr32WwW3/zmNwEA\nmUwGX//61zExMYHvfe97+MY3voHz58/juuuuw4EDB7C1tYXnnnsOf//3f48XX3wR3/rWtzA1NYXX\nXnsNExMTsCwL2WwWL730UuU6umuH7+u5554DAExNTUV+X+/fUe/1knjvmA5BRIl8ANgN4PmY3z0N\n4O2+7z8L4GrNccQwzM5CPveJaVEzH0noF7GGdY2zZ1fIdUdoaOhqct0Rmpm5l1x3hFz3EAEuAW8m\nwJZf75OfC/LzOAEuvfOd7ybTzPmOG5efLQImCHBpYGCUAJdc9xC57gidPbsSufbZsyuB+7KsIfn6\nNJlmNvD7ev8O/7mrXS+J967V8+00WtGvTgnYf9AI2JTmuPa8Q8y2o1wu08bGBpXL5W7fCtMifWDA\n6tIvYg3rCuVymVx3hIAvEUAErEnjpL7/kjRbhdDPXHms//uc5rhhAsra8zpOIXTtL5HrjlC5XNbc\nlziX4xS0ulXP3+G6I+Q4Be31knnvWjvfTqQV/UpkC7IOXgRwie/7iwF8S3fgQw89VPn6yJEjOHLk\nSDvvi+lDnnxyFdPT98CyxvDKK5s4ceI+3HnnHbHheqa3OHfuHM6dO9ft22iEuvULYA3rNJubm7Cs\nMZw/Pyl/koH4z6W+nwTwJgBu6GcXy2PV97sAvAJgOHTcGIBN7XlTqeh5TXM3Njc3AQADA+H7GEMq\n9T1sbm5G9Kmev2Ng4GIA39derxm9i16ztfPtBBLVr2adW/gD4v/SP4353XsAfEZ+/VYAn485rj0W\nldk26FeVabKsLN100wfJtguUy01xKL2PQG9EwFrWL2IN6wocAeMIWDdpRb+SEq+zECvC7wP4BoB/\nBlEt9GHfMb8O4OsAvgTOn2CaZGNjg4aGrpZioT7GSeRYOATMSLFkIekXum3AktIvYg3rGiqPKZ+f\nkrlTx2UO2EFpYi4gL7drQn4eIi/XK03AcQKyVC0HzDDeQCIH7GAkJ0tdW58DJq5Rbw5Y+O/wn7va\n9ZJ473jh2hit6JchXt8bGIZBvXQ/TO+xtbWF3bsvx/nzaxBh+OcBHAHwMID7AbwBwP8G8BhyuV/F\nH/3REq655pqu3S9TG8MwQERGt+8jCVjDukezVZDlchlzcyfx8st/DMAE8GmkUgsACK+//tMA3gng\nL2BZj+Dpp38Pl1xySSJVkHGv4SrI/qIV/WIDxvQdKgfs/PlhAH8F4NcAzAIImjLLeh0vvvh1FpQe\nhw0Y020ef/w0fvZnP4LXXycAu2BZW/jwh2/FmTO/A9PcjVdffQFnzjyGm246msj1wnmsSZ6b6Sxs\nwJgdx9bWFj75yV/Dr/7qJwGcAfAogC/4jpjA7OxR/MqvzHfnBpm6YQPGdBNvQTcC4G8BnAJwAK57\nLb7whfVItKtVdFF8170
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08b7fe76d8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Distribution of y, x coordinates of generated proposals\n",
"plt.figure(figsize=(10, 5))\n",
"plt.subplot(1, 2, 1)\n",
"plt.title(\"y1, x1\")\n",
"plt.scatter(activations[\"roi\"][0,:,0], activations[\"roi\"][0,:,1])\n",
"plt.subplot(1, 2, 2)\n",
"plt.title(\"y2, x2\")\n",
"plt.scatter(activations[\"roi\"][0,:,2], activations[\"roi\"][0,:,3])\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"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.6.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}