class_docstr: Decode classification results.
  
  This decoder must work with `MultiClassEncoder` to reconstruct valid labels.
  The decoder expect results are after logits, e.g. Softmax.
  This version is different from
  :py:class:`gluoncv.nn.coder.MultiClassDecoder` with the following changes:
  
  For each position(anchor boxes), each foreground class can have their own
  results, rather than enforced to be the best one.
  For example, for a 5-class prediction with background(totaling 6 class), say
  (0.5, 0.1, 0.2, 0.1, 0.05, 0.05) as (bg, apple, orange, peach, grape, melon),
  `MultiClassDecoder` produce only one class id and score, that is  (orange-0.2).
  `MultiPerClassDecoder` produce 5 results individually:
  (apple-0.1, orange-0.2, peach-0.1, grape-0.05, melon-0.05).
  
  Parameters
  ----------
  num_class : int
      Number of classes including background.
  axis : int
      Axis of class-wise results.
  thresh : float
      Confidence threshold for the post-softmax scores.
      Scores less than `thresh` are marked with `0`, corresponding `cls_id` is
      marked with invalid class id `-1`.
class_docstr_tok: ["Decode","classification","results",".","This","decoder","must","work","with","`","MultiClassEncoder","`","to","reconstruct","valid","labels",".","The","decoder","expect","results","are","after","logits",",","e.g",".","Softmax",".","This","version","is","different","from",":","py",":","class",":","`","gluoncv.nn.coder.MultiClassDecoder","`","with","the","following","changes",":","For","each","position","(","anchor","boxes",")",",","each","foreground","class","can","have","their","own","results",",","rather","than","enforced","to","be","the","best","one",".","For","example",",","for","a","5-class","prediction","with","background","(","totaling","6","class",")",",","say","(","0.5",",","0.1",",","0.2",",","0.1",",","0.05",",","0.05",")","as","(","bg",",","apple",",","orange",",","peach",",","grape",",","melon",")",",","`","MultiClassDecoder","`","produce","only","one","class","id","and","score",",","that","is","(","orange-0.2",")",".","`","MultiPerClassDecoder","`","produce","5","results","individually",":","(","apple-0.1",",","orange-0.2",",","peach-0.1",",","grape-0.05",",","melon-0.05",")",".","Parameters","--","--","--","--","--","num_class",":","int","Number","of","classes","including","background",".","axis",":","int","Axis","of","class-wise","results",".","thresh",":","float","Confidence","threshold","for","the","post-softmax","scores",".","Scores","less","than","`","thresh","`","are","marked","with","`","0","`",",","corresponding","`","cls_id","`","is","marked","with","invalid","class","id","`","-1","`","."]
code: def __init__(self, num_class, axis=-1, thresh=0.01):
      super(MultiPerClassDecoder, self).__init__()
      self._fg_class = num_class - 1
      self._axis = axis
      self._thresh = thresh
  
imports: from __future__ import absolute_import
  import numpy
  from mxnet import gluon
  from mxnet import nd
  from .bbox import BBoxCornerToCenter, NumPyBBoxCornerToCenter
label_desc: Use image node_id 1 to create a new MultiPerClassDecoder object from inherited base classes: gluon with example: obj = MultiPerClassDecoder(num_class, axis, thresh)