From 0fcea45bc9fa57f6cd68cb38b82777594a1f4bd9 Mon Sep 17 00:00:00 2001 From: guigarfr Date: Tue, 31 Aug 2021 14:26:24 +0200 Subject: [PATCH] Allow XML dataset generalization (#5943) --- mmdet/datasets/xml_style.py | 23 +++++--- tests/data/custom_dataset/images/000001.jpg | Bin 0 -> 10198 bytes tests/data/custom_dataset/images/000001.xml | 44 +++++++++++++++ tests/data/custom_dataset/test.txt | 1 + tests/data/custom_dataset/trainval.txt | 1 + .../test_datasets/test_custom_dataset.py | 50 ++++++++++++++++++ 6 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 tests/data/custom_dataset/images/000001.jpg create mode 100644 tests/data/custom_dataset/images/000001.xml create mode 100644 tests/data/custom_dataset/test.txt create mode 100644 tests/data/custom_dataset/trainval.txt diff --git a/mmdet/datasets/xml_style.py b/mmdet/datasets/xml_style.py index 06237e0d8..039d5d7d0 100644 --- a/mmdet/datasets/xml_style.py +++ b/mmdet/datasets/xml_style.py @@ -18,11 +18,19 @@ class XMLDataset(CustomDataset): min_size (int | float, optional): The minimum size of bounding boxes in the images. If the size of a bounding box is less than ``min_size``, it would be add to ignored field. + img_subdir (str): Subdir where images are stored. Default: JPEGImages. + ann_subdir (str): Subdir where annotations are. Default: Annotations. """ - def __init__(self, min_size=None, **kwargs): + def __init__(self, + min_size=None, + img_subdir='JPEGImages', + ann_subdir='Annotations', + **kwargs): assert self.CLASSES or kwargs.get( 'classes', None), 'CLASSES in `XMLDataset` can not be None.' + self.img_subdir = img_subdir + self.ann_subdir = ann_subdir super(XMLDataset, self).__init__(**kwargs) self.cat2label = {cat: i for i, cat in enumerate(self.CLASSES)} self.min_size = min_size @@ -40,8 +48,8 @@ class XMLDataset(CustomDataset): data_infos = [] img_ids = mmcv.list_from_file(ann_file) for img_id in img_ids: - filename = f'JPEGImages/{img_id}.jpg' - xml_path = osp.join(self.img_prefix, 'Annotations', + filename = osp.join(self.img_subdir, f'{img_id}.jpg') + xml_path = osp.join(self.img_prefix, self.ann_subdir, f'{img_id}.xml') tree = ET.parse(xml_path) root = tree.getroot() @@ -50,8 +58,7 @@ class XMLDataset(CustomDataset): width = int(size.find('width').text) height = int(size.find('height').text) else: - img_path = osp.join(self.img_prefix, 'JPEGImages', - '{}.jpg'.format(img_id)) + img_path = osp.join(self.img_prefix, filename) img = Image.open(img_path) width, height = img.size data_infos.append( @@ -67,7 +74,7 @@ class XMLDataset(CustomDataset): continue if self.filter_empty_gt: img_id = img_info['id'] - xml_path = osp.join(self.img_prefix, 'Annotations', + xml_path = osp.join(self.img_prefix, self.ann_subdir, f'{img_id}.xml') tree = ET.parse(xml_path) root = tree.getroot() @@ -91,7 +98,7 @@ class XMLDataset(CustomDataset): """ img_id = self.data_infos[idx]['id'] - xml_path = osp.join(self.img_prefix, 'Annotations', f'{img_id}.xml') + xml_path = osp.join(self.img_prefix, self.ann_subdir, f'{img_id}.xml') tree = ET.parse(xml_path) root = tree.getroot() bboxes = [] @@ -158,7 +165,7 @@ class XMLDataset(CustomDataset): cat_ids = [] img_id = self.data_infos[idx]['id'] - xml_path = osp.join(self.img_prefix, 'Annotations', f'{img_id}.xml') + xml_path = osp.join(self.img_prefix, self.ann_subdir, f'{img_id}.xml') tree = ET.parse(xml_path) root = tree.getroot() for obj in root.findall('object'): diff --git a/tests/data/custom_dataset/images/000001.jpg b/tests/data/custom_dataset/images/000001.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f96ee5da4995ec31b852d7c497f276066ff63ac GIT binary patch literal 10198 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 + VOC2007 + 000001.jpg + + The VOC2007 Database + PASCAL VOC2007 + flickr + 341012865 + + + Fried Camels + Jinky the Fruit Bat + + + 353 + 500 + 3 + + 0 + + dog + Left + 1 + 0 + + 48 + 240 + 195 + 371 + + + + person + Left + 1 + 0 + + 8 + 12 + 352 + 498 + + + diff --git a/tests/data/custom_dataset/test.txt b/tests/data/custom_dataset/test.txt new file mode 100644 index 000000000..a12b836b5 --- /dev/null +++ b/tests/data/custom_dataset/test.txt @@ -0,0 +1 @@ +000001 diff --git a/tests/data/custom_dataset/trainval.txt b/tests/data/custom_dataset/trainval.txt new file mode 100644 index 000000000..a12b836b5 --- /dev/null +++ b/tests/data/custom_dataset/trainval.txt @@ -0,0 +1 @@ +000001 diff --git a/tests/test_data/test_datasets/test_custom_dataset.py b/tests/test_data/test_datasets/test_custom_dataset.py index 010b13ea2..b9207be38 100644 --- a/tests/test_data/test_datasets/test_custom_dataset.py +++ b/tests/test_data/test_datasets/test_custom_dataset.py @@ -1,4 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. +import os +import unittest from unittest.mock import MagicMock, patch import pytest @@ -87,3 +89,51 @@ def test_custom_classes_override_default(dataset): assert custom_dataset.CLASSES != original_classes assert custom_dataset.CLASSES == ['bus', 'car'] print(custom_dataset) + + +class CustomDatasetTests(unittest.TestCase): + + def setUp(self): + super().setUp() + self.data_dir = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(__file__))), + 'data') + self.dataset_class = DATASETS.get('XMLDataset') + + def test_data_infos__default_db_directories(self): + """Test correct data read having a Pacal-VOC directory structure.""" + test_dataset_root = os.path.join(self.data_dir, 'VOCdevkit', 'VOC2007') + custom_ds = self.dataset_class( + data_root=test_dataset_root, + ann_file=os.path.join(test_dataset_root, 'ImageSets', 'Main', + 'trainval.txt'), + pipeline=[], + classes=('person', 'dog'), + test_mode=True) + + self.assertListEqual([{ + 'id': '000001', + 'filename': 'JPEGImages/000001.jpg', + 'width': 353, + 'height': 500 + }], custom_ds.data_infos) + + def test_data_infos__overridden_db_subdirectories(self): + """Test correct data read having a customized directory structure.""" + test_dataset_root = os.path.join(self.data_dir, 'custom_dataset') + custom_ds = self.dataset_class( + data_root=test_dataset_root, + ann_file=os.path.join(test_dataset_root, 'trainval.txt'), + pipeline=[], + classes=('person', 'dog'), + test_mode=True, + img_prefix='', + img_subdir='images', + ann_subdir='images') + + self.assertListEqual([{ + 'id': '000001', + 'filename': 'images/000001.jpg', + 'width': 353, + 'height': 500 + }], custom_ds.data_infos)