Annolid on Detectron2 Tutorial 3 : Evaluating the model#
This is modified from the official colab tutorial of detectron2. Here, we will
Evaluate our previously trained model.
You can make a copy of this tutorial by “File -> Open in playground mode” and play with it yourself. DO NOT request access to this tutorial.
# Is running in colab or in jupyter-notebook
try:
import google.colab
IN_COLAB = True
except:
IN_COLAB = False
# install dependencies:
!pip install pyyaml==5.3
import torch, torchvision
TORCH_VERSION = ".".join(torch.__version__.split(".")[:2])
CUDA_VERSION = torch.__version__.split("+")[-1]
print("torch: ", TORCH_VERSION, "; cuda: ", CUDA_VERSION)
# Install detectron2 that matches the above pytorch version
# See https://detectron2.readthedocs.io/tutorials/install.html for instructions
!pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/$CUDA_VERSION/torch$TORCH_VERSION/index.html
# If there is not yet a detectron2 release that matches the given torch + CUDA version, you need to install a different pytorch.
# exit(0) # After installation, you may need to "restart runtime" in Colab. This line can also restart runtime
Requirement already satisfied: pyyaml==5.3 in /home/jeremy/anaconda3/lib/python3.9/site-packages (5.3)
torch: 1.10 ; cuda: cu102
Looking in links: https://dl.fbaipublicfiles.com/detectron2/wheels/cu102/torch1.10/index.html
Requirement already satisfied: detectron2 in /home/jeremy/anaconda3/lib/python3.9/site-packages (0.6+cu102)
Requirement already satisfied: fvcore<0.1.6,>=0.1.5 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (0.1.5.post20211023)
Requirement already satisfied: tqdm>4.29.0 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (4.62.3)
Requirement already satisfied: Pillow>=7.1 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (8.4.0)
Requirement already satisfied: iopath<0.1.10,>=0.1.7 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (0.1.9)
Requirement already satisfied: cloudpickle in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (2.0.0)
Requirement already satisfied: pydot in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (1.4.2)
Requirement already satisfied: yacs>=0.1.8 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (0.1.8)
Requirement already satisfied: future in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (0.18.2)
Requirement already satisfied: omegaconf>=2.1 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (2.1.1)
Requirement already satisfied: tensorboard in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (2.7.0)
Requirement already satisfied: hydra-core>=1.1 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (1.1.1)
Requirement already satisfied: tabulate in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (0.8.9)
Requirement already satisfied: termcolor>=1.1 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (1.1.0)
Requirement already satisfied: pycocotools>=2.0.2 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (2.0.3)
Requirement already satisfied: matplotlib in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (3.4.3)
Requirement already satisfied: black==21.4b2 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from detectron2) (21.4b2)
Requirement already satisfied: toml>=0.10.1 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from black==21.4b2->detectron2) (0.10.2)
Requirement already satisfied: click>=7.1.2 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from black==21.4b2->detectron2) (8.0.3)
Requirement already satisfied: pathspec<1,>=0.8.1 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from black==21.4b2->detectron2) (0.9.0)
Requirement already satisfied: regex>=2020.1.8 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from black==21.4b2->detectron2) (2021.8.3)
Requirement already satisfied: mypy-extensions>=0.4.3 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from black==21.4b2->detectron2) (0.4.3)
Requirement already satisfied: appdirs in /home/jeremy/anaconda3/lib/python3.9/site-packages (from black==21.4b2->detectron2) (1.4.4)
Requirement already satisfied: pyyaml>=5.1 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from fvcore<0.1.6,>=0.1.5->detectron2) (5.3)
Requirement already satisfied: numpy in /home/jeremy/anaconda3/lib/python3.9/site-packages (from fvcore<0.1.6,>=0.1.5->detectron2) (1.20.3)
Requirement already satisfied: antlr4-python3-runtime==4.8 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from hydra-core>=1.1->detectron2) (4.8)
Requirement already satisfied: portalocker in /home/jeremy/anaconda3/lib/python3.9/site-packages (from iopath<0.1.10,>=0.1.7->detectron2) (2.3.2)
Requirement already satisfied: setuptools>=18.0 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from pycocotools>=2.0.2->detectron2) (58.0.4)
Requirement already satisfied: cython>=0.27.3 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from pycocotools>=2.0.2->detectron2) (0.29.24)
Requirement already satisfied: kiwisolver>=1.0.1 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from matplotlib->detectron2) (1.3.1)
Requirement already satisfied: pyparsing>=2.2.1 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from matplotlib->detectron2) (3.0.4)
Requirement already satisfied: python-dateutil>=2.7 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from matplotlib->detectron2) (2.8.2)
Requirement already satisfied: cycler>=0.10 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from matplotlib->detectron2) (0.10.0)
Requirement already satisfied: six in /home/jeremy/anaconda3/lib/python3.9/site-packages (from cycler>=0.10->matplotlib->detectron2) (1.16.0)
Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from tensorboard->detectron2) (1.8.1)
Requirement already satisfied: werkzeug>=0.11.15 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from tensorboard->detectron2) (2.0.2)
Requirement already satisfied: google-auth<3,>=1.6.3 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from tensorboard->detectron2) (2.3.3)
Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from tensorboard->detectron2) (0.6.1)
Requirement already satisfied: protobuf>=3.6.0 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from tensorboard->detectron2) (3.19.1)
Requirement already satisfied: grpcio>=1.24.3 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from tensorboard->detectron2) (1.43.0)
Requirement already satisfied: requests<3,>=2.21.0 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from tensorboard->detectron2) (2.26.0)
Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from tensorboard->detectron2) (0.4.6)
Requirement already satisfied: wheel>=0.26 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from tensorboard->detectron2) (0.37.0)
Requirement already satisfied: markdown>=2.6.8 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from tensorboard->detectron2) (3.3.6)
Requirement already satisfied: absl-py>=0.4 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from tensorboard->detectron2) (1.0.0)
Requirement already satisfied: rsa<5,>=3.1.4 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from google-auth<3,>=1.6.3->tensorboard->detectron2) (4.8)
Requirement already satisfied: pyasn1-modules>=0.2.1 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from google-auth<3,>=1.6.3->tensorboard->detectron2) (0.2.8)
Requirement already satisfied: cachetools<5.0,>=2.0.0 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from google-auth<3,>=1.6.3->tensorboard->detectron2) (4.2.4)
Requirement already satisfied: requests-oauthlib>=0.7.0 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->detectron2) (1.3.0)
Requirement already satisfied: importlib-metadata>=4.4 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from markdown>=2.6.8->tensorboard->detectron2) (4.8.1)
Requirement already satisfied: zipp>=0.5 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from importlib-metadata>=4.4->markdown>=2.6.8->tensorboard->detectron2) (3.6.0)
Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard->detectron2) (0.4.8)
Requirement already satisfied: charset-normalizer~=2.0.0 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2) (2.0.4)
Requirement already satisfied: certifi>=2017.4.17 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2) (2021.10.8)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2) (1.26.7)
Requirement already satisfied: idna<4,>=2.5 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2) (3.2)
Requirement already satisfied: oauthlib>=3.0.0 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->detectron2) (3.1.1)
# import some common libraries
import json
import os
import cv2
import random
import glob
import numpy as np
if IN_COLAB:
from google.colab.patches import cv2_imshow
import matplotlib.pyplot as plt
%matplotlib inline
# Setup detectron2 logger
import detectron2
from detectron2.utils.logger import setup_logger
setup_logger()
# import some common detectron2 utilities
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog, DatasetCatalog
# is there a gpu
if torch.cuda.is_available():
GPU = True
print('gpu available')
else:
GPU = False
print('no gpu')
gpu available
Upload a labeled dataset.#
The following code is expecting the dataset in the COCO format to be in a .zip file. For example: sample_dataset.zip
Note: please make sure there is no white space in your file path if you encounter file not found issues.
!pip install gdown
!gdown --id 1fUXCLnoJ5SwXg54mj0NBKGzidsV8ALVR
Requirement already satisfied: gdown in /home/jeremy/anaconda3/lib/python3.9/site-packages (4.2.0)
Requirement already satisfied: six in /home/jeremy/anaconda3/lib/python3.9/site-packages (from gdown) (1.16.0)
Requirement already satisfied: beautifulsoup4 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from gdown) (4.10.0)
Requirement already satisfied: filelock in /home/jeremy/anaconda3/lib/python3.9/site-packages (from gdown) (3.3.1)
Requirement already satisfied: requests[socks] in /home/jeremy/anaconda3/lib/python3.9/site-packages (from gdown) (2.26.0)
Requirement already satisfied: tqdm in /home/jeremy/anaconda3/lib/python3.9/site-packages (from gdown) (4.62.3)
Requirement already satisfied: soupsieve>1.2 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from beautifulsoup4->gdown) (2.2.1)
Requirement already satisfied: certifi>=2017.4.17 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from requests[socks]->gdown) (2021.10.8)
Requirement already satisfied: charset-normalizer~=2.0.0 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from requests[socks]->gdown) (2.0.4)
Requirement already satisfied: idna<4,>=2.5 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from requests[socks]->gdown) (3.2)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from requests[socks]->gdown) (1.26.7)
Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /home/jeremy/anaconda3/lib/python3.9/site-packages (from requests[socks]->gdown) (1.7.1)
Downloading...
From: https://drive.google.com/uc?id=1fUXCLnoJ5SwXg54mj0NBKGzidsV8ALVR
To: /home/jeremy/Documents/annolid/book/tutorials/novelctrlk6_8_coco_dataset.zip
100%|██████████████████████████████████████| 10.3M/10.3M [00:00<00:00, 97.5MB/s]
if IN_COLAB:
dataset = '/content/novelctrlk6_8_coco_dataset.zip'
else:
dataset = 'novelctrlk6_8_coco_dataset.zip'
if IN_COLAB:
!unzip $dataset -d /content/
else:
#TODO generalize this
!unzip -o $dataset -d .
Archive: novelctrlk6_8_coco_dataset.zip
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00001416_41.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004233_81.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004515_22.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00000636_6.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00006297_11.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00006818_79.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00006056_25.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00006094_12.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004340_96.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00000557_50.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00000979_94.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00005018_19.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00001257_80.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004335_26.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004804_39.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00006396_43.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00006993_65.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00000865_92.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00003114_35.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00001918_2.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004935_56.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00006959_78.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00005216_14.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00003092_22.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00001528_44.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00003208_12.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004966_35.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004517_47.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004769_82.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004767_87.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00000378_62.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00006563_31.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00001476_48.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004555_67.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00003070_62.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00005007_38.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00003342_41.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00002267_91.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00002248_99.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00000702_46.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00003237_15.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00002412_96.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00001322_73.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00002328_97.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004312_85.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004443_46.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00003783_81.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00000779_3.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00002654_1.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004685_90.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004098_59.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00006538_99.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00006832_71.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00007024_26.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00005772_51.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00006330_76.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00000871_10.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00003034_64.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00004539_89.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/JPEGImages/00005788_49.jpg
inflating: ./novelctrlk6_8_coco_dataset/valid/annotations.json
inflating: ./novelctrlk6_8_coco_dataset/.DS_Store
inflating: ./__MACOSX/novelctrlk6_8_coco_dataset/._.DS_Store
inflating: ./novelctrlk6_8_coco_dataset/data.yaml
inflating: ./novelctrlk6_8_coco_dataset/train/.DS_Store
inflating: ./__MACOSX/novelctrlk6_8_coco_dataset/train/._.DS_Store
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001466_29.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006804_57.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00007044_50.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006232_55.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00000759_28.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00003680_32.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004441_88.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005090_94.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002476_27.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00000965_42.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001652_55.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002000_18.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002333_0.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005752_39.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006670_0.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005763_18.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004469_75.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005566_43.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004336_74.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006574_88.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001922_1.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001795_5.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005755_34.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00003576_54.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002647_78.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004295_47.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00003667_56.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006131_85.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00000311_77.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00000879_40.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002991_7.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00000757_5.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004628_68.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004348_33.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00003269_66.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00003224_49.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002628_21.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001838_25.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002825_40.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002247_29.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00003100_30.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001922_57.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001320_92.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006299_63.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00000952_60.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00000842_70.jpg
inflating: ./__MACOSX/novelctrlk6_8_coco_dataset/train/JPEGImages/._00000842_70.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002295_32.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004117_59.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00003976_44.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004032_20.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006212_69.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00003134_31.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006169_98.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006830_36.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004570_24.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00000735_23.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00003905_42.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00003012_37.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005456_95.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002456_9.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002433_90.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006715_97.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005597_15.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006319_53.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005025_83.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00000530_64.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002362_63.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002311_72.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005068_37.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006353_11.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005056_91.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00000970_34.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002577_24.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006601_16.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00000652_65.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002639_95.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005953_8.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006000_27.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005700_89.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004672_51.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004062_19.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005246_28.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005154_53.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005584_93.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00003834_80.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004711_6.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006038_20.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006373_2.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006470_84.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00003956_16.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002625_79.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006270_45.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006521_86.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001999_45.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004081_4.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00000776_14.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002546_58.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001181_61.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002226_87.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001632_33.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006218_71.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00005400_9.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001299_86.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00002067_75.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006844_69.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001892_72.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001153_93.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001389_82.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001439_52.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006367_98.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004018_67.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004535_48.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006361_13.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00003167_10.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00006832_66.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00004956_38.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00001980_61.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/JPEGImages/00003364_13.jpg
inflating: ./novelctrlk6_8_coco_dataset/train/annotations.json
DATASET_NAME = DATASET_DIR = f"{dataset.replace('.zip','')}"
from detectron2.data.datasets import register_coco_instances
from detectron2.data import get_detection_dataset_dicts
from detectron2.data.datasets import builtin_meta
register_coco_instances(f"{DATASET_NAME}_train", {}, f"{DATASET_DIR}/train/annotations.json", f"{DATASET_DIR}/train/")
register_coco_instances(f"{DATASET_NAME}_valid", {}, f"{DATASET_DIR}/valid/annotations.json", f"{DATASET_DIR}/valid/")
_dataset_metadata = MetadataCatalog.get(f"{DATASET_NAME}_train")
_dataset_metadata.thing_colors = [cc['color'] for cc in builtin_meta.COCO_CATEGORIES]
dataset_dicts = get_detection_dataset_dicts([f"{DATASET_NAME}_train"])
[01/24 14:31:51 d2.data.datasets.coco]: Loaded 118 images in COCO format from novelctrlk6_8_coco_dataset/train/annotations.json
[01/24 14:31:51 d2.data.build]: Removed 0 images with no usable annotations. 118 images left.
[01/24 14:31:51 d2.data.build]: Distribution of instances among all 7 categories:
| category | #instances | category | #instances | category | #instances |
|:------------:|:-------------|:----------:|:-------------|:----------:|:-------------|
| _background_ | 0 | nose | 118 | left_ear | 118 |
| right_ear | 117 | tail_base | 119 | mouse | 118 |
| centroid | 1 | | | | |
| total | 591 | | | | |
NUM_CLASSES = len(_dataset_metadata.thing_classes)
print(f"{NUM_CLASSES} Number of classes in the dataset")
7 Number of classes in the dataset
Inference & evaluation using the trained model#
Now, let’s run inference with the trained model on the validation dataset. First, let’s create a predictor using the model we just trained:
if GPU:
!nvidia-smi
Mon Jan 24 14:31:51 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.86 Driver Version: 470.86 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... Off | 00000000:C1:00.0 Off | N/A |
| 24% 34C P8 20W / 250W | 429MiB / 7979MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1405 G /usr/lib/xorg/Xorg 132MiB |
| 0 N/A N/A 64929 G /usr/lib/xorg/Xorg 261MiB |
| 0 N/A N/A 65055 G /usr/bin/gnome-shell 9MiB |
| 0 N/A N/A 65407 G ...AAAAAAAAA= --shared-files 8MiB |
+-----------------------------------------------------------------------------+
from detectron2.engine import DefaultTrainer
cfg = get_cfg()
if GPU:
pass
else:
cfg.MODEL.DEVICE='cpu'
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
cfg.DATASETS.TRAIN = (f"{DATASET_NAME}_train",)
cfg.DATASETS.TEST = ()
cfg.DATALOADER.NUM_WORKERS = 2 #@param
cfg.DATALOADER.SAMPLER_TRAIN = "RepeatFactorTrainingSampler"
cfg.DATALOADER.REPEAT_THRESHOLD = 0.3
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") # Let training initialize from model zoo
cfg.SOLVER.IMS_PER_BATCH = 4 #@param
cfg.SOLVER.BASE_LR = 0.0025 #@param # pick a good LR
cfg.SOLVER.MAX_ITER = 3000 #@param # 300 iterations seems good enough for 100 frames dataset; you will need to train longer for a practical dataset
cfg.SOLVER.CHECKPOINT_PERIOD = 1000 #@param
cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 32 #@param # faster, and good enough for this toy dataset (default: 512)
cfg.MODEL.ROI_HEADS.NUM_CLASSES = NUM_CLASSES # (see https://detectron2.readthedocs.io/tutorials/datasets.html#update-the-config-for-new-datasets)
os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)
trainer = DefaultTrainer(cfg)
trainer.resume_or_load(resume=False)
[01/24 14:31:54 d2.engine.defaults]: Model:
GeneralizedRCNN(
(backbone): FPN(
(fpn_lateral2): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1))
(fpn_output2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(fpn_lateral3): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1))
(fpn_output3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(fpn_lateral4): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1))
(fpn_output4): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(fpn_lateral5): Conv2d(2048, 256, kernel_size=(1, 1), stride=(1, 1))
(fpn_output5): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(top_block): LastLevelMaxPool()
(bottom_up): ResNet(
(stem): BasicStem(
(conv1): Conv2d(
3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False
(norm): FrozenBatchNorm2d(num_features=64, eps=1e-05)
)
)
(res2): Sequential(
(0): BottleneckBlock(
(shortcut): Conv2d(
64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
(conv1): Conv2d(
64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=64, eps=1e-05)
)
(conv2): Conv2d(
64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=64, eps=1e-05)
)
(conv3): Conv2d(
64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
)
(1): BottleneckBlock(
(conv1): Conv2d(
256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=64, eps=1e-05)
)
(conv2): Conv2d(
64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=64, eps=1e-05)
)
(conv3): Conv2d(
64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
)
(2): BottleneckBlock(
(conv1): Conv2d(
256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=64, eps=1e-05)
)
(conv2): Conv2d(
64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=64, eps=1e-05)
)
(conv3): Conv2d(
64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
)
)
(res3): Sequential(
(0): BottleneckBlock(
(shortcut): Conv2d(
256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False
(norm): FrozenBatchNorm2d(num_features=512, eps=1e-05)
)
(conv1): Conv2d(
256, 128, kernel_size=(1, 1), stride=(2, 2), bias=False
(norm): FrozenBatchNorm2d(num_features=128, eps=1e-05)
)
(conv2): Conv2d(
128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=128, eps=1e-05)
)
(conv3): Conv2d(
128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=512, eps=1e-05)
)
)
(1): BottleneckBlock(
(conv1): Conv2d(
512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=128, eps=1e-05)
)
(conv2): Conv2d(
128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=128, eps=1e-05)
)
(conv3): Conv2d(
128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=512, eps=1e-05)
)
)
(2): BottleneckBlock(
(conv1): Conv2d(
512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=128, eps=1e-05)
)
(conv2): Conv2d(
128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=128, eps=1e-05)
)
(conv3): Conv2d(
128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=512, eps=1e-05)
)
)
(3): BottleneckBlock(
(conv1): Conv2d(
512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=128, eps=1e-05)
)
(conv2): Conv2d(
128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=128, eps=1e-05)
)
(conv3): Conv2d(
128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=512, eps=1e-05)
)
)
)
(res4): Sequential(
(0): BottleneckBlock(
(shortcut): Conv2d(
512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False
(norm): FrozenBatchNorm2d(num_features=1024, eps=1e-05)
)
(conv1): Conv2d(
512, 256, kernel_size=(1, 1), stride=(2, 2), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
(conv2): Conv2d(
256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
(conv3): Conv2d(
256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=1024, eps=1e-05)
)
)
(1): BottleneckBlock(
(conv1): Conv2d(
1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
(conv2): Conv2d(
256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
(conv3): Conv2d(
256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=1024, eps=1e-05)
)
)
(2): BottleneckBlock(
(conv1): Conv2d(
1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
(conv2): Conv2d(
256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
(conv3): Conv2d(
256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=1024, eps=1e-05)
)
)
(3): BottleneckBlock(
(conv1): Conv2d(
1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
(conv2): Conv2d(
256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
(conv3): Conv2d(
256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=1024, eps=1e-05)
)
)
(4): BottleneckBlock(
(conv1): Conv2d(
1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
(conv2): Conv2d(
256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
(conv3): Conv2d(
256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=1024, eps=1e-05)
)
)
(5): BottleneckBlock(
(conv1): Conv2d(
1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
(conv2): Conv2d(
256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=256, eps=1e-05)
)
(conv3): Conv2d(
256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=1024, eps=1e-05)
)
)
)
(res5): Sequential(
(0): BottleneckBlock(
(shortcut): Conv2d(
1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False
(norm): FrozenBatchNorm2d(num_features=2048, eps=1e-05)
)
(conv1): Conv2d(
1024, 512, kernel_size=(1, 1), stride=(2, 2), bias=False
(norm): FrozenBatchNorm2d(num_features=512, eps=1e-05)
)
(conv2): Conv2d(
512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=512, eps=1e-05)
)
(conv3): Conv2d(
512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=2048, eps=1e-05)
)
)
(1): BottleneckBlock(
(conv1): Conv2d(
2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=512, eps=1e-05)
)
(conv2): Conv2d(
512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=512, eps=1e-05)
)
(conv3): Conv2d(
512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=2048, eps=1e-05)
)
)
(2): BottleneckBlock(
(conv1): Conv2d(
2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=512, eps=1e-05)
)
(conv2): Conv2d(
512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=512, eps=1e-05)
)
(conv3): Conv2d(
512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False
(norm): FrozenBatchNorm2d(num_features=2048, eps=1e-05)
)
)
)
)
)
(proposal_generator): RPN(
(rpn_head): StandardRPNHead(
(conv): Conv2d(
256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)
(activation): ReLU()
)
(objectness_logits): Conv2d(256, 3, kernel_size=(1, 1), stride=(1, 1))
(anchor_deltas): Conv2d(256, 12, kernel_size=(1, 1), stride=(1, 1))
)
(anchor_generator): DefaultAnchorGenerator(
(cell_anchors): BufferList()
)
)
(roi_heads): StandardROIHeads(
(box_pooler): ROIPooler(
(level_poolers): ModuleList(
(0): ROIAlign(output_size=(7, 7), spatial_scale=0.25, sampling_ratio=0, aligned=True)
(1): ROIAlign(output_size=(7, 7), spatial_scale=0.125, sampling_ratio=0, aligned=True)
(2): ROIAlign(output_size=(7, 7), spatial_scale=0.0625, sampling_ratio=0, aligned=True)
(3): ROIAlign(output_size=(7, 7), spatial_scale=0.03125, sampling_ratio=0, aligned=True)
)
)
(box_head): FastRCNNConvFCHead(
(flatten): Flatten(start_dim=1, end_dim=-1)
(fc1): Linear(in_features=12544, out_features=1024, bias=True)
(fc_relu1): ReLU()
(fc2): Linear(in_features=1024, out_features=1024, bias=True)
(fc_relu2): ReLU()
)
(box_predictor): FastRCNNOutputLayers(
(cls_score): Linear(in_features=1024, out_features=8, bias=True)
(bbox_pred): Linear(in_features=1024, out_features=28, bias=True)
)
(mask_pooler): ROIPooler(
(level_poolers): ModuleList(
(0): ROIAlign(output_size=(14, 14), spatial_scale=0.25, sampling_ratio=0, aligned=True)
(1): ROIAlign(output_size=(14, 14), spatial_scale=0.125, sampling_ratio=0, aligned=True)
(2): ROIAlign(output_size=(14, 14), spatial_scale=0.0625, sampling_ratio=0, aligned=True)
(3): ROIAlign(output_size=(14, 14), spatial_scale=0.03125, sampling_ratio=0, aligned=True)
)
)
(mask_head): MaskRCNNConvUpsampleHead(
(mask_fcn1): Conv2d(
256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)
(activation): ReLU()
)
(mask_fcn2): Conv2d(
256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)
(activation): ReLU()
)
(mask_fcn3): Conv2d(
256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)
(activation): ReLU()
)
(mask_fcn4): Conv2d(
256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)
(activation): ReLU()
)
(deconv): ConvTranspose2d(256, 256, kernel_size=(2, 2), stride=(2, 2))
(deconv_relu): ReLU()
(predictor): Conv2d(256, 7, kernel_size=(1, 1), stride=(1, 1))
)
)
)
[01/24 14:31:54 d2.data.datasets.coco]: Loaded 118 images in COCO format from novelctrlk6_8_coco_dataset/train/annotations.json
[01/24 14:31:54 d2.data.build]: Removed 0 images with no usable annotations. 118 images left.
[01/24 14:31:54 d2.data.dataset_mapper]: [DatasetMapper] Augmentations used in training: [ResizeShortestEdge(short_edge_length=(640, 672, 704, 736, 768, 800), max_size=1333, sample_style='choice'), RandomFlip()]
[01/24 14:31:54 d2.data.build]: Using training sampler RepeatFactorTrainingSampler
[01/24 14:31:54 d2.data.common]: Serializing 118 elements to byte tensors and concatenating them all ...
[01/24 14:31:54 d2.data.common]: Serialized dataset takes 0.31 MiB
WARNING [01/24 14:31:54 d2.solver.build]: SOLVER.STEPS contains values larger than SOLVER.MAX_ITER. These values will be ignored.
Skip loading parameter 'roi_heads.box_predictor.cls_score.weight' to the model due to incompatible shapes: (81, 1024) in the checkpoint but (8, 1024) in the model! You might want to double check if this is expected.
Skip loading parameter 'roi_heads.box_predictor.cls_score.bias' to the model due to incompatible shapes: (81,) in the checkpoint but (8,) in the model! You might want to double check if this is expected.
Skip loading parameter 'roi_heads.box_predictor.bbox_pred.weight' to the model due to incompatible shapes: (320, 1024) in the checkpoint but (28, 1024) in the model! You might want to double check if this is expected.
Skip loading parameter 'roi_heads.box_predictor.bbox_pred.bias' to the model due to incompatible shapes: (320,) in the checkpoint but (28,) in the model! You might want to double check if this is expected.
Skip loading parameter 'roi_heads.mask_head.predictor.weight' to the model due to incompatible shapes: (80, 256, 1, 1) in the checkpoint but (7, 256, 1, 1) in the model! You might want to double check if this is expected.
Skip loading parameter 'roi_heads.mask_head.predictor.bias' to the model due to incompatible shapes: (80,) in the checkpoint but (7,) in the model! You might want to double check if this is expected.
Some model parameters or buffers are not found in the checkpoint:
roi_heads.box_predictor.bbox_pred.{bias, weight}
roi_heads.box_predictor.cls_score.{bias, weight}
roi_heads.mask_head.predictor.{bias, weight}
# Inference should use the config with parameters that are used in training
# cfg now already contains everything we've set previously.
# We simply update the weights with the newly trained ones to perform inference:
cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, "model_final.pth") # path to the model we just trained
# set a custom testing threshold
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.15 #@param {type: "slider", min:0.0, max:1.0, step: 0.01}
predictor = DefaultPredictor(cfg)
Then, we randomly select several samples to visualize the prediction results.
from detectron2.utils.visualizer import ColorMode
dataset_dicts = get_detection_dataset_dicts([f"{DATASET_NAME}_valid"])
for d in random.sample(dataset_dicts, 4):
im = cv2.imread(d["file_name"])
outputs = predictor(im) # format is documented at https://detectron2.readthedocs.io/tutorials/models.html#model-output-format
v = Visualizer(im[:, :, ::-1],
metadata=_dataset_metadata,
scale=0.5,
instance_mode=ColorMode.SEGMENTATION # remove the colors of unsegmented pixels. This option is only available for segmentation models
)
out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
if IN_COLAB:
cv2_imshow(out.get_image()[:, :, ::-1])
else:
plt.imshow(out.get_image()[:, :, ::-1])
plt.show()
[01/24 14:31:55 d2.data.datasets.coco]: Loaded 60 images in COCO format from novelctrlk6_8_coco_dataset/valid/annotations.json
[01/24 14:31:55 d2.data.build]: Removed 0 images with no usable annotations. 60 images left.
[01/24 14:31:55 d2.data.build]: Distribution of instances among all 7 categories:
| category | #instances | category | #instances | category | #instances |
|:------------:|:-------------|:----------:|:-------------|:----------:|:-------------|
| _background_ | 0 | nose | 60 | left_ear | 60 |
| right_ear | 60 | tail_base | 60 | mouse | 60 |
| centroid | 0 | | | | |
| total | 300 | | | | |
/home/jeremy/anaconda3/envs/annolid-env/lib/python3.7/site-packages/detectron2/structures/image_list.py:88: UserWarning: __floordiv__ is deprecated, and its behavior will change in a future version of pytorch. It currently rounds toward 0 (like the 'trunc' function NOT 'floor'). This results in incorrect rounding for negative values. To keep the current behavior, use torch.div(a, b, rounding_mode='trunc'), or for actual floor division, use torch.div(a, b, rounding_mode='floor').
max_size = (max_size + (stride - 1)) // stride * stride
/home/jeremy/anaconda3/envs/annolid-env/lib/python3.7/site-packages/torch/functional.py:445: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at ../aten/src/ATen/native/TensorShape.cpp:2157.)
return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]




