| # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu). | |
| # | |
| # Permission is hereby granted, free of charge, to any person obtaining a copy of | |
| # this software and associated documentation files (the "Software"), to deal in | |
| # the Software without restriction, including without limitation the rights to | |
| # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies | |
| # of the Software, and to permit persons to whom the Software is furnished to do | |
| # so, subject to the following conditions: | |
| # | |
| # The above copyright notice and this permission notice shall be included in all | |
| # copies or substantial portions of the Software. | |
| # | |
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
| # SOFTWARE. | |
| # | |
| # Please cite "4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural | |
| # Networks", CVPR'19 (https://arxiv.org/abs/1904.08755) if you use any part | |
| # of the code. | |
| import numpy as np | |
| import random | |
| import time | |
| import torch | |
| from torch.utils.data.sampler import Sampler | |
| class Timer(object): | |
| """A simple timer.""" | |
| def __init__(self): | |
| self.reset() | |
| def reset(self): | |
| self.total_time = 0 | |
| self.calls = 0 | |
| self.start_time = 0 | |
| self.diff = 0 | |
| self.averate_time = 0 | |
| self.min_time = np.Inf | |
| def tic(self): | |
| # using time.time instead of time.clock because time time.clock | |
| # does not normalize for multithreading | |
| self.start_time = time.time() | |
| def toc(self, average=False): | |
| self.diff = time.time() - self.start_time | |
| self.total_time += self.diff | |
| self.calls += 1 | |
| self.average_time = self.total_time / self.calls | |
| if self.diff < self.min_time: | |
| self.min_time = self.diff | |
| if average: | |
| return self.average_time | |
| else: | |
| return self.diff | |
| class InfSampler(Sampler): | |
| """Samples elements randomly, without replacement. | |
| Arguments: | |
| data_source (Dataset): dataset to sample from | |
| """ | |
| def __init__(self, data_source, shuffle=False): | |
| self.data_source = data_source | |
| self.shuffle = shuffle | |
| self.reset_permutation() | |
| def reset_permutation(self): | |
| perm = len(self.data_source) | |
| if self.shuffle: | |
| perm = torch.randperm(perm) | |
| else: | |
| perm = torch.arange(perm) | |
| self._perm = perm.tolist() | |
| def __iter__(self): | |
| return self | |
| def __next__(self): | |
| if len(self._perm) == 0: | |
| self.reset_permutation() | |
| return self._perm.pop() | |
| def __len__(self): | |
| return len(self.data_source) | |
| def seed_all(random_seed): | |
| torch.manual_seed(random_seed) | |
| torch.cuda.manual_seed(random_seed) | |
| torch.cuda.manual_seed_all(random_seed) | |
| # torch.backends.cudnn.deterministic = True | |
| # torch.backends.cudnn.benchmark = False | |
| np.random.seed(random_seed) | |
| random.seed(random_seed) | |