| | from mmdet.datasets import RefCocoDataset |
| |
|
| | from mmdet.datasets.transforms import LoadAnnotations |
| | from mmdet.evaluation import RefSegMetric |
| | import argparse |
| | from mmengine.config import Config |
| | from xtuner.model.utils import guess_load_checkpoint |
| | from xtuner.registry import BUILDER |
| | from xtuner.utils.constants import DEFAULT_IMAGE_TOKEN |
| | from accelerate import Accelerator |
| | from accelerate.utils import gather_object |
| | from mmdet.structures.mask import BitmapMasks |
| |
|
| | from tqdm import tqdm |
| | import torch |
| | import torch.nn.functional as F |
| | from time import time |
| |
|
| | from projects.f_llm.datasets.transforms import PILLoadImageFromFile, RefCOCO2PNG |
| |
|
| | if __name__ == '__main__': |
| | parser = argparse.ArgumentParser( |
| | formatter_class=argparse.RawTextHelpFormatter) |
| | parser.add_argument('config', help='config file path.') |
| | parser.add_argument('--checkpoint', default=None, type=str) |
| | parser.add_argument('--debug', action='store_true') |
| | parser.add_argument('--ceph', action='store_true') |
| | parser.add_argument('--concat', action='store_true') |
| | args = parser.parse_args() |
| |
|
| | |
| | accelerator = Accelerator() |
| | |
| | message = [f"Hello this is GPU {accelerator.process_index}"] |
| | |
| | messages = gather_object(message) |
| | |
| | accelerator.print(messages) |
| |
|
| | cfg = Config.fromfile(args.config) |
| | prompt_template = cfg.prompt_template |
| | tokenizer = cfg.tokenizer |
| | image_processor = cfg.image_processor |
| | prompt = cfg.get('prompt', None) |
| | model = BUILDER.build(cfg.model) |
| |
|
| | if args.checkpoint is not None: |
| | state_dict = guess_load_checkpoint(args.checkpoint) |
| | missing, unexpected = model.load_state_dict(state_dict, strict=False) |
| | accelerator.print(f"Unexpected parameters: {unexpected}") |
| |
|
| | print(f"Start moving model to device: {accelerator.device}", flush=True) |
| | tik = time() |
| | model = model.to(device=accelerator.device) |
| | print( |
| | f"Finished moving model to device: {accelerator.device}, time used: {time() - tik}", flush=True) |
| | model.eval() |
| |
|
| | if args.ceph: |
| | backend_args = dict( |
| | backend='petrel', |
| | path_mapping=dict({ |
| | 'data/coco/train2014/': 'openmmlab:s3://openmmlab/datasets/detection/coco/train2014/' |
| | })) |
| | else: |
| | backend_args = None |
| |
|
| | refcoco2png_params = dict( |
| | type=RefCOCO2PNG, |
| | image_processor=image_processor, |
| | tokenizer=tokenizer, |
| | prompt_template=prompt_template, |
| | concat=args.concat, |
| | image2tensor=cfg.get('image2tensor', True), |
| | add_image_token=cfg.get('add_image_token', False), |
| | image_token=cfg.get('image_token', DEFAULT_IMAGE_TOKEN) |
| | ) |
| | accelerator.print(f"Do concatenation? {args.concat}") |
| | if prompt is not None: |
| | refcoco2png_params.update(prompt=prompt) |
| |
|
| | |
| | test_pipeline = [ |
| | dict(type=PILLoadImageFromFile, backend_args=backend_args), |
| | dict( |
| | type=LoadAnnotations, |
| | with_mask=True, |
| | with_bbox=False, |
| | with_seg=False, |
| | with_label=False), |
| | refcoco2png_params |
| | ] |
| |
|
| | refcoco_subsets = dict() |
| | for split in ['val', 'testA', 'testB']: |
| | refcoco_subsets[f'refcoco_{split}'] = dict( |
| | ann_file='refcoco/instances.json', |
| | split_file='refcoco/refs(unc).p', |
| | split=split) |
| |
|
| | for split in ['val', 'testA', 'testB']: |
| | refcoco_subsets[f'refcoco+_{split}'] = dict( |
| | ann_file='refcoco+/instances.json', |
| | split_file='refcoco+/refs(unc).p', |
| | split=split) |
| |
|
| | for split in ['val', 'test']: |
| | refcoco_subsets[f'refcocog_{split}'] = dict( |
| | ann_file='refcocog/instances.json', |
| | split_file='refcocog/refs(umd).p', |
| | split=split) |
| |
|
| | for name, subset in refcoco_subsets.items(): |
| | accelerator.print(f"Start evaluating {name}") |
| | dataset = RefCocoDataset( |
| | data_root='data/coco/', |
| | data_prefix=dict(img_path='train2014/'), |
| | text_mode='select_first', |
| | pipeline=test_pipeline, |
| | **subset |
| | ) |
| | |
| | accelerator.wait_for_everyone() |
| |
|
| | data_ids = list(range(len(dataset))) |
| | if args.debug: |
| | data_ids = data_ids[:100] |
| |
|
| | results = [] |
| | |
| | with accelerator.split_between_processes(data_ids) as sub_ids: |
| | for idx in tqdm(sub_ids, disable=not accelerator.is_main_process): |
| | data_sample = dataset[idx] |
| | if args.concat: |
| | with torch.no_grad(): |
| | pred_mask_logits = model.predict(data_sample) |
| |
|
| | gt_masks = data_sample['gt_masks'].numpy() > 0 |
| | pred_masks = F.interpolate(pred_mask_logits[None].float().sigmoid(), |
| | size=gt_masks.shape[-2:], mode='bilinear')[0].cpu() |
| | pred_masks = pred_masks > 0.5 |
| |
|
| | assert len(pred_masks) == len(gt_masks) |
| | mask_cnt = pred_masks.shape[0] |
| |
|
| | |
| | results.append(dict(pred_instances=dict(masks=pred_masks), |
| | gt_masks=BitmapMasks(masks=gt_masks, |
| | height=gt_masks.shape[1], |
| | width=gt_masks.shape[2])) |
| | ) |
| | else: |
| | for sub_data_sample in data_sample: |
| | with torch.no_grad(): |
| | pred_mask_logits = model.predict(sub_data_sample) |
| |
|
| | gt_masks = sub_data_sample['gt_masks'].numpy() > 0 |
| | pred_masks = F.interpolate(pred_mask_logits[None].float().sigmoid(), |
| | size=gt_masks.shape[-2:], mode='bilinear')[0].cpu() |
| | pred_masks = pred_masks > 0.5 |
| |
|
| | assert len(pred_masks) == len(gt_masks) |
| | mask_cnt = pred_masks.shape[0] |
| | assert mask_cnt == 1 |
| |
|
| | |
| | results.append(dict(pred_instances=dict(masks=pred_masks), |
| | gt_masks=BitmapMasks(masks=gt_masks, |
| | height=gt_masks.shape[1], |
| | width=gt_masks.shape[2])) |
| | ) |
| | results = gather_object(results) |
| | if accelerator.is_main_process: |
| | accelerator.print( |
| | f"Collected {len(results)} result samples from all gpus") |
| | evaluator = RefSegMetric(metric=['cIoU', 'mIoU']) |
| | evaluator.process(data_batch=dict(), data_samples=results) |
| | metrics = evaluator.compute_metrics(evaluator.results) |
| | accelerator.print(f"Evaluation results on {name}: {metrics}") |
| | accelerator.print(f"Finished evaluating {name}") |
| |
|