A more robust way to evaluate the model is to use a metric called Average Precision (AP) already implemented in the detectron2 package. If you want more precision on what the AP is, you can take a look here and here.
#TODO: expand on how to interpret AP#
from detectron2.evaluation import COCOEvaluator, inference_on_dataset
from detectron2.data import build_detection_test_loader
if IN_COLAB:
evaluator = COCOEvaluator(f"{DATASET_NAME}_valid", cfg, False, output_dir="/content/eval_output/")
else:
evaluator = COCOEvaluator(f"{DATASET_NAME}_valid", cfg, False, output_dir="eval_output/")
val_loader = build_detection_test_loader(cfg, f"{DATASET_NAME}_valid")
print(inference_on_dataset(predictor.model, val_loader, evaluator))
# another equivalent way to evaluate the model is to use `trainer.test`
WARNING [01/24 14:31:56 d2.evaluation.coco_evaluation]: COCO Evaluator instantiated using config, this is deprecated behavior. Please pass in explicit arguments instead.
[01/24 14:31:56 d2.data.datasets.coco]: Loaded 60 images in COCO format from novelctrlk6_8_coco_dataset/valid/annotations.json
[01/24 14:31:56 d2.data.dataset_mapper]: [DatasetMapper] Augmentations used in inference: [ResizeShortestEdge(short_edge_length=(800, 800), max_size=1333, sample_style='choice')]
[01/24 14:31:56 d2.data.common]: Serializing 60 elements to byte tensors and concatenating them all ...
[01/24 14:31:56 d2.data.common]: Serialized dataset takes 0.15 MiB
[01/24 14:31:56 d2.evaluation.evaluator]: Start inference on 60 batches
[01/24 14:31:57 d2.evaluation.evaluator]: Inference done 11/60. Dataloading: 0.0008 s/iter. Inference: 0.0523 s/iter. Eval: 0.0180 s/iter. Total: 0.0712 s/iter. ETA=0:00:03
[01/24 14:32:01 d2.evaluation.evaluator]: Total inference time: 0:00:03.823960 (0.069527 s / iter per device, on 1 devices)
[01/24 14:32:01 d2.evaluation.evaluator]: Total inference pure compute time: 0:00:02 (0.051859 s / iter per device, on 1 devices)
[01/24 14:32:01 d2.evaluation.coco_evaluation]: Preparing results for COCO format ...
[01/24 14:32:01 d2.evaluation.coco_evaluation]: Saving results to eval_output/coco_instances_results.json
[01/24 14:32:01 d2.evaluation.coco_evaluation]: Evaluating predictions with unofficial COCO API...
Loading and preparing results...
DONE (t=0.00s)
creating index...
index created!
[01/24 14:32:01 d2.evaluation.fast_eval_api]: Evaluate annotation type *bbox*
[01/24 14:32:01 d2.evaluation.fast_eval_api]: COCOeval_opt.evaluate() finished in 0.02 seconds.
[01/24 14:32:01 d2.evaluation.fast_eval_api]: Accumulating evaluation results...
[01/24 14:32:01 d2.evaluation.fast_eval_api]: COCOeval_opt.accumulate() finished in 0.01 seconds.
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.429
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.823
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.407
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.348
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.796
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.499
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.530
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.530
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.464
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.797
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000
[01/24 14:32:01 d2.evaluation.coco_evaluation]: Evaluation results for bbox:
| AP | AP50 | AP75 | APs | APm | APl |
|:------:|:------:|:------:|:------:|:------:|:-----:|
| 42.881 | 82.250 | 40.677 | 34.808 | 79.604 | nan |
[01/24 14:32:01 d2.evaluation.coco_evaluation]: Some metrics cannot be computed and is shown as NaN.
[01/24 14:32:01 d2.evaluation.coco_evaluation]: Per-category bbox AP:
| category | AP | category | AP | category | AP |
|:-------------|:-------|:-----------|:-------|:-----------|:-------|
| _background_ | nan | nose | 37.467 | left_ear | 34.991 |
| right_ear | 26.474 | tail_base | 40.300 | mouse | 75.175 |
| centroid | nan | | | | |
Loading and preparing results...
DONE (t=0.00s)
creating index...
index created!
[01/24 14:32:01 d2.evaluation.fast_eval_api]: Evaluate annotation type *segm*
[01/24 14:32:01 d2.evaluation.fast_eval_api]: COCOeval_opt.evaluate() finished in 0.02 seconds.
[01/24 14:32:01 d2.evaluation.fast_eval_api]: Accumulating evaluation results...
[01/24 14:32:01 d2.evaluation.fast_eval_api]: COCOeval_opt.accumulate() finished in 0.01 seconds.
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.138
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.207
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.190
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.001
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.689
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.145
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.145
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.145
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.004
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.712
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000
[01/24 14:32:01 d2.evaluation.coco_evaluation]: Evaluation results for segm:
| AP | AP50 | AP75 | APs | APm | APl |
|:------:|:------:|:------:|:-----:|:------:|:-----:|
| 13.838 | 20.664 | 18.990 | 0.083 | 68.859 | nan |
[01/24 14:32:01 d2.evaluation.coco_evaluation]: Some metrics cannot be computed and is shown as NaN.
[01/24 14:32:01 d2.evaluation.coco_evaluation]: Per-category segm AP:
| category | AP | category | AP | category | AP |
|:-------------|:------|:-----------|:------|:-----------|:-------|
| _background_ | nan | nose | 0.000 | left_ear | 0.000 |
| right_ear | 0.025 | tail_base | 0.307 | mouse | 68.859 |
| centroid | nan | | | | |
OrderedDict([('bbox', {'AP': 42.881449697137505, 'AP50': 82.2501044835862, 'AP75': 40.67677036400211, 'APs': 34.80797160883607, 'APm': 79.60396039603961, 'APl': nan, 'AP-_background_': nan, 'AP-nose': 37.46745432692759, 'AP-left_ear': 34.99076354765347, 'AP-right_ear': 26.474155569306223, 'AP-tail_base': 40.29951299145698, 'AP-mouse': 75.17536205034328, 'AP-centroid': nan}), ('segm', {'AP': 13.838099650346003, 'AP50': 20.663994970925664, 'AP75': 18.99009900990099, 'APs': 0.082999371365708, 'APm': 68.85850076626717, 'APl': nan, 'AP-_background_': nan, 'AP-nose': 0.0, 'AP-left_ear': 0.0, 'AP-right_ear': 0.024752475247524754, 'AP-tail_base': 0.3072450102153072, 'AP-mouse': 68.85850076626717, 'AP-centroid': nan})])