| 236 | return img |
| 237 | |
| 238 | class PoisonedDatasetFolder(DatasetFolder, AddDatasetFolderTriggerMixin): |
| 239 | def __init__(self, benign_dataset, y_target, poisoned_rate, poisoned_transform_index, poisoned_target_transform_index, reflection_cadidates,\ |
| 240 | max_image_size=560, ghost_rate=0.49, alpha_b=-1., offset=(0, 0), sigma=-1, ghost_alpha=-1.): |
| 241 | """ |
| 242 | Args: |
| 243 | reflection_cadidates (List of numpy.ndarray of shape (H, W, C) or (H, W)) |
| 244 | max_image_size (int): max(Height, Weight) of returned image |
| 245 | ghost_rate (float): rate of ghost reflection |
| 246 | alpha_b (float): the ratio of background image in blended image, alpha_b should be in $(0,1)$, set to -1 if random alpha_b is desired |
| 247 | offset (tuple of 2 interger): the offset of ghost reflection in the direction of x axis and y axis, set to (0,0) if random offset is desired |
| 248 | sigma (interger): the sigma of gaussian kernel, set to -1 if random sigma is desired |
| 249 | ghost_alpha (interger): ghost_alpha should be in $(0,1)$, set to -1 if random ghost_alpha is desired |
| 250 | """ |
| 251 | super(PoisonedDatasetFolder, self).__init__( |
| 252 | benign_dataset.root, |
| 253 | benign_dataset.loader, |
| 254 | benign_dataset.extensions, |
| 255 | benign_dataset.transform, |
| 256 | benign_dataset.target_transform, |
| 257 | None) |
| 258 | total_num = len(benign_dataset) |
| 259 | poisoned_num = int(total_num * poisoned_rate) |
| 260 | assert poisoned_num >= 0, 'poisoned_num should greater than or equal to zero.' |
| 261 | tmp_list = list(range(total_num)) |
| 262 | random.shuffle(tmp_list) |
| 263 | self.poisoned_set = frozenset(tmp_list[:poisoned_num]) |
| 264 | |
| 265 | # Add trigger to images |
| 266 | if self.transform is None: |
| 267 | self.poisoned_transform = Compose([]) |
| 268 | else: |
| 269 | self.poisoned_transform = copy.deepcopy(self.transform) |
| 270 | |
| 271 | # split transform into two pharses |
| 272 | if poisoned_transform_index < 0: |
| 273 | poisoned_transform_index = len(self.poisoned_transform.transforms) + poisoned_transform_index |
| 274 | self.pre_poisoned_transform = Compose(self.poisoned_transform.transforms[:poisoned_transform_index]) |
| 275 | self.post_poisoned_transform = Compose(self.poisoned_transform.transforms[poisoned_transform_index:]) |
| 276 | |
| 277 | # Modify labels |
| 278 | if self.target_transform is None: |
| 279 | self.poisoned_target_transform = Compose([]) |
| 280 | else: |
| 281 | self.poisoned_target_transform = copy.deepcopy(self.target_transform) |
| 282 | self.poisoned_target_transform.transforms.insert(poisoned_target_transform_index, ModifyTarget(y_target)) |
| 283 | |
| 284 | # Add Trigger |
| 285 | AddDatasetFolderTriggerMixin.__init__( |
| 286 | self, |
| 287 | total_num, |
| 288 | reflection_cadidates, |
| 289 | max_image_size, |
| 290 | ghost_rate, |
| 291 | alpha_b, |
| 292 | offset, |
| 293 | sigma, |
| 294 | ghost_alpha) |
| 295 |
no outgoing calls
no test coverage detected