[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:
liukuikun 2022-11-24 21:36:19 +08:00 committed by GitHub
parent ded73f3a56
commit 5f58517069
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 60 additions and 42 deletions

View File

@ -1,5 +1,6 @@
# Copyright (c) OpenMMLab. All rights reserved.
import copy
import sys
from typing import Any, Iterator, Optional, Tuple, Type, Union
import numpy as np
@ -458,7 +459,12 @@ class BaseDataElement:
raise AttributeError(
f'Cannot set {name} to be a field of data '
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)
# Tensor-like methods

View File

@ -9,6 +9,47 @@ import torch
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):
def setup_data(self):
@ -331,47 +372,6 @@ class TestBaseDataElement(TestCase):
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()
# test set
@ -415,6 +415,11 @@ class TestBaseDataElement(TestCase):
# test_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):
# test_metainfo_items
metainfo, data = self.setup_data()
@ -441,6 +446,13 @@ class TestBaseDataElement(TestCase):
assert isinstance(dict_instances['gt_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):
# test metainfo property
metainfo, data = self.setup_data()