class_docstr: Inspired by https://github.com/kuangliu/pytorch-src
  Transform between (bboxes, lables) <-> SSD output
  
  dboxes: default boxes in size 8732 x 4,
      encoder: input ltrb format, output xywh format
      decoder: input xywh format, output ltrb format
  
  encode:
      input  : bboxes_in (Tensor nboxes x 4), labels_in (Tensor nboxes)
      output : bboxes_out (Tensor 8732 x 4), labels_out (Tensor 8732)
      criteria : IoU threshold of bboexes
  
  decode:
      input  : bboxes_in (Tensor 8732 x 4), scores_in (Tensor 8732 x nitems)
      output : bboxes_out (Tensor nboxes x 4), labels_out (Tensor nboxes)
      criteria : IoU threshold of bboexes
      max_output : maximum number of output bboxes
code: def decode_batch(
      self, bboxes_in, scores_in, criteria=0.45, max_output=200
  ):
      bboxes, probs = self.scale_back_batch(bboxes_in, scores_in)
  
      output = []
      for bbox, prob in zip(bboxes.split(1, 0), probs.split(1, 0)):
          bbox = bbox.squeeze(0)
          prob = prob.squeeze(0)
          output.append(
              self.decode_single(bbox, prob, criteria, max_output)
          )
          # print(output[-1])
      return output
  
imports: import torch
  import torchvision.transforms
  import torch.utils.data
  from PIL import Image
  import os
  import numpy
  import random
  import itertools
  import torch.nn.functional
  import json
  import time
  import bz2
  import pickle
  from math import sqrt
label_desc: Use image node_id 4 for calling the Encoder obj's underlying member method code with example usage: obj.decode_batch(bboxes_in, scores_in, criteria, max_output) and returns: output