This repository was archived by the owner on Jul 2, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 302
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' into add-exclude-to-style-checker
- Loading branch information
Showing
266 changed files
with
10,896 additions
and
1,823 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
include README.md | ||
recursive-include chainercv * | ||
recursive-include chainercv *.c | ||
recursive-exclude chainercv *.pyx |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from chainercv.chainer_experimental import datasets # NOQA |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from chainercv.chainer_experimental.datasets import sliceable # NOQA |
6 changes: 6 additions & 0 deletions
6
chainercv/chainer_experimental/datasets/sliceable/__init__.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
from chainercv.chainer_experimental.datasets.sliceable.sliceable_dataset import SliceableDataset # NOQA | ||
|
||
from chainercv.chainer_experimental.datasets.sliceable.concatenated_dataset import ConcatenatedDataset # NOQA | ||
from chainercv.chainer_experimental.datasets.sliceable.getter_dataset import GetterDataset # NOQA | ||
from chainercv.chainer_experimental.datasets.sliceable.transform_dataset import TransformDataset # NOQA | ||
from chainercv.chainer_experimental.datasets.sliceable.tuple_dataset import TupleDataset # NOQA |
45 changes: 45 additions & 0 deletions
45
chainercv/chainer_experimental/datasets/sliceable/concatenated_dataset.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
from chainercv.chainer_experimental.datasets.sliceable import SliceableDataset | ||
|
||
|
||
class ConcatenatedDataset(SliceableDataset): | ||
"""A sliceable version of :class:`chainer.datasets.ConcatenatedDataset`. | ||
Here is an example. | ||
>>> dataset_a = TupleDataset([0, 1, 2], [0, 1, 4]) | ||
>>> dataset_b = TupleDataset([3, 4, 5], [9, 16, 25]) | ||
>>> | ||
>>> dataset = ConcatenatedDataset(dataset_a, dataset_b) | ||
>>> dataset.slice[:, 0][:] # [0, 1, 2, 3, 4, 5] | ||
Args: | ||
datasets: The underlying datasets. | ||
Each dataset should inherit | ||
:class:`~chainercv.chainer_experimental.datasets.sliceable.Sliceabledataset` | ||
and should have the same keys. | ||
""" | ||
|
||
def __init__(self, *datasets): | ||
if len(datasets) == 0: | ||
raise ValueError('At least one dataset is required') | ||
self._datasets = datasets | ||
self._keys = datasets[0].keys | ||
for dataset in datasets[1:]: | ||
if not dataset.keys == self._keys: | ||
raise ValueError('All datasets should have the same keys') | ||
|
||
def __len__(self): | ||
return sum(len(dataset) for dataset in self._datasets) | ||
|
||
@property | ||
def keys(self): | ||
return self._keys | ||
|
||
def get_example_by_keys(self, index, key_indices): | ||
if index < 0: | ||
raise IndexError | ||
for dataset in self._datasets: | ||
if index < len(dataset): | ||
return dataset.get_example_by_keys(index, key_indices) | ||
index -= len(dataset) | ||
raise IndexError |
97 changes: 97 additions & 0 deletions
97
chainercv/chainer_experimental/datasets/sliceable/getter_dataset.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
from chainercv.chainer_experimental.datasets.sliceable.sliceable_dataset \ | ||
import _as_indices | ||
from chainercv.chainer_experimental.datasets.sliceable import SliceableDataset | ||
|
||
|
||
class GetterDataset(SliceableDataset): | ||
"""A sliceable dataset class that is defined with getters. | ||
This is a dataset class with getters. | ||
Please refer to the tutorial for more detailed explanation. | ||
Here is an example. | ||
>>> class SliceableLabeledImageDataset(GetterDataset): | ||
>>> def __init__(self, pairs, root='.'): | ||
>>> super(SliceableLabeledImageDataset, self).__init__() | ||
>>> with open(pairs) as f: | ||
>>> self._pairs = [l.split() for l in f] | ||
>>> self._root = root | ||
>>> | ||
>>> self.add_getter('img', self.get_image) | ||
>>> self.add_getter('label', self.get_label) | ||
>>> | ||
>>> def __len__(self): | ||
>>> return len(self._pairs) | ||
>>> | ||
>>> def get_image(self, i): | ||
>>> path, _ = self._pairs[i] | ||
>>> return read_image(os.path.join(self._root, path)) | ||
>>> | ||
>>> def get_label(self, i): | ||
>>> _, label = self._pairs[i] | ||
>>> return np.int32(label) | ||
>>> | ||
>>> dataset = SliceableLabeledImageDataset('list.txt') | ||
>>> | ||
>>> # get a subset with label = 0, 1, 2 | ||
>>> # no images are loaded | ||
>>> indices = [i for i, label in | ||
... enumerate(dataset.slice[:, 'label']) if label in {0, 1, 2}] | ||
>>> dataset_012 = dataset.slice[indices] | ||
""" | ||
|
||
def __init__(self): | ||
self._keys = [] | ||
self._getters = [] | ||
self._return_tuple = True | ||
|
||
def __len__(self): | ||
raise NotImplementedError | ||
|
||
@property | ||
def keys(self): | ||
if self._return_tuple: | ||
return tuple(key for key, _, _ in self._keys) | ||
else: | ||
return self._keys[0][0] | ||
|
||
@keys.setter | ||
def keys(self, keys): | ||
self._keys = [self._keys[key_index] | ||
for key_index in _as_indices(keys, self.keys)] | ||
self._return_tuple = isinstance(keys, (list, tuple)) | ||
|
||
def add_getter(self, keys, getter): | ||
"""Register a getter function | ||
Args: | ||
keys (int or string or tuple of strings): The number or name(s) of | ||
data that the getter function returns. | ||
getter (callable): A getter function that takes an index and | ||
returns data of the corresponding example. | ||
""" | ||
self._getters.append(getter) | ||
if isinstance(keys, int): | ||
if keys == 1: | ||
keys = None | ||
else: | ||
keys = (None,) * keys | ||
if isinstance(keys, (tuple, list)): | ||
for key_index, key in enumerate(keys): | ||
self._keys.append((key, len(self._getters) - 1, key_index)) | ||
else: | ||
self._keys.append((keys, len(self._getters) - 1, None)) | ||
|
||
def get_example_by_keys(self, index, key_indices): | ||
example = [] | ||
cache = {} | ||
for key_index in key_indices: | ||
_, getter_index, key_index = self._keys[key_index] | ||
if getter_index not in cache: | ||
cache[getter_index] = self._getters[getter_index](index) | ||
if key_index is None: | ||
example.append(cache[getter_index]) | ||
else: | ||
example.append(cache[getter_index][key_index]) | ||
return tuple(example) |
Oops, something went wrong.