text: import argparse
  import torch
  import os
  
  from perspective_transform.util import util
  
  
  class ArgumentsBase(object):
      def __init__(self):
          self.name = argparse.Namespace()
          self.parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
          self.initialized = False
          self.current_path = os.path.join(os.getcwd(), 'perspective_transform')
          self.base_path = os.getcwd() 
          self.isTrain = False
  
      def main_args_initialization(self):
          self.parser.add_argument('--yolov5-model', type=str,
                              default='weights/yolov5s.pt', help='yolov5 model path')
          self.parser.add_argument("--deepsort-config", type=str,
                              default="deep_sort_pytorch/configs/deep_sort.yaml")
          self.parser.add_argument('--source', type=str,
                              default='inference/input/test.mp4', help='source')
          self.parser.add_argument('--output', type=str, default='inference/output',
                              help='output folder') 
          self.parser.add_argument('--conf-thresh', type=float,
                              default=0.5, help='object confidence threshold')
          self.parser.add_argument('--iou-thresh', type=float,
                              default=0.5, help='IOU threshold for NMS')
          self.parser.add_argument('--view', action='store_true',
                              help='display results')
          self.parser.add_argument('--save', action='store_true',
                              help='display results')
          self.parser.add_argument('--outputfps', type = int, default = 20, 
                              help='Output Video FPS')
  
  
      ### Perspective Transform Arguments
      def perspective_transform_initialization(self):
          self.parser.add_argument('--batchSize', type=int, default=1, help='input batch size')
          self.parser.add_argument('--loadSize', type=int, default=1024, help='scale images to this size')
          self.parser.add_argument('--fineSize', type=int, default=1024, help='then crop to this size')
          self.parser.add_argument('--input_nc', type=int, default=3, help='# of input image channels')
          self.parser.add_argument('--output_nc', type=int, default=1, help='# of output image channels')
          self.parser.add_argument('--ngf', type=int, default=64, help='# of gen filters in first conv layer')
          self.parser.add_argument('--ndf', type=int, default=64, help='# of discrim filters in first conv layer')
          self.parser.add_argument('--which_model_netD', type=str, default='basic', help='selects model to use for netD')
          self.parser.add_argument('--which_model_netG', type=str, default='unet_256', help='selects model to use for netG')
          self.parser.add_argument('--n_layers_D', type=int, default=3, help='only used if which_model_netD==n_layers')
          self.parser.add_argument('--gpu_ids', type=str, default='-1', help='gpu ids: e.g. 0  0,1,2, 0,2. use -1 for CPU')
          self.parser.add_argument('--dataset_mode', type=str, default='single', help='chooses how datasets are loaded. [unaligned | aligned | single]')
          self.parser.add_argument('--model', type=str, default='two_pix2pix',
                                   help='chooses which model to use. cycle_gan, pix2pix, test, ')
          self.parser.add_argument('--which_direction', type=str, default='AtoB', help='AtoB or BtoA')
          self.parser.add_argument('--nThreads', default=2, type=int, help='# threads for loading data')
          self.parser.add_argument('--checkpoints_dir', type=str, default=os.path.join(self.base_path, 'weights/pytorch-two-GAN-models/soccer_seg_detection_pix2pix'), help='models are saved here')
          self.parser.add_argument('--norm', type=str, default='batch', help='instance normalization or batch normalization')
          self.parser.add_argument('--serial_batches', action='store_true', help='if true, takes images in order to make batches, otherwise takes them randomly')
          self.parser.add_argument('--display_winsize', type=int, default=256, help='display window size')
          self.parser.add_argument('--display_id', type=int, default=1, help='window id of the web display')
          self.parser.add_argument('--display_port', type=int, default=8097, help='visdom port of the web display')
          self.parser.add_argument('--no_dropout', action='store_true', help='no dropout for the generator')
          self.parser.add_argument('--max_dataset_size', type=int, default=float("inf"),
                                   help='Maximum number of samples allowed per dataset. If the dataset directory contains more than max_dataset_size, only a subset is loaded.')
          self.parser.add_argument('--resize_or_crop', type=str, default='resize_and_crop', help='scaling and cropping of images at load time [resize_and_crop|crop|scale_width|scale_width_and_crop]')
          self.parser.add_argument('--no_flip', action='store_true', help='if specified, do not flip the images for data augmentation')
          self.parser.add_argument('--init_type', type=str, default='normal', help='network initialization [normal|xavier|kaiming|orthogonal]')
          self.parser.add_argument('--name', type=str, default=os.path.join(self.base_path, 'weights/pytorch-two-GAN-models/soccer_seg_detection_pix2pix'), help='name of the experiment. It decides where to store samples and models')
  
          # Test Options
          self.parser.add_argument('--ntest', type=int, default=float("inf"), help='# of test examples.')
          self.parser.add_argument('--aspect_ratio', type=float, default=1.0, help='aspect ratio of result images')
          self.parser.add_argument('--phase', type=str, default='test', help='train, val, test, etc')
          self.parser.add_argument('--which_epoch', type=str, default='latest', help='which epoch to load? set to latest to use latest cached model')
          self.parser.add_argument('--how_many', type=int, default=1, help='how many test images to run')
  
          self.initialized = True
  
      def _parse(self):
          self.opt = self.parser.parse_args()
          self.opt.isTrain = self.isTrain   # train or test
  
          str_ids = self.opt.gpu_ids.split(',')
          self.opt.gpu_ids = []
          for str_id in str_ids:
              id = int(str_id)
              if id >= 0:
                  self.opt.gpu_ids.append(id)
  
          # set gpu ids
          if len(self.opt.gpu_ids) > 0:
              torch.cuda.set_device(self.opt.gpu_ids[0])
  
          return self.opt
  
  
  class Arguments(ArgumentsBase):
      def __init__(self):
          super().__init__()
          self.main_args_initialization()
          self.perspective_transform_initialization()
  
      def parse(self):
          opt = self._parse()
  
          return opt
  
  