code: def update(self, inputs, outputs):
      outs = {}
      # outputs Tensor -> numpy.ndarray
      for k, v in outputs.items():
          outs[k] = v.numpy() if isinstance(v, paddle.Tensor) else v
  
      im_id = inputs["im_id"]
      im_id = (
          im_id.numpy() if isinstance(im_id, paddle.Tensor) else im_id
      )
      outs["im_id"] = im_id
  
      infer_results = get_infer_results(outs, self.clsid2catid)
      infer_results = (
          infer_results["bbox"] if "bbox" in infer_results else []
      )
      self.results += infer_results
      if self.save_prediction_only:
          return
  
      gt_boxes = inputs["gt_poly"]
      gt_labels = inputs["gt_class"]
  
      if "scale_factor" in inputs:
          scale_factor = (
              inputs["scale_factor"].numpy()
              if isinstance(inputs["scale_factor"], paddle.Tensor)
              else inputs["scale_factor"]
          )
      else:
          scale_factor = np.ones((gt_boxes.shape[0], 2)).astype(
              "float32"
          )
  
      for i in range(len(gt_boxes)):
          gt_box = (
              gt_boxes[i].numpy()
              if isinstance(gt_boxes[i], paddle.Tensor)
              else gt_boxes[i]
          )
          h, w = scale_factor[i]
          gt_box = gt_box / np.array([w, h, w, h, w, h, w, h])
          gt_label = (
              gt_labels[i].numpy()
              if isinstance(gt_labels[i], paddle.Tensor)
              else gt_labels[i]
          )
          gt_box, gt_label, _ = prune_zero_padding(gt_box, gt_label)
          bbox = [
              res["bbox"]
              for res in infer_results
              if int(res["image_id"]) == int(im_id[i])
          ]
          score = [
              res["score"]
              for res in infer_results
              if int(res["image_id"]) == int(im_id[i])
          ]
          label = [
              self.catid2clsid[int(res["category_id"])]
              for res in infer_results
              if int(res["image_id"]) == int(im_id[i])
          ]
          self.detection_map.update(
              bbox, score, label, gt_box, gt_label
          )
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import os
  import sys
  import json
  import paddle
  import numpy
  import typing
  from collections import defaultdict
  from pathlib import Path
  from .map_utils import prune_zero_padding, DetectionMAP
  from .coco_utils import get_infer_results, cocoapi_eval
  from .widerface_utils import face_eval_run
  from ppdet.data.source.category import get_categories
  from ppdet.modeling.rbox_utils import poly2rbox_np
  from ppdet.utils.logger import setup_logger
label_desc: Use image node_id 3 for calling the RBoxMetric obj's underlying member method code with example usage: obj.update(inputs, outputs) without return types