def __init__( self, cfg, confidence_threshold=0.7, show_mask_heatmaps=False, masks_per_dim=2, min_image_size=224, display_text = True, display_scores = True, ): self.cfg = cfg.clone() self.model = build_detection_model(cfg) self.model.eval() self.min_image_size = min_image_size save_dir = cfg.OUTPUT_DIR checkpointer = DetectronCheckpointer(cfg, self.model, save_dir=save_dir) _ = checkpointer.load(cfg.MODEL.WEIGHT) self.transforms = self.build_transform() mask_threshold = -1 if show_mask_heatmaps else 0.5 self.masker = Masker(threshold=mask_threshold, padding=1) # used to make colors for each class self.palette = jt.array([2 ** 25 - 1, 2 ** 15 - 1, 2 ** 21 - 1]) self.confidence_threshold = confidence_threshold self.show_mask_heatmaps = show_mask_heatmaps self.masks_per_dim = masks_per_dim self.display_score = display_scores self.display_text = display_text
def train(cfg, local_rank, distributed): model = build_detection_model(cfg) optimizer = make_optimizer(cfg, model) scheduler = make_lr_scheduler(cfg, optimizer) arguments = {} arguments["iteration"] = 0 output_dir = cfg.OUTPUT_DIR checkpointer = DetectronCheckpointer(cfg, model, optimizer, scheduler, output_dir) extra_checkpoint_data = checkpointer.load(cfg.MODEL.WEIGHT) arguments.update(extra_checkpoint_data) data_loader = make_data_loader( cfg, is_train=True, start_iter=arguments["iteration"], ) test_period = cfg.SOLVER.TEST_PERIOD if test_period > 0: data_loader_val = make_data_loader(cfg, is_train=False, is_distributed=distributed, is_for_period=True) else: data_loader_val = None checkpoint_period = cfg.SOLVER.CHECKPOINT_PERIOD do_train( cfg, model, data_loader, data_loader_val, optimizer, scheduler, checkpointer, checkpoint_period, test_period, arguments, ) return model
def run_inference(config_file): import jittor as jt from jittor_utils import auto_diff from detectron.config import cfg from detectron.modeling.detector import build_detection_model from detectron.utils.checkpoint import DetectronCheckpointer from detectron.data import make_data_loader from detectron.engine.inference import inference from detectron.utils.logger import setup_logger jt.flags.use_cuda = 1 jt.cudnn.set_algorithm_cache_size(0) cfg.merge_from_file(config_file) cfg.freeze() save_dir = "" logger = setup_logger("maskrcnn_benchmark", save_dir) model = build_detection_model(cfg) # hook = auto_diff.Hook('fasterrcnn') # hook.hook_module(model) output_dir = cfg.OUTPUT_DIR checkpointer = DetectronCheckpointer(cfg, model, save_dir=output_dir) _ = checkpointer.load(cfg.MODEL.WEIGHT) iou_types = ("bbox", ) if cfg.MODEL.MASK_ON: iou_types = iou_types + ("segm", ) if cfg.MODEL.KEYPOINT_ON: iou_types = iou_types + ("keypoints", ) dataset_names = cfg.DATASETS.TEST data_loaders_val = make_data_loader(cfg, is_train=False) for dataset_name, data_loader_val in zip(dataset_names, data_loaders_val): inference( model, data_loader_val, dataset_name=dataset_name, iou_types=iou_types, box_only=False if cfg.MODEL.FCOS_ON or cfg.MODEL.EMBED_MASK_ON or cfg.MODEL.RETINANET_ON else cfg.MODEL.RPN_ONLY, bbox_aug=cfg.TEST.BBOX_AUG.ENABLED, expected_results=cfg.TEST.EXPECTED_RESULTS, expected_results_sigma_tol=cfg.TEST.EXPECTED_RESULTS_SIGMA_TOL, cfg=cfg)
def run_torch_inference(config_file): import jittor as jt from jittor_utils import auto_diff from maskrcnn_benchmark.config import cfg from maskrcnn_benchmark.modeling.detector import build_detection_model from maskrcnn_benchmark.utils.checkpoint import DetectronCheckpointer from maskrcnn_benchmark.data import make_data_loader from maskrcnn_benchmark.engine.inference import inference from maskrcnn_benchmark.utils.logger import setup_logger cfg.merge_from_file(config_file) cfg.freeze() save_dir = "" model = build_detection_model(cfg) model = model.cuda() # hook = auto_diff.Hook('fasterrcnn') # hook.hook_module(model) output_dir = cfg.OUTPUT_DIR checkpointer = DetectronCheckpointer(cfg, model, save_dir=output_dir) _ = checkpointer.load(cfg.MODEL.WEIGHT) iou_types = ("bbox", ) if cfg.MODEL.MASK_ON: iou_types = iou_types + ("segm", ) dataset_names = cfg.DATASETS.TEST data_loaders_val = make_data_loader(cfg, is_train=False) for dataset_name, data_loader_val in zip(dataset_names, data_loaders_val): inference( model, data_loader_val, 'coco_2014_minival', iou_types=iou_types, box_only=cfg.MODEL.RPN_ONLY, expected_results=cfg.TEST.EXPECTED_RESULTS, expected_results_sigma_tol=cfg.TEST.EXPECTED_RESULTS_SIGMA_TOL, )
def run_model(config_file, img_f=None): original_image = load(img_f) from detectron.config import cfg from detectron.modeling.detector import build_detection_model from detectron.utils.checkpoint import DetectronCheckpointer from detectron.structures.image_list import to_image_list from detectron.modeling.roi_heads.mask_head.inference import Masker from jittor import transform as T from jittor import nn import jittor as jt from jittor_utils import auto_diff jt.flags.use_cuda = 1 confidence_threshold = 0.0 cfg.merge_from_file(config_file) model = build_detection_model(cfg) checkpointer = DetectronCheckpointer(cfg, model, save_dir=cfg.OUTPUT_DIR) _ = checkpointer.load(cfg.MODEL.WEIGHT) name = config_file.split('/')[-1].split('.')[0] # hook = auto_diff.Hook(name) # hook.hook_module(model) model.eval() class Resize(object): def __init__(self, min_size, max_size): self.min_size = min_size self.max_size = max_size # modified from torchvision to add support for max size def get_size(self, image_size): w, h = image_size size = self.min_size max_size = self.max_size if max_size is not None: min_original_size = float(min((w, h))) max_original_size = float(max((w, h))) if max_original_size / min_original_size * size > max_size: size = int( round(max_size * min_original_size / max_original_size)) if (w <= h and w == size) or (h <= w and h == size): return (h, w) if w < h: ow = size oh = int(size * h / w) else: oh = size ow = int(size * w / h) return (oh, ow) def __call__(self, image): size = self.get_size(image.size) image = T.resize(image, size) return image def build_transform(): if cfg.INPUT.TO_BGR255: to_bgr_transform = T.Lambda(lambda x: x * 255) else: to_bgr_transform = T.Lambda(lambda x: x[[2, 1, 0]]) normalize_transform = T.ImageNormalize(mean=cfg.INPUT.PIXEL_MEAN, std=cfg.INPUT.PIXEL_STD) min_size = cfg.INPUT.MIN_SIZE_TEST max_size = cfg.INPUT.MAX_SIZE_TEST transform = T.Compose([ T.ToPILImage(), Resize(min_size, max_size), T.ToTensor(), to_bgr_transform, normalize_transform, ]) return transform transforms = build_transform() image = transforms(original_image) image_list = to_image_list(image, cfg.DATALOADER.SIZE_DIVISIBILITY) predictions = model(image_list) predictions = predictions[0] if predictions.has_field("mask_scores"): scores = predictions.get_field("mask_scores") else: scores = predictions.get_field("scores") keep = jt.nonzero(scores > confidence_threshold).squeeze(1) predictions = predictions[keep] scores = predictions.get_field("scores") idx, _ = jt.argsort(scores, 0, descending=True) predictions = predictions[idx] result_diff(predictions)
def main(): jt.flags.use_cuda = 1 parent_path = os.path.abspath(__file__).split("/tools/")[0] parser = argparse.ArgumentParser(description="Object Detection Inference") parser.add_argument( "--config-file", default= f"{parent_path}/configs/maskrcnn_benchmark/e2e_mask_rcnn_R_50_FPN_1x.yaml", metavar="FILE", help="path to config file", ) parser.add_argument( "--ckpt", help= "The path to the checkpoint for test, default is the latest checkpoint.", default=None, ) parser.add_argument( "opts", help="Modify config options using the command-line", default=None, nargs=argparse.REMAINDER, ) args = parser.parse_args() cfg.merge_from_file(args.config_file) cfg.merge_from_list(args.opts) cfg.freeze() save_dir = "" logger = setup_logger("detectron", save_dir) logger.info("Using {} GPUs".format(1)) logger.info(cfg) logger.info("Collecting env info (might take some time)") logger.info("\n" + collect_env_info()) model = build_detection_model(cfg) output_dir = cfg.OUTPUT_DIR checkpointer = DetectronCheckpointer(cfg, model, save_dir=output_dir) ckpt = cfg.MODEL.WEIGHT if args.ckpt is None else args.ckpt _ = checkpointer.load(ckpt, use_latest=args.ckpt is None) iou_types = ("bbox", ) if cfg.MODEL.MASK_ON: iou_types = iou_types + ("segm", ) if cfg.MODEL.KEYPOINT_ON: iou_types = iou_types + ("keypoints", ) output_folders = [None] * len(cfg.DATASETS.TEST) dataset_names = cfg.DATASETS.TEST if cfg.OUTPUT_DIR: for idx, dataset_name in enumerate(dataset_names): output_folder = os.path.join(cfg.OUTPUT_DIR, "inference", dataset_name) mkdir(output_folder) output_folders[idx] = output_folder data_loaders_val = make_data_loader(cfg, is_train=False) for output_folder, dataset_name, data_loader_val in zip( output_folders, dataset_names, data_loaders_val): inference( model, data_loader_val, dataset_name=dataset_name, iou_types=iou_types, box_only=False if cfg.MODEL.RETINANET_ON else cfg.MODEL.RPN_ONLY, bbox_aug=cfg.TEST.BBOX_AUG.ENABLED, expected_results=cfg.TEST.EXPECTED_RESULTS, expected_results_sigma_tol=cfg.TEST.EXPECTED_RESULTS_SIGMA_TOL, output_folder=output_folder, )