docstr: :return: neg_boxes: Nx4
docstr_tok: [":","return",":","neg_boxes",":","Nx4"]
code: def _find_neg_boxes(
      self, chips: "Cx4", pos_chip_ids: "D", valid_props: "Px4"
  ):
      """
      :return: neg_boxes: Nx4
      """
      if len(pos_chip_ids) == 0:
          return valid_props
  
      pos_chips = chips[pos_chip_ids]
      iob = intersection_over_box(pos_chips, valid_props)
      overlap_per_prop = np.max(iob, axis=0)
      non_overlap_props_idx = overlap_per_prop < 0.5
      neg_boxes = valid_props[non_overlap_props_idx]
      return neg_boxes
  
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 17 for calling the AnnoCropper obj's underlying member method code with example usage: obj._find_neg_boxes(chips, pos_chip_ids, valid_props) and returns: neg_boxes, valid_props