docstr: :return: neg_chip2box_num, dict: chipid->neg_box_num
docstr_tok: [":","return",":","neg_chip2box_num",",","dict",":","chipid-",">","neg_box_num"]
code: def _find_neg_chips(
      self, chips: "Cx4", pos_chip_ids: "D", neg_boxes: "Nx4"
  ):
      """
      :return: neg_chip2box_num, dict: chipid->neg_box_num
      """
      neg_chip_ids = np.setdiff1d(np.arange(len(chips)), pos_chip_ids)
      neg_chips = chips[neg_chip_ids]
  
      iob = intersection_over_box(neg_chips, neg_boxes)
      iob_threshold_to_find_chips = 0.7
      (
          chosen_neg_chip_ids,
          chip_id2overlap_box_num,
      ) = self._find_chips_to_cover_overlaped_boxes(
          iob, iob_threshold_to_find_chips
      )
  
      neg_chipid2box_num = {}
      for cid in chosen_neg_chip_ids:
          box_num = chip_id2overlap_box_num[cid]
          raw_chip_id = neg_chip_ids[cid]
          neg_chipid2box_num[raw_chip_id] = box_num
      return neg_chipid2box_num
  
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 18 for calling the AnnoCropper obj's underlying member method code with example usage: obj._find_neg_chips(chips, pos_chip_ids, neg_boxes) and returns: neg_chipid2box_num