class_docstr: This is the Detection Model training class, which allows you to train object detection models
  on image datasets that are in Pascal VOC annotation format, using the YOLOv3.
code: def _create_model(
      self,
      nb_class,
      anchors,
      max_box_per_image,
      max_grid,
      batch_size,
      warmup_batches,
      ignore_thresh,
      multi_gpu,
      lr,
      grid_scales,
      obj_scale,
      noobj_scale,
      xywh_scale,
      class_scale,
  ):
      if len(multi_gpu) > 1:
          with tf.device("/cpu:0"):
              template_model, infer_model = yolov3_train(
                  num_classes=nb_class,
                  anchors=anchors,
                  max_box_per_image=max_box_per_image,
                  max_grid=max_grid,
                  batch_size=batch_size // len(multi_gpu),
                  warmup_batches=warmup_batches,
                  ignore_thresh=ignore_thresh,
                  grid_scales=grid_scales,
                  obj_scale=obj_scale,
                  noobj_scale=noobj_scale,
                  xywh_scale=xywh_scale,
                  class_scale=class_scale,
              )
      else:
          template_model, infer_model = yolov3_train(
              num_classes=nb_class,
              anchors=anchors,
              max_box_per_image=max_box_per_image,
              max_grid=max_grid,
              batch_size=batch_size,
              warmup_batches=warmup_batches,
              ignore_thresh=ignore_thresh,
              grid_scales=grid_scales,
              obj_scale=obj_scale,
              noobj_scale=noobj_scale,
              xywh_scale=xywh_scale,
              class_scale=class_scale,
          )
  
          # load the pretrained weight if exists, otherwise load the backend weight only
  
      if len(self.__pre_trained_model) > 3:
          if self.__training_mode:
              print(
                  "Training with transfer learning from pretrained Model"
              )
          template_model.load_weights(
              self.__pre_trained_model, by_name=True
          )
      else:
          if self.__training_mode:
              print(
                  "Pre-trained Model not provided. Transfer learning not in use."
              )
              print("Training will start with 3 warmup experiments")
  
      if len(multi_gpu) > 1:
          train_model = multi_gpu_model(template_model, gpus=multi_gpu)
      else:
          train_model = template_model
  
      optimizer = Adam(lr=lr, clipnorm=0.001)
      train_model.compile(loss=dummy_loss, optimizer=optimizer)
  
      return train_model, infer_model
  
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 10 for calling the DetectionModelTrainer obj's underlying member method code with example usage: obj._create_model(nb_class, anchors, max_box_per_image, max_grid, batch_size, warmup_batches, ignore_thresh, multi_gpu, lr, grid_scales, obj_scale, noobj_scale, xywh_scale, class_scale) and returns: train_model,  infer_model