mirror of
https://github.com/open-mmlab/mmsegmentation.git
synced 2025-06-03 22:03:48 +08:00
## Motivation 1. It is used to save the segmentation predictions as files and upload these files to a test server ## Modification 1. Add output_file and format only in `IoUMetric` ## BC-breaking (Optional) No ## Use cases (Optional) If this PR introduces a new feature, it is better to list some use cases here, and update the documentation. ## Checklist 1. Pre-commit or other linting tools are used to fix the potential lint issues. 3. The modification is covered by complete unit tests. If not, please add more unit test to ensure the correctness. 4. If the modification has potential influence on downstream projects, this PR should be tested with downstream projects, like MMDet or MMDet3D. 5. The documentation has been modified accordingly, like docstring or example tutorials.
105 lines
3.7 KiB
Python
105 lines
3.7 KiB
Python
# Copyright (c) OpenMMLab. All rights reserved.
|
|
import os.path as osp
|
|
import shutil
|
|
from unittest import TestCase
|
|
|
|
import numpy as np
|
|
import torch
|
|
from mmengine.structures import PixelData
|
|
|
|
from mmseg.evaluation import IoUMetric
|
|
from mmseg.structures import SegDataSample
|
|
|
|
|
|
class TestIoUMetric(TestCase):
|
|
|
|
def _demo_mm_inputs(self,
|
|
batch_size=2,
|
|
image_shapes=(3, 64, 64),
|
|
num_classes=5):
|
|
"""Create a superset of inputs needed to run test or train batches.
|
|
|
|
Args:
|
|
batch_size (int): batch size. Default to 2.
|
|
image_shapes (List[tuple], Optional): image shape.
|
|
Default to (3, 64, 64)
|
|
num_classes (int): number of different classes.
|
|
Default to 5.
|
|
"""
|
|
if isinstance(image_shapes, list):
|
|
assert len(image_shapes) == batch_size
|
|
else:
|
|
image_shapes = [image_shapes] * batch_size
|
|
|
|
data_samples = []
|
|
for idx in range(batch_size):
|
|
image_shape = image_shapes[idx]
|
|
_, h, w = image_shape
|
|
|
|
data_sample = SegDataSample()
|
|
gt_semantic_seg = np.random.randint(
|
|
0, num_classes, (1, h, w), dtype=np.uint8)
|
|
gt_semantic_seg = torch.LongTensor(gt_semantic_seg)
|
|
gt_sem_seg_data = dict(data=gt_semantic_seg)
|
|
data_sample.gt_sem_seg = PixelData(**gt_sem_seg_data)
|
|
|
|
data_samples.append(data_sample.to_dict())
|
|
|
|
return data_samples
|
|
|
|
def _demo_mm_model_output(self,
|
|
data_samples,
|
|
batch_size=2,
|
|
image_shapes=(3, 64, 64),
|
|
num_classes=5):
|
|
|
|
_, h, w = image_shapes
|
|
|
|
for data_sample in data_samples:
|
|
data_sample['seg_logits'] = dict(
|
|
data=torch.randn(num_classes, h, w))
|
|
data_sample['pred_sem_seg'] = dict(
|
|
data=torch.randint(0, num_classes, (1, h, w)))
|
|
data_sample[
|
|
'img_path'] = 'tests/data/pseudo_dataset/imgs/00000_img.jpg'
|
|
return data_samples
|
|
|
|
def test_evaluate(self):
|
|
"""Test using the metric in the same way as Evalutor."""
|
|
|
|
data_samples = self._demo_mm_inputs()
|
|
data_samples = self._demo_mm_model_output(data_samples)
|
|
|
|
iou_metric = IoUMetric(iou_metrics=['mIoU'])
|
|
iou_metric.dataset_meta = dict(
|
|
classes=['wall', 'building', 'sky', 'floor', 'tree'],
|
|
label_map=dict(),
|
|
reduce_zero_label=False)
|
|
iou_metric.process([0] * len(data_samples), data_samples)
|
|
res = iou_metric.evaluate(2)
|
|
self.assertIsInstance(res, dict)
|
|
|
|
# test save segment file in output_dir
|
|
iou_metric = IoUMetric(iou_metrics=['mIoU'], output_dir='tmp')
|
|
iou_metric.dataset_meta = dict(
|
|
classes=['wall', 'building', 'sky', 'floor', 'tree'],
|
|
label_map=dict(),
|
|
reduce_zero_label=False)
|
|
iou_metric.process([0] * len(data_samples), data_samples)
|
|
assert osp.exists('tmp')
|
|
assert osp.isfile('tmp/00000_img.png')
|
|
shutil.rmtree('tmp')
|
|
|
|
# test format_only
|
|
iou_metric = IoUMetric(
|
|
iou_metrics=['mIoU'], output_dir='tmp', format_only=True)
|
|
iou_metric.dataset_meta = dict(
|
|
classes=['wall', 'building', 'sky', 'floor', 'tree'],
|
|
label_map=dict(),
|
|
reduce_zero_label=False)
|
|
iou_metric.process([0] * len(data_samples), data_samples)
|
|
assert iou_metric.results == []
|
|
assert osp.exists('tmp')
|
|
assert osp.isfile('tmp/00000_img.png')
|
|
shutil.rmtree('tmp')
|