|
- """
- # -*- coding: utf-8 -*-
- -----------------------------------------------------------------------------------
- # Author: Nguyen Mau Dung
- # DoC: 2020.08.17
- # email: nguyenmaudung93.kstn@gmail.com
- -----------------------------------------------------------------------------------
- # Description: Demonstration utils script
- """
-
- import argparse
- import sys
- import os
- import warnings
- import zipfile
-
- warnings.filterwarnings("ignore", category=UserWarning)
-
- from easydict import EasyDict as edict
- import numpy as np
- import wget
- import torch
- import cv2
-
- src_dir = os.path.dirname(os.path.realpath(__file__))
- # while not src_dir.endswith("sfa"):
- # src_dir = os.path.dirname(src_dir)
- if src_dir not in sys.path:
- sys.path.append(src_dir)
-
- from utils.misc import make_folder, time_synchronized
- from utils.evaluation_utils import decode, post_processing
- from utils.torch_utils import _sigmoid
-
-
- def parse_demo_configs():
- parser = argparse.ArgumentParser(description='Demonstration config for the implementation')
- parser.add_argument('--saved_fn', type=str, default='fpn_resnet_18', metavar='FN',
- help='The name using for saving logs, models,...')
- parser.add_argument('-a', '--arch', type=str, default='fpn_resnet_18', metavar='ARCH',
- help='The name of the model architecture')
- parser.add_argument('--pretrained_path', type=str,
- default='../checkpoints/fpn_resnet_18/fpn_resnet_18_epoch_300.pth', metavar='PATH',
- help='the path of the pretrained checkpoint')
- parser.add_argument('--foldername', type=str, default='2011_09_26_drive_0014_sync', metavar='FN',
- help='Folder name for demostration dataset')
- parser.add_argument('--K', type=int, default=50,
- help='the number of top K')
- parser.add_argument('--no_cuda', action='store_true',
- help='If true, cuda is not used.')
- parser.add_argument('--gpu_idx', default=0, type=int,
- help='GPU index to use.')
- parser.add_argument('--peak_thresh', type=float, default=0.2)
- parser.add_argument('--output_format', type=str, default='image', metavar='PATH',
- help='the type of the test output (support image or video)')
- parser.add_argument('--output-width', type=int, default=608,
- help='the width of showing output, the height maybe vary')
-
- configs = edict(vars(parser.parse_args()))
- configs.pin_memory = True
- configs.distributed = False # For testing on 1 GPU only
-
- configs.input_size = (608, 608)
- configs.hm_size = (152, 152)
- configs.down_ratio = 4
- configs.max_objects = 50
-
- configs.imagenet_pretrained = False
- configs.head_conv = 64
- configs.num_classes = 3
- configs.num_center_offset = 2
- configs.num_z = 1
- configs.num_dim = 3
- configs.num_direction = 2 # sin, cos
-
- configs.heads = {
- 'hm_cen': configs.num_classes,
- 'cen_offset': configs.num_center_offset,
- 'direction': configs.num_direction,
- 'z_coor': configs.num_z,
- 'dim': configs.num_dim
- }
-
- ####################################################################
- ##############Dataset, Checkpoints, and results dir configs#########
- ####################################################################
- configs.root_dir = '../'
- configs.dataset_dir = os.path.join(configs.root_dir, 'dataset', 'kitti', 'demo')
- configs.calib_path = os.path.join(configs.root_dir, 'dataset', 'kitti', 'demo', 'calib.txt')
- configs.results_dir = os.path.join(configs.root_dir, 'results', configs.saved_fn)
- make_folder(configs.results_dir)
-
- return configs
-
-
- def download_and_unzip(demo_dataset_dir, download_url):
- filename = download_url.split('/')[-1]
- filepath = os.path.join(demo_dataset_dir, filename)
- if os.path.isfile(filepath):
- print('The dataset have been downloaded')
- return
- print('\nDownloading data for demonstration...')
- wget.download(download_url, filepath)
- print('\nUnzipping the downloaded data...')
- with zipfile.ZipFile(filepath, "r") as zip_ref:
- zip_ref.extractall(os.path.join(demo_dataset_dir, filename[:-4]))
-
-
- def do_detect(configs, model, bevmap, is_front):
- if not is_front:
- bevmap = torch.flip(bevmap, [1, 2])
-
- input_bev_maps = bevmap.unsqueeze(0).to(configs.device, non_blocking=True).float()
- t1 = time_synchronized()
- outputs = model(input_bev_maps)
- outputs['hm_cen'] = _sigmoid(outputs['hm_cen'])
- outputs['cen_offset'] = _sigmoid(outputs['cen_offset'])
- # detections size (batch_size, K, 10)
- detections = decode(outputs['hm_cen'], outputs['cen_offset'], outputs['direction'], outputs['z_coor'],
- outputs['dim'], K=configs.K)
- detections = detections.cpu().numpy().astype(np.float32)
- detections = post_processing(detections, configs.num_classes, configs.down_ratio, configs.peak_thresh)
- t2 = time_synchronized()
- # Inference speed
- fps = 1 / (t2 - t1)
-
- return detections[0], bevmap, fps
-
-
- def write_credit(img, org_author=(500, 400), text_author='github.com/maudzung', org_fps=(50, 1000), fps=None):
- font = cv2.FONT_HERSHEY_SIMPLEX
- fontScale = 1
- color = (255, 255, 255)
- thickness = 2
-
- cv2.putText(img, text_author, org_author, font, fontScale, color, thickness, cv2.LINE_AA)
- cv2.putText(img, 'Speed: {:.1f} FPS'.format(fps), org_fps, font, fontScale, color, thickness, cv2.LINE_AA)
|