docstr: Add 'boxes', 'class', 'is_crowd' of this image to the dict, used by detection.
  If add_mask is True, also add 'segmentation' in coco poly format.
docstr_tok: ["Add","'boxes","'",",","'class","'",",","'is_crowd","'","of","this","image","to","the","dict",",","used","by","detection",".","If","add_mask","is","True",",","also","add","'segmentation","'","in","coco","poly","format","."]
code: def _add_detection_gt(self, img, add_mask):
      """
      Add 'boxes', 'class', 'is_crowd' of this image to the dict, used by detection.
      If add_mask is True, also add 'segmentation' in coco poly format.
      """
      # ann_ids = self.coco.getAnnIds(imgIds=img['image_id'])
      # objs = self.coco.loadAnns(ann_ids)
      objs = self.coco.imgToAnns[
          img["image_id"]
      ]  # equivalent but faster than the above two lines
      if "minival" not in self.annotation_file:
          # TODO better to check across the entire json, rather than per-image
          ann_ids = [ann["id"] for ann in objs]
          assert len(set(ann_ids)) == len(
              ann_ids
          ), "Annotation ids in '{}' are not unique!".format(
              self.annotation_file
          )
  
      # clean-up boxes
      width = img.pop("width")
      height = img.pop("height")
  
      all_boxes = []
      all_segm = []
      all_cls = []
      all_iscrowd = []
      for objid, obj in enumerate(objs):
          if obj.get("ignore", 0) == 1:
              continue
          x1, y1, w, h = list(map(float, obj["bbox"]))
          # bbox is originally in float
          # x1/y1 means upper-left corner and w/h means true w/h. This can be verified by segmentation pixels.
          # But we do make an assumption here that (0.0, 0.0) is upper-left corner of the first pixel
          x2, y2 = x1 + w, y1 + h
  
          # np.clip would be quite slow here
          x1 = min(max(x1, 0), width)
          x2 = min(max(x2, 0), width)
          y1 = min(max(y1, 0), height)
          y2 = min(max(y2, 0), height)
          w, h = x2 - x1, y2 - y1
          # Require non-zero seg area and more than 1x1 box size
          if obj["area"] > 1 and w > 0 and h > 0:
              all_boxes.append([x1, y1, x2, y2])
              all_cls.append(
                  self.COCO_id_to_category_id.get(
                      obj["category_id"], obj["category_id"]
                  )
              )
              iscrowd = obj.get("iscrowd", 0)
              all_iscrowd.append(iscrowd)
  
              if add_mask:
                  segs = obj["segmentation"]
                  if not isinstance(segs, list):
                      assert iscrowd == 1
                      all_segm.append(None)
                  else:
                      valid_segs = [
                          np.asarray(p).reshape(-1, 2).astype("float32")
                          for p in segs
                          if len(p) >= 6
                      ]
                      if len(valid_segs) == 0:
                          logger.error(
                              "Object {} in image {} has no valid polygons!".format(
                                  objid, img["file_name"]
                              )
                          )
                      elif len(valid_segs) < len(segs):
                          logger.warn(
                              "Object {} in image {} has invalid polygons!".format(
                                  objid, img["file_name"]
                              )
                          )
                      all_segm.append(valid_segs)
  
      # all geometrically-valid boxes are returned
      if len(all_boxes):
          img["boxes"] = np.asarray(
              all_boxes, dtype="float32"
          )  # (n, 4)
      else:
          img["boxes"] = np.zeros((0, 4), dtype="float32")
      cls = np.asarray(all_cls, dtype="int32")  # (n,)
      if len(cls):
          assert cls.min() > 0, "Category id in COCO format must > 0!"
      img["class"] = cls  # n, always >0
      img["is_crowd"] = np.asarray(all_iscrowd, dtype="int8")  # n,
      if add_mask:
          # also required to be float32
          img["segmentation"] = all_segm
  
file_path: tensorpack/examples/FasterRCNN/dataset/coco.py
imports: import json
  import numpy
  import os
  import tqdm
  from tensorpack.utils import logger
  from tensorpack.utils.timer import timed_operation
  from config import config
  from dataset import DatasetRegistry, DatasetSplit
label_desc: Use image node_id 4 for calling the COCODetection obj's underlying member method code with example usage: obj._add_detection_gt(img, add_mask) without return types