| 17 | |
| 18 | |
| 19 | class RandomIdentitySampler(Sampler): |
| 20 | def __init__(self, data_source, num_instances): |
| 21 | self.data_source = data_source |
| 22 | self.num_instances = num_instances |
| 23 | self.index_dic = defaultdict(list) |
| 24 | for index, (_, pid, _) in enumerate(data_source): |
| 25 | self.index_dic[pid].append(index) |
| 26 | self.pids = list(self.index_dic.keys()) |
| 27 | self.num_samples = len(self.pids) |
| 28 | |
| 29 | def __len__(self): |
| 30 | return self.num_samples * self.num_instances |
| 31 | |
| 32 | def __iter__(self): |
| 33 | indices = torch.randperm(self.num_samples).tolist() |
| 34 | ret = [] |
| 35 | for i in indices: |
| 36 | pid = self.pids[i] |
| 37 | t = self.index_dic[pid] |
| 38 | if len(t) >= self.num_instances: |
| 39 | t = np.random.choice(t, size=self.num_instances, replace=False) |
| 40 | else: |
| 41 | t = np.random.choice(t, size=self.num_instances, replace=True) |
| 42 | ret.extend(t) |
| 43 | return iter(ret) |
| 44 | |
| 45 | |
| 46 | class RandomMultipleGallerySampler(Sampler): |
nothing calls this directly
no outgoing calls
no test coverage detected