class_docstr: Performs non-maximum suppression (NMS) on the boxes according to their intersection-over-union (IoU).
  
  NMS iteratively removes lower-scoring boxes which have an IoU greater than ``iou_threshold`` with
  another (higher-scoring) box.
  
  The major differences between this version and the iOS 15 :py:class:`~.iOS15.tensor_operation.non_maximum_suppression`
  are as follows:
  
     - The input parameter ``score_threshold`` has been removed.
     - The inputs ``boxes`` and ``scores`` are ordered with number of boxes in the last dimension.
     - The fourth output containing number of boxes for each batch has been removed.
  
  Parameters
  ----------
  
  boxes: tensor<[n, 4, B], T> (Required)
      * Box coordinates on which to perform NMS. The coordinates are expected in
        ``CENTER_SIZE_WIDTH_FIRST`` format ``(x, y, width, height)``, in which ``(x, y)`` is the center.
  scores: tensor<[n, K, B], T> (Required)
      * Scores for each one of the boxes. ``K`` is the number of classes.
  iou_threshold: const<T> (Required)
      * The intersection over union (IoU) threshold over which boxes are
        suppressed. NMS remove all overlapping boxes with ``IoU > iou_threshold``.
  max_boxes: const<i32> (Required)
      * Maximum number of boxes to select. If the number of surviving boxes are
        less, the output is padded up to this number.
  per_class_suppression: const<bool> (Optional)
      * Defaults to ``False``.
      * If ``True``, suppression is performed independently within boxes of each class.
  
  Returns
  -------
  tensor<[n, 4, max_boxes], T>
      * Coordinates of selected boxes.
  tensor<[n, K, max_boxes], T>
      * Scores of selected boxes.
  tensor<[n, max_boxes], i32>
      * Indices of selected boxes.
  
  Attributes
  ----------
  T: fp16, fp32
class_docstr_tok: ["Performs","non-maximum","suppression","(","NMS",")","on","the","boxes","according","to","their","intersection-over-union","(","IoU",")",".","NMS","iteratively","removes","lower-scoring","boxes","which","have","an","IoU","greater","than","``","iou_threshold","``","with","another","(","higher-scoring",")","box",".","The","major","differences","between","this","version","and","the","iOS","15",":","py",":","class",":","`","~.iOS15.tensor_operation.non_maximum_suppression","`","are","as","follows",":","-","The","input","parameter","``","score_threshold","``","has","been","removed",".","-","The","inputs","``","boxes","``","and","``","scores","``","are","ordered","with","number","of","boxes","in","the","last","dimension",".","-","The","fourth","output","containing","number","of","boxes","for","each","batch","has","been","removed",".","Parameters","--","--","--","--","--","boxes",":","tensor","<","[","n",",","4",",","B","]",",","T",">","(","Required",")","*","Box","coordinates","on","which","to","perform","NMS",".","The","coordinates","are","expected","in","``","CENTER_SIZE_WIDTH_FIRST","``","format","``","(","x",",","y",",","width",",","height",")","``",",","in","which","``","(","x",",","y",")","``","is","the","center",".","scores",":","tensor","<","[","n",",","K",",","B","]",",","T",">","(","Required",")","*","Scores","for","each","one","of","the","boxes",".","``","K","``","is","the","number","of","classes",".","iou_threshold",":","const","<","T",">","(","Required",")","*","The","intersection","over","union","(","IoU",")","threshold","over","which","boxes","are","suppressed",".","NMS","remove","all","overlapping","boxes","with","``","IoU",">","iou_threshold","``",".","max_boxes",":","const","<","i32",">","(","Required",")","*","Maximum","number","of","boxes","to","select",".","If","the","number","of","surviving","boxes","are","less",",","the","output","is","padded","up","to","this","number",".","per_class_suppression",":","const","<","bool",">","(","Optional",")","*","Defaults","to","``","False","``",".","*","If","``","True","``",",","suppression","is","performed","independently","within","boxes","of","each","class",".","Returns","--","--","--","-","tensor","<","[","n",",","4",",","max_boxes","]",",","T",">","*","Coordinates","of","selected","boxes",".","tensor","<","[","n",",","K",",","max_boxes","]",",","T",">","*","Scores","of","selected","boxes",".","tensor","<","[","n",",","max_boxes","]",",","i32",">","*","Indices","of","selected","boxes",".","Attributes","--","--","--","--","--","T",":","fp16",",","fp32"]
code: def type_inference(self):
      boxes_dtype = self.boxes.dtype
      scores_dtype = self.scores.dtype
      n_batch, n_score_class, _ = self.scores.shape
      max_boxes = self.max_boxes.val
  
      return (
          types.tensor(boxes_dtype, (n_batch, 4, max_boxes)),
          types.tensor(
              scores_dtype, (n_batch, n_score_class, max_boxes)
          ),
          types.tensor(types.int32, (n_batch, max_boxes)),
      )
  
file_path: coremltools/coremltools/converters/mil/mil/ops/defs/iOS17/tensor_operation.py
imports: from coremltools.converters.mil.mil import types
  from coremltools.converters.mil.mil.input_type import DefaultInputs, InputSpec, TensorInputType
  from coremltools.converters.mil.mil.ops.defs._op_reqs import register_op
  from coremltools.converters.mil.mil.ops.defs.iOS15.tensor_operation import non_maximum_suppression
  from coremltools.converters.mil.mil.ops.defs.iOS16.tensor_operation import topk
  from coremltools.converters.mil.mil.ops.defs.iOS17 import _IOS17_TARGET
label_desc: Use image node_id 1 for calling the non_maximum_suppression obj's underlying member method code with example usage: obj.type_inference() and returns: types,  types,  types