[974c13]: / AnalysisCodes / FasterRCNN / IoU.ipynb

Download this file

537 lines (536 with data), 23.0 kB

{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Calculate performance of the Faster R-CNN model based on IoU"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Set Working Directory"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'/Users/mingrenshen/PycharmProjects/MedImgAnalysis/stage2/FasterRCNN'"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# if get error \"ImportError: No module named utils\"\n",
    "# change working directory\n",
    "\n",
    "# ONLY NEED TO RUN THIS CELL ONCE\n",
    "\n",
    "import os\n",
    "os.chdir('./stage2/FasterRCNN')\n",
    "os.getcwd()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load Library"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/mingrenshen/anaconda3/envs/chainercv/lib/python2.7/site-packages/chainer/_environment_check.py:37: UserWarning: Accelerate has been detected as a NumPy backend library.\n",
      "vecLib, which is a part of Accelerate, is known not to work correctly with Chainer.\n",
      "We recommend using other BLAS libraries such as OpenBLAS.\n",
      "For details of the issue, please see\n",
      "https://docs.chainer.org/en/stable/tips.html#mnist-example-does-not-converge-in-cpu-mode-on-mac-os-x.\n",
      "\n",
      "Please be aware that Mac OS X is not an officially supported OS.\n",
      "\n",
      "  ''')  # NOQA\n"
     ]
    }
   ],
   "source": [
    "from utils import imageUtils\n",
    "from utils import postProcessing\n",
    "from utils import DetectionDataset\n",
    "from utils import evaluation\n",
    "from utils import visualization\n",
    "import numpy as np\n",
    "import os\n",
    "from chainercv.links import FasterRCNNVGG16\n",
    "from chainercv.visualizations import vis_bbox\n",
    "from chainercv.utils import write_image\n",
    "import chainer\n",
    "import math\n",
    "from chainercv import utils\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('total number of test images: ', 33)\n",
      "('type of defects: ', 'Bleeding')\n"
     ]
    }
   ],
   "source": [
    "#load Data\n",
    "root = './DataSetPostiveAug'\n",
    "#dataset = MultiDetectionDataset(data_dir=root, split='train')\n",
    "dataset_test = DetectionDataset(data_dir=root, split='test')\n",
    "bbox_label_names = ('Bleeding')\n",
    "\n",
    "# DataSet Statistics\n",
    "#print('total number of training images: ', len(dataset))\n",
    "print('total number of test images: ', len(dataset_test))\n",
    "print('type of defects: ', bbox_label_names)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "18_13.jpg\n"
     ]
    }
   ],
   "source": [
    "print(dataset_test.obtain_image_name(2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load Tranied Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "use_gpu = False\n",
    "proposal_params = {'min_size': 8}\n",
    "# old weights 'snapshot_model_100000_20181202.npz', \n",
    "\n",
    "model = FasterRCNNVGG16(n_fg_class=1, \n",
    "                        pretrained_model= 'snapshot_model_200000.npz', \n",
    "                        ratios=[ 0.5 , 0.57 , 0.67 , 0.8 , 1 , 1.5 , 2 , 2.5],anchor_scales=[8 , 16, 32, 64], min_size=1000, \n",
    "                        max_size=1000,proposal_creator_params=proposal_params)\n",
    "\n",
    "if use_gpu:\n",
    "    chainer.cuda.get_device_from_id(0).use()\n",
    "    model.to_gpu()\n",
    "    \n",
    "bbox_label_names = ('Bleeding')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### IoU Caculation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test image 0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/mingrenshen/anaconda3/envs/chainercv/lib/python2.7/site-packages/chainercv/utils/image/read_image.py:123: UserWarning: Although `chainer.config.cv_read_image_backend == \"cv2\"`, cv2 is not found. As a fallback option, read_image uses PIL. Either install cv2 or set `chainer.global_config.cv_read_image_backend = \"PIL\"` to suppress this warning.\n",
      "  'Although `chainer.config.cv_read_image_backend == \"cv2\"`, '\n",
      "/Users/mingrenshen/anaconda3/envs/chainercv/lib/python2.7/site-packages/chainercv/transforms/image/resize.py:69: UserWarning: Although `chainer.config.cv_resize_backend == \"cv2\"`, cv2 is not found. As a fallback option, resize uses PIL. Either install cv2 or set `chainer.global_config.cv_resize_backend = \"PIL\"` to suppress this warning.\n",
      "  'Although `chainer.config.cv_resize_backend == \"cv2\"`, '\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[492.0, 114.0, 536.0, 160.0]]\n",
      "[495.64935302734375, 113.03917694091797, 530.5108032226562, 156.4954376220703]\n",
      "Test image 1\n",
      "[[497.0, 96.0, 552.0, 158.0]]\n",
      "[500.12933349609375, 116.84669494628906, 547.4039916992188, 160.2185821533203]\n",
      "Test image 2\n",
      "[[493.0, 64.0, 558.0, 162.0]]\n",
      "[499.0670471191406, 102.83435821533203, 534.5481567382812, 155.79942321777344]\n",
      "Test image 3\n",
      "[[497.0, 56.0, 554.0, 162.0]]\n",
      "[422.86688232421875, 514.7471923828125, 483.9058837890625, 606.9178466796875]\n",
      "Test image 4\n",
      "[[492.0, 57.0, 553.0, 157.0]]\n",
      "[199.1635284423828, 290.2164001464844, 229.26795959472656, 311.7389221191406]\n",
      "Test image 5\n",
      "[[500.0, 56.0, 554.0, 153.0]]\n",
      "[273.998291015625, 222.94361877441406, 313.0167236328125, 250.48780822753906]\n",
      "Test image 6\n",
      "[[494.0, 114.0, 532.0, 160.0]]\n",
      "[490.039306640625, 119.68174743652344, 528.5392456054688, 153.6099090576172]\n",
      "Test image 7\n",
      "[[489.0, 118.0, 529.0, 157.0]]\n",
      "[490.8721923828125, 115.87886810302734, 529.3150634765625, 160.35337829589844]\n",
      "Test image 8\n",
      "[[365.0, 302.0, 392.0, 324.0], [365.0, 336.0, 388.0, 358.0]]\n",
      "[365.59466552734375, 304.7794189453125, 390.251220703125, 329.31744384765625]\n",
      "Test image 9\n",
      "[[369.0, 305.0, 390.0, 326.0], [368.0, 340.0, 385.0, 357.0]]\n",
      "[296.5013732910156, 443.277587890625, 340.2290954589844, 479.644287109375]\n",
      "Test image 10\n",
      "[[365.0, 305.0, 393.0, 325.0], [365.0, 336.0, 386.0, 360.0]]\n",
      "[367.260498046875, 299.6678466796875, 394.672119140625, 338.4056396484375]\n",
      "Test image 11\n",
      "[[368.0, 302.0, 389.0, 328.0], [366.0, 338.0, 384.0, 358.0]]\n",
      "[366.9193420410156, 298.6146545410156, 400.4737854003906, 333.3150329589844]\n",
      "Test image 12\n",
      "[[364.0, 294.0, 400.0, 326.0], [364.0, 337.0, 386.0, 360.0]]\n",
      "[365.6755065917969, 298.7417907714844, 399.2345275878906, 332.9513854980469]\n",
      "Test image 13\n",
      "[[364.0, 296.0, 396.0, 328.0], [362.0, 337.0, 388.0, 357.0]]\n",
      "[361.32196044921875, 294.624267578125, 396.4757080078125, 330.46368408203125]\n",
      "Test image 14\n",
      "[[364.0, 297.0, 394.0, 328.0], [364.0, 337.0, 384.0, 357.0]]\n",
      "[366.7547912597656, 300.3017883300781, 398.4836120605469, 330.0342712402344]\n",
      "Test image 15\n",
      "[[358.0, 294.0, 396.0, 328.0], [365.0, 337.0, 388.0, 361.0]]\n",
      "[367.19744873046875, 299.2885437011719, 398.90155029296875, 331.2810974121094]\n",
      "Test image 16\n",
      "[[361.0, 293.0, 397.0, 325.0], [364.0, 341.0, 388.0, 361.0]]\n",
      "[366.7566833496094, 298.02972412109375, 400.4236145019531, 332.8721923828125]\n",
      "Test image 17\n",
      "[[364.0, 337.0, 389.0, 360.0], [360.0, 294.0, 396.0, 329.0]]\n",
      "[532.9326171875, 388.3398742675781, 576.0950927734375, 432.8794860839844]\n",
      "Test image 18\n",
      "[[361.0, 297.0, 398.0, 329.0], [362.0, 336.0, 389.0, 361.0]]\n",
      "[365.9866638183594, 292.89947509765625, 402.0647888183594, 329.36871337890625]\n",
      "Test image 19\n",
      "[[366.0, 293.0, 397.0, 333.0], [362.0, 340.0, 389.0, 360.0]]\n",
      "[363.2719421386719, 294.81732177734375, 399.3097229003906, 329.45977783203125]\n",
      "Test image 20\n",
      "[[360.0, 294.0, 400.0, 329.0], [361.0, 341.0, 390.0, 362.0]]\n",
      "[362.51690673828125, 296.7083435058594, 397.5196533203125, 336.7876892089844]\n",
      "Test image 21\n",
      "[[360.0, 290.0, 400.0, 329.0], [357.0, 338.0, 388.0, 357.0]]\n",
      "[362.5546875, 294.5987243652344, 403.5543212890625, 333.7799987792969]\n",
      "Test image 22\n",
      "[[350.0, 293.0, 397.0, 329.0], [350.0, 338.0, 388.0, 362.0]]\n",
      "[362.78350830078125, 289.3074645996094, 406.210205078125, 334.1214904785156]\n",
      "Test image 23\n",
      "[[368.0, 305.0, 385.0, 328.0]]\n",
      "[370.2763977050781, 312.51171875, 389.7111511230469, 332.82000732421875]\n",
      "Test image 24\n",
      "[[368.0, 305.0, 388.0, 326.0]]\n",
      "[368.32342529296875, 305.36639404296875, 387.82861328125, 324.11053466796875]\n",
      "Test image 25\n",
      "[[369.0, 302.0, 386.0, 326.0], [366.0, 341.0, 390.0, 361.0]]\n",
      "[299.90643310546875, 445.7901306152344, 342.37451171875, 477.3412780761719]\n",
      "Test image 26\n",
      "[[698.0, 344.0, 730.0, 368.0]]\n",
      "[504.272705078125, 658.7452392578125, 540.181884765625, 698.17333984375]\n",
      "Test image 27\n",
      "[[696.0, 340.0, 730.0, 372.0]]\n",
      "[696.69140625, 347.398681640625, 730.7735595703125, 374.4244384765625]\n",
      "Test image 28\n",
      "[[692.0, 338.0, 726.0, 370.0]]\n",
      "[698.0301513671875, 347.8710632324219, 732.94384765625, 377.2978210449219]\n",
      "Test image 29\n",
      "[[692.0, 340.0, 738.0, 384.0]]\n",
      "[694.415771484375, 341.35894775390625, 741.1317138671875, 378.94091796875]\n",
      "Test image 30\n",
      "[[694.0, 340.0, 740.0, 380.0]]\n",
      "[702.3193359375, 344.4384765625, 744.983642578125, 381.5704345703125]\n",
      "Test image 31\n",
      "[[696.0, 340.0, 738.0, 382.0]]\n",
      "[695.2821655273438, 344.5749816894531, 745.2443237304688, 384.3777160644531]\n",
      "Test image 32\n",
      "[[692.0, 340.0, 738.0, 380.0]]\n",
      "[694.1968383789062, 342.7798767089844, 745.6187133789062, 383.6237487792969]\n",
      "Done\n"
     ]
    }
   ],
   "source": [
    "# import the iou function from  utils.evaluation\n",
    "\n",
    "from utils.evaluation import bbox_iou\n",
    "testIoUList = list()\n",
    "resultTxt = open(\"faster.txt\",\"w\")\n",
    "\n",
    "for i in range(0,len(dataset_test)):\n",
    "    print(\"Test image %d\"%i)\n",
    "\t# Prediction of second image\n",
    "    img, gt_bboxes, gt_labels = dataset_test[i]\n",
    "    model.score_thresh = 0.00001\n",
    "    pred_bboxes, pred_labels, pred_scores = model.predict([img])\n",
    "    predbboxes = pred_bboxes[0].tolist()\n",
    "    gtbboxes = gt_bboxes.tolist()\n",
    "    print(gtbboxes)\n",
    "    if len(predbboxes)==0 or len(predbboxes[0]) != 4:\n",
    "        print(\"#\"*10 + \"No Predictions\" + \"#\"*10)\n",
    "        resultTxt.write(\"\\n\")\n",
    "    else:\n",
    "        print(predbboxes[0])\n",
    "        tmp = bbox_iou(predbboxes[0],gtbboxes[0])\n",
    "        testIoUList.append(tmp)\n",
    "        fig = plt.figure(figsize=(15,6))\n",
    "        ax1 = fig.add_subplot(1, 2, 2)\n",
    "        ax2 = fig.add_subplot(1, 2, 1)\n",
    "        # plot prediction\n",
    "        bb = pred_bboxes[0][0]\n",
    "        resultTxt.write(dataset_test.obtain_image_name(i) + \",\")\n",
    "        resultTxt.write(str(bb[0]) + \",\" + str(bb[1]) + \",\" + str(bb[2]) + \",\" + str(bb[3]) + \",\" + str(pred_scores[0][0]) + \",\"+str(tmp)+\"\\n\")\n",
    "        visualization.vis_bbox(img, pred_bboxes[0], pred_labels[0], pred_scores[0], label_names=bbox_label_names, ax=ax1)\n",
    "        # plot ground truth\n",
    "        visualization.vis_bbox(img, gt_bboxes, gt_labels, label_names=bbox_label_names,ax=ax2)\n",
    "        fig.savefig(\"IoUtest\"+str(i)+\".png\")\n",
    "        #plt.cla()\n",
    "        plt.close('all')\n",
    "print(\"Done\")\n",
    "resultTxt.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.720027062818\n",
      "0.553505929975\n",
      "0.295017154535\n",
      "0.0\n",
      "0.0\n",
      "0.0\n",
      "0.62253832692\n",
      "0.834099017127\n",
      "0.653574506404\n",
      "0.0\n",
      "0.464999865179\n",
      "0.468930401255\n",
      "0.660341369249\n",
      "0.812769491051\n",
      "0.674551934261\n",
      "0.559011227801\n",
      "0.540405241952\n",
      "0.0\n",
      "0.694378329419\n",
      "0.759208279839\n",
      "0.675776081604\n",
      "0.685832854647\n",
      "0.51189694399\n",
      "0.40894115362\n",
      "0.870495185392\n",
      "0.0\n",
      "0.0\n",
      "0.688797514552\n",
      "0.413606472425\n",
      "0.764805643584\n",
      "0.642915353706\n",
      "0.720774652775\n",
      "0.705810826753\n"
     ]
    }
   ],
   "source": [
    "#print(testIoUList)\n",
    "for item in testIoUList:\n",
    "\tprint(item)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "Tlist = [x for x in testIoUList if x > 0.0 ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.7200270628176969, 0.5535059299748275, 0.2950171545347505, 0.6225383269199182, 0.834099017126839, 0.6535745064044033, 0.4649998651791994, 0.46893040125546476, 0.6603413692490404, 0.8127694910510229, 0.6745519342607965, 0.5590112278013447, 0.5404052419518487, 0.6943783294188128, 0.7592082798393095, 0.6757760816041404, 0.6858328546472706, 0.5118969439903058, 0.4089411536197577, 0.8704951853915542, 0.6887975145517793, 0.41360647242455467, 0.7648056435838599, 0.6429153537059025, 0.7207746527745814, 0.7058108267532085]\n"
     ]
    }
   ],
   "source": [
    "print(Tlist)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "p = 1.0 * len(Tlist) / len(testIoUList)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.787878787879\n"
     ]
    }
   ],
   "source": [
    "print(p)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# plot historygrarme \n",
    "import pandas as pd\n",
    "df = pd.DataFrame({'IoU' : testIoUList})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1080x432 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import time\n",
    "\n",
    "histgramFileName = \"Hist_\" + time.strftime(\"%Y%m%d_%H%M%S\")\n",
    "fig = plt.figure(figsize=(15,6))\n",
    "fig, ax = plt.subplots(1,1)\n",
    "df.hist(bins=50, ax=ax)\n",
    "fig.savefig(histgramFileName)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}