code: def _assign_boxes_to_pos_chips(
      self, iob, overlap_threshold, pos_chip_ids, valid_boxes_idx
  ):
      chip_ids, box_ids = np.nonzero(iob >= overlap_threshold)
      pos_chip2boxes_idx = defaultdict(list)
      for chip_id, box_id in zip(chip_ids, box_ids):
          if chip_id not in pos_chip_ids:
              continue
          raw_gt_box_idx = valid_boxes_idx[box_id]
          pos_chip2boxes_idx[chip_id].append(raw_gt_box_idx)
      return pos_chip2boxes_idx
  
imports: import copy
  import math
  import random
  import numpy
  from copy import deepcopy
  from typing import List, Tuple
  from collections import defaultdict
  from .chip_box_utils import nms, transform_chip_boxes2image_boxes
  from .chip_box_utils import find_chips_to_cover_overlaped_boxes
  from .chip_box_utils import transform_chip_box
  from .chip_box_utils import intersection_over_box
label_desc: Use image node_id 15 for calling the AnnoCropper obj's underlying member method code with example usage: obj._assign_boxes_to_pos_chips(iob, overlap_threshold, pos_chip_ids, valid_boxes_idx) and returns: pos_chip2boxes_idx