# Test Results Submission ## Panoptic segmentation test results submission The following sections introduce how to produce the prediction results of panoptic segmentation models on the COCO test-dev set and submit the predictions to [COCO evaluation server](https://competitions.codalab.org/competitions/19507). ### Prerequisites - Download [COCO test dataset images](http://images.cocodataset.org/zips/test2017.zip), [testing image info](http://images.cocodataset.org/annotations/image_info_test2017.zip), and [panoptic train/val annotations](http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip), then unzip them, put 'test2017' to `data/coco/`, put json files and annotation files to `data/coco/annotations/`. ```shell # suppose data/coco/ does not exist mkdir -pv data/coco/ # download test2017 wget -P data/coco/ http://images.cocodataset.org/zips/test2017.zip wget -P data/coco/ http://images.cocodataset.org/annotations/image_info_test2017.zip wget -P data/coco/ http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip # unzip them unzip data/coco/test2017.zip -d data/coco/ unzip data/coco/image_info_test2017.zip -d data/coco/ unzip data/coco/panoptic_annotations_trainval2017.zip -d data/coco/ # remove zip files (optional) rm -rf data/coco/test2017.zip data/coco/image_info_test2017.zip data/coco/panoptic_annotations_trainval2017.zip ``` - Run the following code to update category information in testing image info. Since the attribute `isthing` is missing in category information of 'image_info_test-dev2017.json', we need to update it with the category information in 'panoptic_val2017.json'. ```shell python tools/misc/gen_coco_panoptic_test_info.py data/coco/annotations ``` After completing the above preparations, your directory structure of `data` should be like this: ```text data `-- coco |-- annotations | |-- image_info_test-dev2017.json | |-- image_info_test2017.json | |-- panoptic_image_info_test-dev2017.json | |-- panoptic_train2017.json | |-- panoptic_train2017.zip | |-- panoptic_val2017.json | `-- panoptic_val2017.zip `-- test2017 ``` ### Inference on coco test-dev To do inference on coco test-dev, we should update the setting of `test_dataloder` and `test_evaluator` first. There two ways to do this: 1. update them in config file; 2. update them in command line. #### Update them in config file The relevant settings are provided at the end of `configs/_base_/datasets/coco_panoptic.py`, as below. ```python test_dataloader = dict( batch_size=1, num_workers=1, persistent_workers=True, drop_last=False, sampler=dict(type='DefaultSampler', shuffle=False), dataset=dict( type=dataset_type, data_root=data_root, ann_file='annotations/panoptic_image_info_test-dev2017.json', data_prefix=dict(img='test2017/'), test_mode=True, pipeline=test_pipeline)) test_evaluator = dict( type='CocoPanopticMetric', format_only=True, ann_file=data_root + 'annotations/panoptic_image_info_test-dev2017.json', outfile_prefix='./work_dirs/coco_panoptic/test') ``` Any of the following way can be used to update the setting for inference on coco test-dev set. Case 1: Directly uncomment the setting in `configs/_base_/datasets/coco_panoptic.py`. Case 2: Copy the following setting to the config file you used now. ```python test_dataloader = dict( dataset=dict( ann_file='annotations/panoptic_image_info_test-dev2017.json', data_prefix=dict(img='test2017/', _delete_=True))) test_evaluator = dict( format_only=True, ann_file=data_root + 'annotations/panoptic_image_info_test-dev2017.json', outfile_prefix='./work_dirs/coco_panoptic/test') ``` Then infer on coco test-dev et by the following command. ```shell python tools/test.py \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE} ``` #### Update them in command line The command for update of the related settings and inference on coco test-dev are as below. ```shell # test with single gpu CUDA_VISIBLE_DEVICES=0 python tools/test.py \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE} \ --cfg-options \ test_dataloader.dataset.ann_file=annotations/panoptic_image_info_test-dev2017.json \ test_dataloader.dataset.data_prefix.img=test2017 \ test_dataloader.dataset.data_prefix._delete_=True \ test_evaluator.format_only=True \ test_evaluator.ann_file=data/coco/annotations/panoptic_image_info_test-dev2017.json \ test_evaluator.outfile_prefix=${WORK_DIR}/results # test with four gpus CUDA_VISIBLE_DEVICES=0,1,3,4 bash tools/dist_test.sh \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE} \ 8 \ # eights gpus --cfg-options \ test_dataloader.dataset.ann_file=annotations/panoptic_image_info_test-dev2017.json \ test_dataloader.dataset.data_prefix.img=test2017 \ test_dataloader.dataset.data_prefix._delete_=True \ test_evaluator.format_only=True \ test_evaluator.ann_file=data/coco/annotations/panoptic_image_info_test-dev2017.json \ test_evaluator.outfile_prefix=${WORK_DIR}/results # test with slurm GPUS=8 tools/slurm_test.sh \ ${Partition} \ ${JOB_NAME} \ ${CONFIG_FILE} \ ${CHECKPOINT_FILE} \ --cfg-options \ test_dataloader.dataset.ann_file=annotations/panoptic_image_info_test-dev2017.json \ test_dataloader.dataset.data_prefix.img=test2017 \ test_dataloader.dataset.data_prefix._delete_=True \ test_evaluator.format_only=True \ test_evaluator.ann_file=data/coco/annotations/panoptic_image_info_test-dev2017.json \ test_evaluator.outfile_prefix=${WORK_DIR}/results ``` Example Suppose we perform inference on `test2017` using pretrained MaskFormer with ResNet-50 backbone. ```shell # test with single gpu CUDA_VISIBLE_DEVICES=0 python tools/test.py \ configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py \ checkpoints/maskformer_r50_mstrain_16x1_75e_coco_20220221_141956-bc2699cb.pth \ --cfg-options \ test_dataloader.dataset.ann_file=annotations/panoptic_image_info_test-dev2017.json \ test_dataloader.dataset.data_prefix.img=test2017 \ test_dataloader.dataset.data_prefix._delete_=True \ test_evaluator.format_only=True \ test_evaluator.ann_file=data/coco/annotations/panoptic_image_info_test-dev2017.json \ test_evaluator.outfile_prefix=work_dirs/maskformer/results ``` ### Rename files and zip results After inference, the panoptic segmentation results (a json file and a directory where the masks are stored) will be in `WORK_DIR`. We should rename them according to the naming convention described on [COCO's Website](https://cocodataset.org/#upload). Finally, we need to compress the json and the directory where the masks are stored into a zip file, and rename the zip file according to the naming convention. Note that the zip file should **directly** contains the above two files. The commands to rename files and zip results: ```shell # In WORK_DIR, we have panoptic segmentation results: 'panoptic' and 'results.panoptic.json'. cd ${WORK_DIR} # replace '[algorithm_name]' with the name of algorithm you used. mv ./panoptic ./panoptic_test-dev2017_[algorithm_name]_results mv ./results.panoptic.json ./panoptic_test-dev2017_[algorithm_name]_results.json zip panoptic_test-dev2017_[algorithm_name]_results.zip -ur panoptic_test-dev2017_[algorithm_name]_results panoptic_test-dev2017_[algorithm_name]_results.json ```