mirror of
https://github.com/open-mmlab/mmengine.git
synced 2025-06-03 21:54:44 +08:00
[Enchance] remove redundant attributes in BaseDataElement (#690)
* remove redundant attribute in dump or print * optimize efficiency Co-authored-by: HAOCHENYE <21724054@zju.edu.cn>
This commit is contained in:
parent
ded73f3a56
commit
5f58517069
@ -1,5 +1,6 @@
|
|||||||
# Copyright (c) OpenMMLab. All rights reserved.
|
# Copyright (c) OpenMMLab. All rights reserved.
|
||||||
import copy
|
import copy
|
||||||
|
import sys
|
||||||
from typing import Any, Iterator, Optional, Tuple, Type, Union
|
from typing import Any, Iterator, Optional, Tuple, Type, Union
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
@ -458,7 +459,12 @@ class BaseDataElement:
|
|||||||
raise AttributeError(
|
raise AttributeError(
|
||||||
f'Cannot set {name} to be a field of data '
|
f'Cannot set {name} to be a field of data '
|
||||||
f'because {name} is already a metainfo field')
|
f'because {name} is already a metainfo field')
|
||||||
self._data_fields.add(name)
|
# The name only added to `data_fields`` when it is not the
|
||||||
|
# attribute related to property(methods decorated by @property).
|
||||||
|
if not isinstance(
|
||||||
|
getattr(type(self),
|
||||||
|
sys._getframe(1).f_code.co_name, None), property):
|
||||||
|
self._data_fields.add(name)
|
||||||
super().__setattr__(name, value)
|
super().__setattr__(name, value)
|
||||||
|
|
||||||
# Tensor-like methods
|
# Tensor-like methods
|
||||||
|
@ -9,6 +9,47 @@ import torch
|
|||||||
from mmengine.structures import BaseDataElement
|
from mmengine.structures import BaseDataElement
|
||||||
|
|
||||||
|
|
||||||
|
class DetDataSample(BaseDataElement):
|
||||||
|
|
||||||
|
@property
|
||||||
|
def proposals(self):
|
||||||
|
return self._proposals
|
||||||
|
|
||||||
|
@proposals.setter
|
||||||
|
def proposals(self, value):
|
||||||
|
self.set_field(value=value, name='_proposals', dtype=BaseDataElement)
|
||||||
|
|
||||||
|
@proposals.deleter
|
||||||
|
def proposals(self):
|
||||||
|
del self._proposals
|
||||||
|
|
||||||
|
@property
|
||||||
|
def gt_instances(self):
|
||||||
|
return self._gt_instances
|
||||||
|
|
||||||
|
@gt_instances.setter
|
||||||
|
def gt_instances(self, value):
|
||||||
|
self.set_field(
|
||||||
|
value=value, name='_gt_instances', dtype=BaseDataElement)
|
||||||
|
|
||||||
|
@gt_instances.deleter
|
||||||
|
def gt_instances(self):
|
||||||
|
del self._gt_instances
|
||||||
|
|
||||||
|
@property
|
||||||
|
def pred_instances(self):
|
||||||
|
return self._pred_instances
|
||||||
|
|
||||||
|
@pred_instances.setter
|
||||||
|
def pred_instances(self, value):
|
||||||
|
self.set_field(
|
||||||
|
value=value, name='_pred_instances', dtype=BaseDataElement)
|
||||||
|
|
||||||
|
@pred_instances.deleter
|
||||||
|
def pred_instances(self):
|
||||||
|
del self._pred_instances
|
||||||
|
|
||||||
|
|
||||||
class TestBaseDataElement(TestCase):
|
class TestBaseDataElement(TestCase):
|
||||||
|
|
||||||
def setup_data(self):
|
def setup_data(self):
|
||||||
@ -331,47 +372,6 @@ class TestBaseDataElement(TestCase):
|
|||||||
|
|
||||||
def test_inheritance(self):
|
def test_inheritance(self):
|
||||||
|
|
||||||
class DetDataSample(BaseDataElement):
|
|
||||||
|
|
||||||
@property
|
|
||||||
def proposals(self):
|
|
||||||
return self._proposals
|
|
||||||
|
|
||||||
@proposals.setter
|
|
||||||
def proposals(self, value):
|
|
||||||
self.set_field(
|
|
||||||
value=value, name='_proposals', dtype=BaseDataElement)
|
|
||||||
|
|
||||||
@proposals.deleter
|
|
||||||
def proposals(self):
|
|
||||||
del self._proposals
|
|
||||||
|
|
||||||
@property
|
|
||||||
def gt_instances(self):
|
|
||||||
return self._gt_instances
|
|
||||||
|
|
||||||
@gt_instances.setter
|
|
||||||
def gt_instances(self, value):
|
|
||||||
self.set_field(
|
|
||||||
value=value, name='_gt_instances', dtype=BaseDataElement)
|
|
||||||
|
|
||||||
@gt_instances.deleter
|
|
||||||
def gt_instances(self):
|
|
||||||
del self._gt_instances
|
|
||||||
|
|
||||||
@property
|
|
||||||
def pred_instances(self):
|
|
||||||
return self._pred_instances
|
|
||||||
|
|
||||||
@pred_instances.setter
|
|
||||||
def pred_instances(self, value):
|
|
||||||
self.set_field(
|
|
||||||
value=value, name='_pred_instances', dtype=BaseDataElement)
|
|
||||||
|
|
||||||
@pred_instances.deleter
|
|
||||||
def pred_instances(self):
|
|
||||||
del self._pred_instances
|
|
||||||
|
|
||||||
det_sample = DetDataSample()
|
det_sample = DetDataSample()
|
||||||
|
|
||||||
# test set
|
# test set
|
||||||
@ -415,6 +415,11 @@ class TestBaseDataElement(TestCase):
|
|||||||
# test_keys
|
# test_keys
|
||||||
assert len(instances.keys()) == len(data.keys())
|
assert len(instances.keys()) == len(data.keys())
|
||||||
|
|
||||||
|
det_sample = DetDataSample()
|
||||||
|
proposals = BaseDataElement(bboxes=torch.rand((5, 4)))
|
||||||
|
det_sample.proposals = proposals
|
||||||
|
assert '_proposals' not in det_sample.keys()
|
||||||
|
|
||||||
def test_items(self):
|
def test_items(self):
|
||||||
# test_metainfo_items
|
# test_metainfo_items
|
||||||
metainfo, data = self.setup_data()
|
metainfo, data = self.setup_data()
|
||||||
@ -441,6 +446,13 @@ class TestBaseDataElement(TestCase):
|
|||||||
assert isinstance(dict_instances['gt_instances'], dict)
|
assert isinstance(dict_instances['gt_instances'], dict)
|
||||||
assert isinstance(dict_instances['pred_instances'], dict)
|
assert isinstance(dict_instances['pred_instances'], dict)
|
||||||
|
|
||||||
|
det_sample = DetDataSample()
|
||||||
|
proposals = BaseDataElement(bboxes=torch.rand((5, 4)))
|
||||||
|
det_sample.proposals = proposals
|
||||||
|
dict_sample = det_sample.to_dict()
|
||||||
|
assert '_proposals' not in dict_sample
|
||||||
|
assert 'proposals' in dict_sample
|
||||||
|
|
||||||
def test_metainfo(self):
|
def test_metainfo(self):
|
||||||
# test metainfo property
|
# test metainfo property
|
||||||
metainfo, data = self.setup_data()
|
metainfo, data = self.setup_data()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user