code: def do_nms(self, boxes, nms_thresh):
      if len(boxes) > 0:
          nb_class = len(boxes[0].classes)
      else:
          return
  
      for c in range(nb_class):
          sorted_indices = np.argsort(
              [-box.classes[c] for box in boxes]
          )
  
          for i in range(len(sorted_indices)):
              index_i = sorted_indices[i]
  
              if boxes[index_i].classes[c] == 0:
                  continue
  
              for j in range(i + 1, len(sorted_indices)):
                  index_j = sorted_indices[j]
  
                  if (
                      self.bbox_iou(boxes[index_i], boxes[index_j])
                      >= nms_thresh
                  ):
                      boxes[index_j].classes[c] = 0
  
imports: import os
  import re
  import numpy
  import json
  from imageai.Detection.Custom.voc import parse_voc_annotation
  from imageai.Detection.YOLO.yolov3 import yolov3_main, yolov3_train, dummy_loss
  from imageai.Detection.Custom.generator import BatchGenerator
  from imageai.Detection.Custom.utils.utils import normalize, evaluate, makedirs
  from tensorflow.keras.callbacks import ReduceLROnPlateau
  from tensorflow.keras.optimizers import Adam
  from imageai.Detection.Custom.callbacks import CustomModelCheckpoint
  from imageai.Detection.Custom.utils.multi_gpu_model import multi_gpu_model
  from imageai.Detection.Custom.gen_anchors import generateAnchors
  import tensorflow
  from tensorflow.keras.models import load_model
  from tensorflow.keras import Input
  from tensorflow.keras.callbacks import TensorBoard
  import tensorflow.keras.backend
  import cv2
label_desc: Use image node_id 7 for calling the CustomDetectionUtils obj's underlying member method code with example usage: obj.do_nms(boxes, nms_thresh) without return types