├── LICENSE.md
├── README.md
├── examples
├── ILSVRC2012_val_00003784.JPEG
└── ILSVRC2012_val_00008855.JPEG
├── gradcam_targeted_patch_attack.py
├── misc
├── imagenet1000_clsidx_to_labels.txt
└── teaser.jpg
└── results
├── ILSVRC2012_val_00003784_our_adv_patch_gcam.JPEG
├── ILSVRC2012_val_00003784_our_adv_patch_image.png
├── ILSVRC2012_val_00003784_reg_adv_patch_gcam.JPEG
├── ILSVRC2012_val_00003784_reg_adv_patch_image.png
├── ILSVRC2012_val_00008855_our_adv_patch_gcam.JPEG
├── ILSVRC2012_val_00008855_our_adv_patch_image.png
├── ILSVRC2012_val_00008855_reg_adv_patch_gcam.JPEG
└── ILSVRC2012_val_00008855_reg_adv_patch_image.png
/LICENSE.md:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) [year] [fullname]
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Fooling Network Interpretation in Image Classification
2 | This is the PyTorch implementation for our ICCV 2019 paper - [Fooling Network Interpretation in Image Classification][1]
3 | Akshayvarun Subramanya*, Vipin Pillai*, Hamed Pirsiavash.
4 |
5 | Deep neural networks have been shown to be fooled rather easily using adversarial attack algorithms. Practical methods such as adversarial patches have been shown to be extremely effective in causing misclassification. However, these patches are highlighted using standard network interpretation algorithms, thus revealing the identity of the adversary. We show that it is possible to create adversarial patches which not only fool the prediction, but also change what we interpret regarding the cause of the prediction. Moreover, we introduce our attack as a controlled setting to measure the accuracy of interpretation algorithms. We show this using extensive experiments for Grad-CAM interpretation that transfers to occluding patch interpretation as well. We believe our algorithms can facilitate developing more robust network interpretation tools that truly explain the network’s underlying decision making process.
6 |
7 |
8 | ![alt text][teaser]
9 |
10 |
11 | ### Bibtex
12 | ```
13 | @InProceedings{Subramanya_2019_ICCV,
14 | author = {Subramanya, Akshayvarun and Pillai, Vipin and Pirsiavash, Hamed},
15 | title = {Fooling Network Interpretation in Image Classification},
16 | booktitle = {The IEEE International Conference on Computer Vision (ICCV)},
17 | month = {October},
18 | year = {2019}
19 | }
20 | ```
21 |
22 | ### Pre-requisites
23 |
24 | This code is based on https://github.com/jacobgil/pytorch-grad-cam
25 |
26 | Please install PyTorch (https://pytorch.org/get-started/locally/) and CUDA if you don't have it installed.
27 |
28 | The script `gradcam_targeted_patch_attack.py` takes as argument the input image and the corresponding result directory to store the results. The script performs a targeted patch attack using the regular adversarial patch method as well as our adversarial patch method. The adversarial patch created using our method is able to fool both the classifier as well as the corresponding network interpretation for the target category.
29 |
30 |
31 | ### Usage
32 | `python gradcam_targeted_patch_attack.py --image-path ./examples/ILSVRC2012_val_00008855.JPEG --result-dir ./results`
33 |
34 | The mapping file for imagenet class labels to indices (0-999) can be found here - `misc/imagenet1000_clsidx_to_labels.txt`
35 |
36 | ### Results
37 |
38 |
39 |
40 |
41 | Original Image
42 |
43 |
44 |
45 | Paddle
46 | |
47 |
48 | Adv. Patch
49 |
50 |
51 |
52 | Box Turtle
53 | |
54 |
55 | Adv. Patch - GCAM
56 |
57 |
58 |
59 | Box Turtle
60 | |
61 |
62 | Our Patch
63 |
64 |
65 |
66 | Box Turtle
67 | |
68 |
69 | Our Patch - GCAM
70 |
71 |
72 |
73 | Box Turtle
74 | |
75 |
76 |
77 |
78 | ### License
79 | MIT
80 |
81 | ### Acknowledgement
82 | This work was performed under the following financial assistance award: 60NANB18D279 from U.S. Department of Commerce, National Institute of Standards and Technology, funding from SAP SE, and also NSF grant 1845216.
83 |
84 | [1]: https://arxiv.org/pdf/1812.02843.pdf
85 | [teaser]: https://github.com/UMBCvision/fooling_network_interpretation/blob/master/misc/teaser.jpg
86 |
--------------------------------------------------------------------------------
/examples/ILSVRC2012_val_00003784.JPEG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UMBCvision/fooling_network_interpretation/46e910cdfb578eda2698a5a4a0110482e1c4d1a0/examples/ILSVRC2012_val_00003784.JPEG
--------------------------------------------------------------------------------
/examples/ILSVRC2012_val_00008855.JPEG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UMBCvision/fooling_network_interpretation/46e910cdfb578eda2698a5a4a0110482e1c4d1a0/examples/ILSVRC2012_val_00008855.JPEG
--------------------------------------------------------------------------------
/gradcam_targeted_patch_attack.py:
--------------------------------------------------------------------------------
1 | import os
2 | import argparse
3 | import numpy as np
4 | import cv2
5 | import torch
6 | from torch.autograd import Variable
7 | from torchvision import models
8 |
9 |
10 | class FeatureExtractor:
11 | """ Class for extracting activations and
12 | registering gradients from targeted intermediate layers """
13 | def __init__(self, model, target_layers):
14 | self.model = model
15 | self.target_layers = target_layers
16 | self.gradients = []
17 |
18 | def save_gradient(self, grad):
19 | self.gradients.append(grad)
20 |
21 | def __call__(self, x):
22 | outputs = []
23 | self.gradients = []
24 | for name, module in self.model._modules.items():
25 | x = module(x)
26 | if name in self.target_layers:
27 | # Store the features and register hook to save gradients for the target layer
28 | x.register_hook(self.save_gradient)
29 | outputs += [x]
30 | return outputs, x
31 |
32 |
33 | class ModelOutputs:
34 | """ Class for making a forward pass, and getting:
35 | 1. The network output.
36 | 2. Activations from intermediate targeted layers.
37 | 3. Gradients from intermediate targeted layers. """
38 | def __init__(self, model, target_layers):
39 | self.model = model
40 | self.feature_extractor = FeatureExtractor(self.model.features, target_layers)
41 |
42 | def get_gradients(self):
43 | # Retrieve the saved gradients for the target layer
44 | return self.feature_extractor.gradients
45 |
46 | def __call__(self, x):
47 | target_activations, output = self.feature_extractor(x)
48 | output = output.view(output.size(0), -1)
49 | output = self.model.classifier(output)
50 | return target_activations, output
51 |
52 |
53 | def preprocess_image(input_image):
54 | """
55 | This method normalizes the input image and converts it to a torch Variable
56 | :param input_image: The input image to be pre-processed
57 | :return: torch Variable of the normalized input image
58 | """
59 | means = [0.485, 0.456, 0.406]
60 | stds = [0.229, 0.224, 0.225]
61 |
62 | normalized_image = input_image.copy()[:, :, ::-1]
63 | for i in range(3):
64 | normalized_image[:, :, i] = normalized_image[:, :, i] - means[i]
65 | normalized_image[:, :, i] = normalized_image[:, :, i] / stds[i]
66 | normalized_image = \
67 | np.ascontiguousarray(np.transpose(normalized_image, (2, 0, 1)))
68 | normalized_image = torch.from_numpy(normalized_image)
69 | normalized_image.unsqueeze_(0)
70 | normalized_tensor = Variable(normalized_image, requires_grad=True).cuda()
71 | return normalized_tensor
72 |
73 |
74 | def show_cam_on_image(input_image, mask, filename="cam.png"):
75 | """
76 | Converts the mask to a heatmap and overlays it with the input image.
77 | :param input_image: input image
78 | :param mask: gradcam mask to be used as heatmap
79 | :param filename: output path to write the image overlayed with the mask
80 | :return:
81 | """
82 | heatmap = cv2.applyColorMap(np.uint8(255 * mask), cv2.COLORMAP_JET)
83 | heatmap = np.float32(heatmap) / 255
84 | cam = heatmap + np.float32(input_image)
85 | cam = cam / np.max(cam)
86 | cv2.imwrite(filename, np.uint8(255 * cam))
87 |
88 |
89 | class GradCamAttack:
90 | """
91 | This class is responsible for creating a targeted adversarial patch such that the top predicted category is the
92 | target category and the Grad-CAM for the target category is hidden in the patch location.
93 | """
94 | def __init__(self, model, target_layer_names):
95 | self.model = model
96 | self.model.eval()
97 | self.model = model.cuda()
98 | self.criterion = torch.nn.CrossEntropyLoss().cuda()
99 | self.extractor = ModelOutputs(self.model, target_layer_names)
100 | self.relu = torch.nn.ReLU()
101 |
102 | def __call__(self, image_tensor, index, target_class_index, lr=.005, eps=0.007, lambda_val=0.05, attack_iters=750):
103 | print('\n\nOur adversarial patch attack:\n\n')
104 | print('Before attack, Predicted class:{}\tTarget class:{}\n\n'.format(index, target_class_index))
105 |
106 | # Clone the original image for computing the adversarial image with the patch
107 | adv_image_tensor = image_tensor.clone()
108 |
109 | # Initialize the perturbation tensor
110 | dl_dx_cumulative = torch.zeros_like(image_tensor)
111 |
112 | # Specify the top-left co-ordinates and the size for the patch and create the corresponding mask
113 | # The mask will have ones at the patch location pixels and zeros at all other pixels
114 | start_pos = (0, 0)
115 | patch_size = 64
116 | mask = torch.zeros_like(image_tensor).cuda()
117 | mask.data[0, :, start_pos[1]:start_pos[1] + patch_size, start_pos[0]:start_pos[0] + patch_size] = 1.0
118 |
119 | # Means and std_devs used for pre-processing
120 | means = np.array([0.485, 0.456, 0.406])
121 | stds = np.array([0.229, 0.224, 0.225])
122 |
123 | # Compute the per channel clamp_min and clamp_max respectively
124 | channel_clamp_min = (0 - means) / stds
125 | channel_clamp_max = (1 - means) / stds
126 |
127 | loss_zero_counter = 0
128 | for i in range(attack_iters):
129 | adv_features, adv_output = self.extractor(adv_image_tensor)
130 | pred_index = np.argmax(adv_output.cpu().data.numpy())
131 |
132 | # Create a one-hot tensor for the target category
133 | one_hot = np.zeros((1, adv_output.size()[-1]), dtype=np.float32)
134 | one_hot[0][target_class_index] = 1
135 | one_hot = Variable(torch.from_numpy(one_hot), requires_grad=True)
136 | one_hot_tensor = torch.sum(one_hot.cuda() * adv_output)
137 |
138 | # Clear the gradients before loss computation
139 | self.model.features.zero_grad()
140 | self.model.classifier.zero_grad()
141 |
142 | # Compute the gradients of the loss with respect to the feature layer for the adversarial image
143 | dy_dz, = torch.autograd.grad(one_hot_tensor, adv_features[0],
144 | grad_outputs=torch.ones(one_hot_tensor.size()).cuda(),
145 | retain_graph=True, create_graph=True)
146 | dy_dz_sum = dy_dz.sum(dim=2).sum(dim=2)
147 |
148 | # Compute gradient weighted class activations for the perturbed image
149 | grad_weighted_feats = dy_dz_sum.unsqueeze(-1).unsqueeze(-1) * adv_features[0]
150 | gcam = grad_weighted_feats.sum(dim=1).squeeze(0)
151 | gcam = self.relu(gcam)
152 |
153 | # Normalize the gradcam tensor
154 | gcam = gcam / (gcam.sum() + 1e-10)
155 |
156 | # Compute the loss for the patch location pixels in the gradcam tensor.
157 | # For a 224x224 image, the adversarial patch size is 64x64.
158 | # Since the gradcam tensor is 14x14 for VGG19 BN network, the corresponding gradcam patch size is 4x4
159 | gcam_loss = torch.sum(gcam[0:4, 0:4]).abs().cuda()
160 | gcam_loss = gcam_loss / 16.0
161 |
162 | # Add the cross entropy loss if target category is not the top predicted category
163 | if np.argmax(adv_output.cpu().data.numpy()) == target_class_index:
164 | xe_loss = 0.0
165 | else:
166 | xe_loss = self.criterion(adv_output, torch.tensor([target_class_index], dtype=torch.long).cuda())
167 |
168 | # We minimize both the gradcam loss and cross entropy loss
169 | total_loss = gcam_loss + (lambda_val * xe_loss)
170 |
171 | # Stop the attack once the loss is zero for 5 consecutive iterations
172 | if total_loss == 0.0:
173 | if loss_zero_counter > 5:
174 | break
175 | else:
176 | loss_zero_counter += 1
177 | else:
178 | loss_zero_counter = 0
179 |
180 | # Compute the gradient of the total loss with respect to the perturbed image
181 | dl_dx, = torch.autograd.grad(total_loss, adv_image_tensor)
182 |
183 | # Perform gradient ascent using the sign of dl_dx to compute the cumulative perturbation
184 | dl_dx_cumulative = dl_dx_cumulative - lr * torch.sign(dl_dx)
185 | adv_image_tensor = (1 - mask) * image_tensor.clone() + mask * dl_dx_cumulative
186 |
187 | # Clamp the adversarial image using per channel min and max respectively
188 | for c in range(3):
189 | adv_image_tensor[:, c, :, :] = adv_image_tensor[:, c, :, :].clamp(channel_clamp_min[c],
190 | channel_clamp_max[c])
191 |
192 | if i % 10 == 0:
193 | print('Iteration:{}\tGradCAM Loss:{:.3f}\tCE Loss:{:.3f}\ttotal_pert.mean:{:.3f}\tOrig index:{}'
194 | '\tTarget index:{}\tPred index:{}'.format(i, gcam_loss, xe_loss, dl_dx_cumulative.abs().mean(),
195 | index, target_class_index, pred_index))
196 |
197 | # Store the resulting adversarial image tensor
198 | res_adv_tensor = image_tensor.clone()
199 | res_adv_tensor.data = adv_image_tensor.data
200 |
201 | # Get the top predicted category of the resulting adversarial image tensor
202 | _, adv_output = self.extractor(res_adv_tensor)
203 |
204 | print('\n\nAfter attack, Original class: {}\tPredicted class: {}\tTarget class: {}'.
205 | format(index, adv_output[0].argmax(), target_class_index))
206 |
207 | # Denormalize the adversarial image
208 | adv_img = res_adv_tensor.data[0].cpu().numpy()
209 | adv_img = np.transpose(adv_img, (1, 2, 0))
210 | for i in range(3):
211 | adv_img[:, :, i] = (adv_img[:, :, i] * stds[i]) + means[i]
212 |
213 | return adv_img, res_adv_tensor
214 |
215 |
216 | class GradCamRegPatchAttack:
217 | """
218 | This class is responsible for creating a regular adversarial patch for a targeted attack.
219 | """
220 | def __init__(self, model, target_layer_names):
221 | self.model = model
222 | self.model.eval()
223 | self.model = model.cuda()
224 | self.criterion = torch.nn.CrossEntropyLoss().cuda()
225 | self.extractor = ModelOutputs(self.model, target_layer_names)
226 |
227 | def __call__(self, image_tensor, index, target_class_index, lr=.005, eps=0.007, lambda_val=0.05, attack_iters=750):
228 | print('\n\nRegular adversarial patch attack:\n\n')
229 | print('Before attack, Predicted class:{}\tTarget class:{}\n'.format(index, target_class_index))
230 |
231 | # Clone the original image for computing the perturbed adversarial image
232 | adv_image_tensor = image_tensor.clone() + torch.randn(image_tensor.size()).cuda() / 100
233 |
234 | # Initialize the perturbation tensor
235 | dl_dx_cumulative = torch.zeros_like(image_tensor)
236 |
237 | # Means and std_devs used for pre-processing
238 | means = np.array([0.485, 0.456, 0.406])
239 | stds = np.array([0.229, 0.224, 0.225])
240 |
241 | # Compute the per channel clamp_min and clamp_max respectively
242 | channel_clamp_min = (0 - means) / stds
243 | channel_clamp_max = (1 - means) / stds
244 |
245 | # Specify the top-left co-ordinates and the size for the patch and create the corresponding mask
246 | # The mask will have ones at the patch location pixels and zeros at all other pixels
247 | start_pos = (0, 0)
248 | patch_size = 64
249 | mask = torch.zeros_like(image_tensor).cuda()
250 | mask.data[0, :, start_pos[1]:start_pos[1] + patch_size, start_pos[0]:start_pos[0] + patch_size] = 1.0
251 |
252 | loss_zero_counter = 0
253 | target_flip_counter = 0
254 | for i in range(attack_iters):
255 | _, adv_output = self.extractor(adv_image_tensor)
256 | pred_index = np.argmax(adv_output.cpu().data.numpy())
257 |
258 | self.model.features.zero_grad()
259 | self.model.classifier.zero_grad()
260 |
261 | # Stop the attack once the target category is reached for 5 consecutive attack iterations
262 | if i > 250 and pred_index == target_class_index:
263 | if target_flip_counter > 5:
264 | break
265 | else:
266 | target_flip_counter += 1
267 | else:
268 | target_flip_counter = 0
269 |
270 | xe_loss = self.criterion(adv_output, torch.tensor([target_class_index], dtype=torch.long).cuda())
271 |
272 | # Stop the attack once the loss is zero for 5 consecutive attack iterations
273 | if xe_loss == 0.0:
274 | if loss_zero_counter > 5:
275 | break
276 | else:
277 | loss_zero_counter += 1
278 | else:
279 | loss_zero_counter = 0
280 |
281 | # Compute the gradient of the total loss with respect to the perturbed image
282 | dl_dx, = torch.autograd.grad(xe_loss, adv_image_tensor)
283 |
284 | # Perform gradient ascent using the sign of dl_dx to compute the cumulative perturbation
285 | dl_dx_cumulative = dl_dx_cumulative - lr * torch.sign(dl_dx)
286 | adv_image_tensor = image_tensor.clone() * (1 - mask) + dl_dx_cumulative * mask
287 |
288 | # Clamp the adversarial image using per channel min and max respectively
289 | for c in range(3):
290 | adv_image_tensor[:, c, :, :] = adv_image_tensor[:, c, :, :].clamp(channel_clamp_min[c],
291 | channel_clamp_max[c])
292 |
293 | if i % 10 == 0:
294 | print('Iteration:{}\tCE Loss:{:.3f}\ttotal_pert.mean:{:.3f}\tOrig index:{}\tTarget index:{}'
295 | '\tPred index:{}'.format(i, xe_loss, dl_dx_cumulative.abs().mean(),
296 | index, target_class_index, pred_index))
297 |
298 | # Store the resulting adversarial image tensor
299 | res_adv_tensor = image_tensor.clone()
300 | res_adv_tensor.data = adv_image_tensor.data
301 |
302 | # Get the top predicted category of the resulting adversarial image tensor
303 | _, adv_output = self.extractor(res_adv_tensor)
304 |
305 | print('\n\nAfter attack, Original class: {}\tPredicted class: {}\tTarget class: {}'.
306 | format(index, adv_output[0].argmax(), target_class_index))
307 |
308 | # Denormalize the adversarial image
309 | adv_img = res_adv_tensor.data[0].cpu().numpy()
310 | adv_img = np.transpose(adv_img, (1, 2, 0))
311 | for i in range(3):
312 | adv_img[:, :, i] = (adv_img[:, :, i] * stds[i]) + means[i]
313 |
314 | return adv_img, res_adv_tensor
315 |
316 |
317 | class GradCam:
318 | """
319 | This class computes the Grad-CAM mask for the specified index.
320 | """
321 | def __init__(self, model, target_layer_names):
322 | self.model = model
323 | self.model.eval()
324 | self.model = model.cuda()
325 | self.extractor = ModelOutputs(self.model, target_layer_names)
326 |
327 | def __call__(self, image_tensor, index=None):
328 | features, output = self.extractor(image_tensor)
329 |
330 | if index is None:
331 | index = np.argmax(output.cpu().data.numpy())
332 |
333 | # Compute the one-hot tensor corresponding to the index
334 | one_hot = np.zeros((1, output.size()[-1]), dtype=np.float32)
335 | one_hot[0][index] = 1
336 | one_hot = Variable(torch.from_numpy(one_hot), requires_grad=True)
337 | one_hot = torch.sum(one_hot.cuda() * output)
338 |
339 | self.model.features.zero_grad()
340 | self.model.classifier.zero_grad()
341 | one_hot.backward(retain_graph=True)
342 |
343 | # Get the gradients and features to compute Grad-CAM
344 | grads_val = self.extractor.get_gradients()[-1].cpu().data.numpy()
345 | target = features[-1]
346 | target = target.cpu().data.numpy()[0, :]
347 |
348 | weights = np.mean(grads_val, axis=(2, 3))[0, :]
349 | cam = np.zeros(target.shape[1:], dtype=np.float32)
350 |
351 | for i, w in enumerate(weights):
352 | cam += w * target[i, :, :]
353 |
354 | cam = np.maximum(cam, 0)
355 | cam = cv2.resize(cam, (224, 224))
356 | cam = cam - np.min(cam)
357 | cam = cam / np.max(cam)
358 | return cam
359 |
360 |
361 | def forward_inference(model, input_tensor):
362 | """
363 | Computes forward inference on the input image tensor and
364 | returns the top prediction index and probability
365 | :param model:
366 | :param input_tensor:
367 | :return:
368 | """
369 | output = model(input_tensor)
370 | index = np.argmax(output.cpu().data.numpy())
371 | index_prob = torch.nn.functional.softmax(output)[0][index]
372 | return index, index_prob
373 |
374 |
375 | def get_args():
376 |
377 | if not torch.cuda.is_available():
378 | print("CUDA not available. Exiting.")
379 | exit()
380 | print("Using GPU for acceleration")
381 |
382 | parser = argparse.ArgumentParser()
383 | parser.add_argument('--image-path', type=str, default='./examples/ILSVRC2012_val_00017472.JPEG',
384 | help='Input image path')
385 | parser.add_argument('--result-dir', type=str, default='./results', help='Path to store the results')
386 | return parser.parse_args()
387 |
388 |
389 | if __name__ == '__main__':
390 | """ python gradcam_targeted_patch_attack.py --image-path --result-dir
391 | 1. Loads an image with opencv.
392 | 2. Preprocesses it for VGG19 and converts to a pytorch variable.
393 | 3. Makes a forward pass to find the category index with the highest score,
394 | and computes intermediate activations.
395 | Makes the visualization. """
396 |
397 | args = get_args()
398 |
399 | # Setting the seed for reproducibility for demo
400 | # Comment the below 4 lines for the target category to be random across runs
401 | np.random.seed(1)
402 | torch.manual_seed(1)
403 | torch.backends.cudnn.deterministic = True
404 | torch.backends.cudnn.benchmark = False
405 |
406 | # Can work with any model, but it assumes that the model has a feature method,
407 | # and a classifier method, as in the VGG models in torchvision.
408 | gradcam_attack = GradCamAttack(model=models.vgg19_bn(pretrained=True), target_layer_names=["51"])
409 | gradcam_reg_patch_attack = GradCamRegPatchAttack(model=models.vgg19_bn(pretrained=True), target_layer_names=["51"])
410 | gradcam = GradCam(model=models.vgg19_bn(pretrained=True), target_layer_names=["51"])
411 | pretrained_vgg_net = models.vgg19_bn(pretrained=True).cuda()
412 | pretrained_vgg_net = pretrained_vgg_net.eval()
413 | image_name = args.image_path.split('/')[-1].split('.')[0]
414 |
415 | # Create result directory if it doesn't exist
416 | if not os.path.exists(args.result_dir):
417 | os.makedirs(args.result_dir)
418 |
419 | # Read the input image and preprocess to a tensor
420 | img = cv2.imread(args.image_path, 1)
421 | img = np.float32(cv2.resize(img, (224, 224))) / 255
422 | preprocessed_img = preprocess_image(img)
423 |
424 | # Get the original prediction index and the corresponding probability
425 | orig_index, orig_prob = forward_inference(pretrained_vgg_net, preprocessed_img)
426 |
427 | # Pick a random target from the remaining 999 categories excluding the original prediction
428 | list_of_idx = np.delete(np.arange(1000), orig_index)
429 | rand_idx = np.random.randint(999)
430 | target_index = list_of_idx[rand_idx]
431 |
432 | # Compute the regular adv patch attack image and the corresponding GradCAM
433 | reg_patch_adv_img, reg_patch_adv_tensor = gradcam_reg_patch_attack(preprocessed_img, orig_index, target_index)
434 | reg_patch_pred_index, reg_patch_pred_prob = forward_inference(pretrained_vgg_net,
435 | preprocess_image(reg_patch_adv_img[:, :, ::-1]))
436 | cv2.imwrite(os.path.join(args.result_dir, image_name + '_reg_adv_patch_image.png'),
437 | np.uint8(255 * np.clip(reg_patch_adv_img[:, :, ::-1], 0, 1)))
438 |
439 | # Generate the GradCAM heatmap for the target category using the regular patch adversarial image
440 | reg_patch_adv_mask = gradcam(reg_patch_adv_tensor, target_index)
441 | show_cam_on_image(np.clip(reg_patch_adv_img[:, :, ::-1], 0, 1), reg_patch_adv_mask,
442 | filename=os.path.join(args.result_dir, image_name + '_reg_adv_patch_gcam.JPEG'))
443 |
444 | # Compute the adv patch attack using our method and the corresponding GradCAM
445 | our_patch_adv_img, our_patch_adv_tensor = gradcam_attack(preprocessed_img, orig_index, target_index)
446 | our_patch_pred_index, our_patch_pred_prob = forward_inference(pretrained_vgg_net,
447 | preprocess_image(our_patch_adv_img[:, :, ::-1]))
448 | cv2.imwrite(os.path.join(args.result_dir, image_name + '_our_adv_patch_image.png'),
449 | np.uint8(255 * np.clip(our_patch_adv_img[:, :, ::-1], 0, 1)))
450 |
451 | # Generate the GradCAM heatmap for the target category using our patch adversarial image
452 | mask_adv_ = gradcam(our_patch_adv_tensor, target_index)
453 | show_cam_on_image(np.clip(our_patch_adv_img[:, :, ::-1], 0, 1), mask_adv_,
454 | filename=os.path.join(args.result_dir, image_name + '_our_adv_patch_gcam.JPEG'))
455 |
--------------------------------------------------------------------------------
/misc/imagenet1000_clsidx_to_labels.txt:
--------------------------------------------------------------------------------
1 | {0: 'tench, Tinca tinca',
2 | 1: 'goldfish, Carassius auratus',
3 | 2: 'great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias',
4 | 3: 'tiger shark, Galeocerdo cuvieri',
5 | 4: 'hammerhead, hammerhead shark',
6 | 5: 'electric ray, crampfish, numbfish, torpedo',
7 | 6: 'stingray',
8 | 7: 'cock',
9 | 8: 'hen',
10 | 9: 'ostrich, Struthio camelus',
11 | 10: 'brambling, Fringilla montifringilla',
12 | 11: 'goldfinch, Carduelis carduelis',
13 | 12: 'house finch, linnet, Carpodacus mexicanus',
14 | 13: 'junco, snowbird',
15 | 14: 'indigo bunting, indigo finch, indigo bird, Passerina cyanea',
16 | 15: 'robin, American robin, Turdus migratorius',
17 | 16: 'bulbul',
18 | 17: 'jay',
19 | 18: 'magpie',
20 | 19: 'chickadee',
21 | 20: 'water ouzel, dipper',
22 | 21: 'kite',
23 | 22: 'bald eagle, American eagle, Haliaeetus leucocephalus',
24 | 23: 'vulture',
25 | 24: 'great grey owl, great gray owl, Strix nebulosa',
26 | 25: 'European fire salamander, Salamandra salamandra',
27 | 26: 'common newt, Triturus vulgaris',
28 | 27: 'eft',
29 | 28: 'spotted salamander, Ambystoma maculatum',
30 | 29: 'axolotl, mud puppy, Ambystoma mexicanum',
31 | 30: 'bullfrog, Rana catesbeiana',
32 | 31: 'tree frog, tree-frog',
33 | 32: 'tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui',
34 | 33: 'loggerhead, loggerhead turtle, Caretta caretta',
35 | 34: 'leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea',
36 | 35: 'mud turtle',
37 | 36: 'terrapin',
38 | 37: 'box turtle, box tortoise',
39 | 38: 'banded gecko',
40 | 39: 'common iguana, iguana, Iguana iguana',
41 | 40: 'American chameleon, anole, Anolis carolinensis',
42 | 41: 'whiptail, whiptail lizard',
43 | 42: 'agama',
44 | 43: 'frilled lizard, Chlamydosaurus kingi',
45 | 44: 'alligator lizard',
46 | 45: 'Gila monster, Heloderma suspectum',
47 | 46: 'green lizard, Lacerta viridis',
48 | 47: 'African chameleon, Chamaeleo chamaeleon',
49 | 48: 'Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis',
50 | 49: 'African crocodile, Nile crocodile, Crocodylus niloticus',
51 | 50: 'American alligator, Alligator mississipiensis',
52 | 51: 'triceratops',
53 | 52: 'thunder snake, worm snake, Carphophis amoenus',
54 | 53: 'ringneck snake, ring-necked snake, ring snake',
55 | 54: 'hognose snake, puff adder, sand viper',
56 | 55: 'green snake, grass snake',
57 | 56: 'king snake, kingsnake',
58 | 57: 'garter snake, grass snake',
59 | 58: 'water snake',
60 | 59: 'vine snake',
61 | 60: 'night snake, Hypsiglena torquata',
62 | 61: 'boa constrictor, Constrictor constrictor',
63 | 62: 'rock python, rock snake, Python sebae',
64 | 63: 'Indian cobra, Naja naja',
65 | 64: 'green mamba',
66 | 65: 'sea snake',
67 | 66: 'horned viper, cerastes, sand viper, horned asp, Cerastes cornutus',
68 | 67: 'diamondback, diamondback rattlesnake, Crotalus adamanteus',
69 | 68: 'sidewinder, horned rattlesnake, Crotalus cerastes',
70 | 69: 'trilobite',
71 | 70: 'harvestman, daddy longlegs, Phalangium opilio',
72 | 71: 'scorpion',
73 | 72: 'black and gold garden spider, Argiope aurantia',
74 | 73: 'barn spider, Araneus cavaticus',
75 | 74: 'garden spider, Aranea diademata',
76 | 75: 'black widow, Latrodectus mactans',
77 | 76: 'tarantula',
78 | 77: 'wolf spider, hunting spider',
79 | 78: 'tick',
80 | 79: 'centipede',
81 | 80: 'black grouse',
82 | 81: 'ptarmigan',
83 | 82: 'ruffed grouse, partridge, Bonasa umbellus',
84 | 83: 'prairie chicken, prairie grouse, prairie fowl',
85 | 84: 'peacock',
86 | 85: 'quail',
87 | 86: 'partridge',
88 | 87: 'African grey, African gray, Psittacus erithacus',
89 | 88: 'macaw',
90 | 89: 'sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita',
91 | 90: 'lorikeet',
92 | 91: 'coucal',
93 | 92: 'bee eater',
94 | 93: 'hornbill',
95 | 94: 'hummingbird',
96 | 95: 'jacamar',
97 | 96: 'toucan',
98 | 97: 'drake',
99 | 98: 'red-breasted merganser, Mergus serrator',
100 | 99: 'goose',
101 | 100: 'black swan, Cygnus atratus',
102 | 101: 'tusker',
103 | 102: 'echidna, spiny anteater, anteater',
104 | 103: 'platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus',
105 | 104: 'wallaby, brush kangaroo',
106 | 105: 'koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus',
107 | 106: 'wombat',
108 | 107: 'jellyfish',
109 | 108: 'sea anemone, anemone',
110 | 109: 'brain coral',
111 | 110: 'flatworm, platyhelminth',
112 | 111: 'nematode, nematode worm, roundworm',
113 | 112: 'conch',
114 | 113: 'snail',
115 | 114: 'slug',
116 | 115: 'sea slug, nudibranch',
117 | 116: 'chiton, coat-of-mail shell, sea cradle, polyplacophore',
118 | 117: 'chambered nautilus, pearly nautilus, nautilus',
119 | 118: 'Dungeness crab, Cancer magister',
120 | 119: 'rock crab, Cancer irroratus',
121 | 120: 'fiddler crab',
122 | 121: 'king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica',
123 | 122: 'American lobster, Northern lobster, Maine lobster, Homarus americanus',
124 | 123: 'spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish',
125 | 124: 'crayfish, crawfish, crawdad, crawdaddy',
126 | 125: 'hermit crab',
127 | 126: 'isopod',
128 | 127: 'white stork, Ciconia ciconia',
129 | 128: 'black stork, Ciconia nigra',
130 | 129: 'spoonbill',
131 | 130: 'flamingo',
132 | 131: 'little blue heron, Egretta caerulea',
133 | 132: 'American egret, great white heron, Egretta albus',
134 | 133: 'bittern',
135 | 134: 'crane',
136 | 135: 'limpkin, Aramus pictus',
137 | 136: 'European gallinule, Porphyrio porphyrio',
138 | 137: 'American coot, marsh hen, mud hen, water hen, Fulica americana',
139 | 138: 'bustard',
140 | 139: 'ruddy turnstone, Arenaria interpres',
141 | 140: 'red-backed sandpiper, dunlin, Erolia alpina',
142 | 141: 'redshank, Tringa totanus',
143 | 142: 'dowitcher',
144 | 143: 'oystercatcher, oyster catcher',
145 | 144: 'pelican',
146 | 145: 'king penguin, Aptenodytes patagonica',
147 | 146: 'albatross, mollymawk',
148 | 147: 'grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus',
149 | 148: 'killer whale, killer, orca, grampus, sea wolf, Orcinus orca',
150 | 149: 'dugong, Dugong dugon',
151 | 150: 'sea lion',
152 | 151: 'Chihuahua',
153 | 152: 'Japanese spaniel',
154 | 153: 'Maltese dog, Maltese terrier, Maltese',
155 | 154: 'Pekinese, Pekingese, Peke',
156 | 155: 'Shih-Tzu',
157 | 156: 'Blenheim spaniel',
158 | 157: 'papillon',
159 | 158: 'toy terrier',
160 | 159: 'Rhodesian ridgeback',
161 | 160: 'Afghan hound, Afghan',
162 | 161: 'basset, basset hound',
163 | 162: 'beagle',
164 | 163: 'bloodhound, sleuthhound',
165 | 164: 'bluetick',
166 | 165: 'black-and-tan coonhound',
167 | 166: 'Walker hound, Walker foxhound',
168 | 167: 'English foxhound',
169 | 168: 'redbone',
170 | 169: 'borzoi, Russian wolfhound',
171 | 170: 'Irish wolfhound',
172 | 171: 'Italian greyhound',
173 | 172: 'whippet',
174 | 173: 'Ibizan hound, Ibizan Podenco',
175 | 174: 'Norwegian elkhound, elkhound',
176 | 175: 'otterhound, otter hound',
177 | 176: 'Saluki, gazelle hound',
178 | 177: 'Scottish deerhound, deerhound',
179 | 178: 'Weimaraner',
180 | 179: 'Staffordshire bullterrier, Staffordshire bull terrier',
181 | 180: 'American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier',
182 | 181: 'Bedlington terrier',
183 | 182: 'Border terrier',
184 | 183: 'Kerry blue terrier',
185 | 184: 'Irish terrier',
186 | 185: 'Norfolk terrier',
187 | 186: 'Norwich terrier',
188 | 187: 'Yorkshire terrier',
189 | 188: 'wire-haired fox terrier',
190 | 189: 'Lakeland terrier',
191 | 190: 'Sealyham terrier, Sealyham',
192 | 191: 'Airedale, Airedale terrier',
193 | 192: 'cairn, cairn terrier',
194 | 193: 'Australian terrier',
195 | 194: 'Dandie Dinmont, Dandie Dinmont terrier',
196 | 195: 'Boston bull, Boston terrier',
197 | 196: 'miniature schnauzer',
198 | 197: 'giant schnauzer',
199 | 198: 'standard schnauzer',
200 | 199: 'Scotch terrier, Scottish terrier, Scottie',
201 | 200: 'Tibetan terrier, chrysanthemum dog',
202 | 201: 'silky terrier, Sydney silky',
203 | 202: 'soft-coated wheaten terrier',
204 | 203: 'West Highland white terrier',
205 | 204: 'Lhasa, Lhasa apso',
206 | 205: 'flat-coated retriever',
207 | 206: 'curly-coated retriever',
208 | 207: 'golden retriever',
209 | 208: 'Labrador retriever',
210 | 209: 'Chesapeake Bay retriever',
211 | 210: 'German short-haired pointer',
212 | 211: 'vizsla, Hungarian pointer',
213 | 212: 'English setter',
214 | 213: 'Irish setter, red setter',
215 | 214: 'Gordon setter',
216 | 215: 'Brittany spaniel',
217 | 216: 'clumber, clumber spaniel',
218 | 217: 'English springer, English springer spaniel',
219 | 218: 'Welsh springer spaniel',
220 | 219: 'cocker spaniel, English cocker spaniel, cocker',
221 | 220: 'Sussex spaniel',
222 | 221: 'Irish water spaniel',
223 | 222: 'kuvasz',
224 | 223: 'schipperke',
225 | 224: 'groenendael',
226 | 225: 'malinois',
227 | 226: 'briard',
228 | 227: 'kelpie',
229 | 228: 'komondor',
230 | 229: 'Old English sheepdog, bobtail',
231 | 230: 'Shetland sheepdog, Shetland sheep dog, Shetland',
232 | 231: 'collie',
233 | 232: 'Border collie',
234 | 233: 'Bouvier des Flandres, Bouviers des Flandres',
235 | 234: 'Rottweiler',
236 | 235: 'German shepherd, German shepherd dog, German police dog, alsatian',
237 | 236: 'Doberman, Doberman pinscher',
238 | 237: 'miniature pinscher',
239 | 238: 'Greater Swiss Mountain dog',
240 | 239: 'Bernese mountain dog',
241 | 240: 'Appenzeller',
242 | 241: 'EntleBucher',
243 | 242: 'boxer',
244 | 243: 'bull mastiff',
245 | 244: 'Tibetan mastiff',
246 | 245: 'French bulldog',
247 | 246: 'Great Dane',
248 | 247: 'Saint Bernard, St Bernard',
249 | 248: 'Eskimo dog, husky',
250 | 249: 'malamute, malemute, Alaskan malamute',
251 | 250: 'Siberian husky',
252 | 251: 'dalmatian, coach dog, carriage dog',
253 | 252: 'affenpinscher, monkey pinscher, monkey dog',
254 | 253: 'basenji',
255 | 254: 'pug, pug-dog',
256 | 255: 'Leonberg',
257 | 256: 'Newfoundland, Newfoundland dog',
258 | 257: 'Great Pyrenees',
259 | 258: 'Samoyed, Samoyede',
260 | 259: 'Pomeranian',
261 | 260: 'chow, chow chow',
262 | 261: 'keeshond',
263 | 262: 'Brabancon griffon',
264 | 263: 'Pembroke, Pembroke Welsh corgi',
265 | 264: 'Cardigan, Cardigan Welsh corgi',
266 | 265: 'toy poodle',
267 | 266: 'miniature poodle',
268 | 267: 'standard poodle',
269 | 268: 'Mexican hairless',
270 | 269: 'timber wolf, grey wolf, gray wolf, Canis lupus',
271 | 270: 'white wolf, Arctic wolf, Canis lupus tundrarum',
272 | 271: 'red wolf, maned wolf, Canis rufus, Canis niger',
273 | 272: 'coyote, prairie wolf, brush wolf, Canis latrans',
274 | 273: 'dingo, warrigal, warragal, Canis dingo',
275 | 274: 'dhole, Cuon alpinus',
276 | 275: 'African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus',
277 | 276: 'hyena, hyaena',
278 | 277: 'red fox, Vulpes vulpes',
279 | 278: 'kit fox, Vulpes macrotis',
280 | 279: 'Arctic fox, white fox, Alopex lagopus',
281 | 280: 'grey fox, gray fox, Urocyon cinereoargenteus',
282 | 281: 'tabby, tabby cat',
283 | 282: 'tiger cat',
284 | 283: 'Persian cat',
285 | 284: 'Siamese cat, Siamese',
286 | 285: 'Egyptian cat',
287 | 286: 'cougar, puma, catamount, mountain lion, painter, panther, Felis concolor',
288 | 287: 'lynx, catamount',
289 | 288: 'leopard, Panthera pardus',
290 | 289: 'snow leopard, ounce, Panthera uncia',
291 | 290: 'jaguar, panther, Panthera onca, Felis onca',
292 | 291: 'lion, king of beasts, Panthera leo',
293 | 292: 'tiger, Panthera tigris',
294 | 293: 'cheetah, chetah, Acinonyx jubatus',
295 | 294: 'brown bear, bruin, Ursus arctos',
296 | 295: 'American black bear, black bear, Ursus americanus, Euarctos americanus',
297 | 296: 'ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus',
298 | 297: 'sloth bear, Melursus ursinus, Ursus ursinus',
299 | 298: 'mongoose',
300 | 299: 'meerkat, mierkat',
301 | 300: 'tiger beetle',
302 | 301: 'ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle',
303 | 302: 'ground beetle, carabid beetle',
304 | 303: 'long-horned beetle, longicorn, longicorn beetle',
305 | 304: 'leaf beetle, chrysomelid',
306 | 305: 'dung beetle',
307 | 306: 'rhinoceros beetle',
308 | 307: 'weevil',
309 | 308: 'fly',
310 | 309: 'bee',
311 | 310: 'ant, emmet, pismire',
312 | 311: 'grasshopper, hopper',
313 | 312: 'cricket',
314 | 313: 'walking stick, walkingstick, stick insect',
315 | 314: 'cockroach, roach',
316 | 315: 'mantis, mantid',
317 | 316: 'cicada, cicala',
318 | 317: 'leafhopper',
319 | 318: 'lacewing, lacewing fly',
320 | 319: "dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk",
321 | 320: 'damselfly',
322 | 321: 'admiral',
323 | 322: 'ringlet, ringlet butterfly',
324 | 323: 'monarch, monarch butterfly, milkweed butterfly, Danaus plexippus',
325 | 324: 'cabbage butterfly',
326 | 325: 'sulphur butterfly, sulfur butterfly',
327 | 326: 'lycaenid, lycaenid butterfly',
328 | 327: 'starfish, sea star',
329 | 328: 'sea urchin',
330 | 329: 'sea cucumber, holothurian',
331 | 330: 'wood rabbit, cottontail, cottontail rabbit',
332 | 331: 'hare',
333 | 332: 'Angora, Angora rabbit',
334 | 333: 'hamster',
335 | 334: 'porcupine, hedgehog',
336 | 335: 'fox squirrel, eastern fox squirrel, Sciurus niger',
337 | 336: 'marmot',
338 | 337: 'beaver',
339 | 338: 'guinea pig, Cavia cobaya',
340 | 339: 'sorrel',
341 | 340: 'zebra',
342 | 341: 'hog, pig, grunter, squealer, Sus scrofa',
343 | 342: 'wild boar, boar, Sus scrofa',
344 | 343: 'warthog',
345 | 344: 'hippopotamus, hippo, river horse, Hippopotamus amphibius',
346 | 345: 'ox',
347 | 346: 'water buffalo, water ox, Asiatic buffalo, Bubalus bubalis',
348 | 347: 'bison',
349 | 348: 'ram, tup',
350 | 349: 'bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis',
351 | 350: 'ibex, Capra ibex',
352 | 351: 'hartebeest',
353 | 352: 'impala, Aepyceros melampus',
354 | 353: 'gazelle',
355 | 354: 'Arabian camel, dromedary, Camelus dromedarius',
356 | 355: 'llama',
357 | 356: 'weasel',
358 | 357: 'mink',
359 | 358: 'polecat, fitch, foulmart, foumart, Mustela putorius',
360 | 359: 'black-footed ferret, ferret, Mustela nigripes',
361 | 360: 'otter',
362 | 361: 'skunk, polecat, wood pussy',
363 | 362: 'badger',
364 | 363: 'armadillo',
365 | 364: 'three-toed sloth, ai, Bradypus tridactylus',
366 | 365: 'orangutan, orang, orangutang, Pongo pygmaeus',
367 | 366: 'gorilla, Gorilla gorilla',
368 | 367: 'chimpanzee, chimp, Pan troglodytes',
369 | 368: 'gibbon, Hylobates lar',
370 | 369: 'siamang, Hylobates syndactylus, Symphalangus syndactylus',
371 | 370: 'guenon, guenon monkey',
372 | 371: 'patas, hussar monkey, Erythrocebus patas',
373 | 372: 'baboon',
374 | 373: 'macaque',
375 | 374: 'langur',
376 | 375: 'colobus, colobus monkey',
377 | 376: 'proboscis monkey, Nasalis larvatus',
378 | 377: 'marmoset',
379 | 378: 'capuchin, ringtail, Cebus capucinus',
380 | 379: 'howler monkey, howler',
381 | 380: 'titi, titi monkey',
382 | 381: 'spider monkey, Ateles geoffroyi',
383 | 382: 'squirrel monkey, Saimiri sciureus',
384 | 383: 'Madagascar cat, ring-tailed lemur, Lemur catta',
385 | 384: 'indri, indris, Indri indri, Indri brevicaudatus',
386 | 385: 'Indian elephant, Elephas maximus',
387 | 386: 'African elephant, Loxodonta africana',
388 | 387: 'lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens',
389 | 388: 'giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca',
390 | 389: 'barracouta, snoek',
391 | 390: 'eel',
392 | 391: 'coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch',
393 | 392: 'rock beauty, Holocanthus tricolor',
394 | 393: 'anemone fish',
395 | 394: 'sturgeon',
396 | 395: 'gar, garfish, garpike, billfish, Lepisosteus osseus',
397 | 396: 'lionfish',
398 | 397: 'puffer, pufferfish, blowfish, globefish',
399 | 398: 'abacus',
400 | 399: 'abaya',
401 | 400: "academic gown, academic robe, judge's robe",
402 | 401: 'accordion, piano accordion, squeeze box',
403 | 402: 'acoustic guitar',
404 | 403: 'aircraft carrier, carrier, flattop, attack aircraft carrier',
405 | 404: 'airliner',
406 | 405: 'airship, dirigible',
407 | 406: 'altar',
408 | 407: 'ambulance',
409 | 408: 'amphibian, amphibious vehicle',
410 | 409: 'analog clock',
411 | 410: 'apiary, bee house',
412 | 411: 'apron',
413 | 412: 'ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin',
414 | 413: 'assault rifle, assault gun',
415 | 414: 'backpack, back pack, knapsack, packsack, rucksack, haversack',
416 | 415: 'bakery, bakeshop, bakehouse',
417 | 416: 'balance beam, beam',
418 | 417: 'balloon',
419 | 418: 'ballpoint, ballpoint pen, ballpen, Biro',
420 | 419: 'Band Aid',
421 | 420: 'banjo',
422 | 421: 'bannister, banister, balustrade, balusters, handrail',
423 | 422: 'barbell',
424 | 423: 'barber chair',
425 | 424: 'barbershop',
426 | 425: 'barn',
427 | 426: 'barometer',
428 | 427: 'barrel, cask',
429 | 428: 'barrow, garden cart, lawn cart, wheelbarrow',
430 | 429: 'baseball',
431 | 430: 'basketball',
432 | 431: 'bassinet',
433 | 432: 'bassoon',
434 | 433: 'bathing cap, swimming cap',
435 | 434: 'bath towel',
436 | 435: 'bathtub, bathing tub, bath, tub',
437 | 436: 'beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon',
438 | 437: 'beacon, lighthouse, beacon light, pharos',
439 | 438: 'beaker',
440 | 439: 'bearskin, busby, shako',
441 | 440: 'beer bottle',
442 | 441: 'beer glass',
443 | 442: 'bell cote, bell cot',
444 | 443: 'bib',
445 | 444: 'bicycle-built-for-two, tandem bicycle, tandem',
446 | 445: 'bikini, two-piece',
447 | 446: 'binder, ring-binder',
448 | 447: 'binoculars, field glasses, opera glasses',
449 | 448: 'birdhouse',
450 | 449: 'boathouse',
451 | 450: 'bobsled, bobsleigh, bob',
452 | 451: 'bolo tie, bolo, bola tie, bola',
453 | 452: 'bonnet, poke bonnet',
454 | 453: 'bookcase',
455 | 454: 'bookshop, bookstore, bookstall',
456 | 455: 'bottlecap',
457 | 456: 'bow',
458 | 457: 'bow tie, bow-tie, bowtie',
459 | 458: 'brass, memorial tablet, plaque',
460 | 459: 'brassiere, bra, bandeau',
461 | 460: 'breakwater, groin, groyne, mole, bulwark, seawall, jetty',
462 | 461: 'breastplate, aegis, egis',
463 | 462: 'broom',
464 | 463: 'bucket, pail',
465 | 464: 'buckle',
466 | 465: 'bulletproof vest',
467 | 466: 'bullet train, bullet',
468 | 467: 'butcher shop, meat market',
469 | 468: 'cab, hack, taxi, taxicab',
470 | 469: 'caldron, cauldron',
471 | 470: 'candle, taper, wax light',
472 | 471: 'cannon',
473 | 472: 'canoe',
474 | 473: 'can opener, tin opener',
475 | 474: 'cardigan',
476 | 475: 'car mirror',
477 | 476: 'carousel, carrousel, merry-go-round, roundabout, whirligig',
478 | 477: "carpenter's kit, tool kit",
479 | 478: 'carton',
480 | 479: 'car wheel',
481 | 480: 'cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM',
482 | 481: 'cassette',
483 | 482: 'cassette player',
484 | 483: 'castle',
485 | 484: 'catamaran',
486 | 485: 'CD player',
487 | 486: 'cello, violoncello',
488 | 487: 'cellular telephone, cellular phone, cellphone, cell, mobile phone',
489 | 488: 'chain',
490 | 489: 'chainlink fence',
491 | 490: 'chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour',
492 | 491: 'chain saw, chainsaw',
493 | 492: 'chest',
494 | 493: 'chiffonier, commode',
495 | 494: 'chime, bell, gong',
496 | 495: 'china cabinet, china closet',
497 | 496: 'Christmas stocking',
498 | 497: 'church, church building',
499 | 498: 'cinema, movie theater, movie theatre, movie house, picture palace',
500 | 499: 'cleaver, meat cleaver, chopper',
501 | 500: 'cliff dwelling',
502 | 501: 'cloak',
503 | 502: 'clog, geta, patten, sabot',
504 | 503: 'cocktail shaker',
505 | 504: 'coffee mug',
506 | 505: 'coffeepot',
507 | 506: 'coil, spiral, volute, whorl, helix',
508 | 507: 'combination lock',
509 | 508: 'computer keyboard, keypad',
510 | 509: 'confectionery, confectionary, candy store',
511 | 510: 'container ship, containership, container vessel',
512 | 511: 'convertible',
513 | 512: 'corkscrew, bottle screw',
514 | 513: 'cornet, horn, trumpet, trump',
515 | 514: 'cowboy boot',
516 | 515: 'cowboy hat, ten-gallon hat',
517 | 516: 'cradle',
518 | 517: 'crane',
519 | 518: 'crash helmet',
520 | 519: 'crate',
521 | 520: 'crib, cot',
522 | 521: 'Crock Pot',
523 | 522: 'croquet ball',
524 | 523: 'crutch',
525 | 524: 'cuirass',
526 | 525: 'dam, dike, dyke',
527 | 526: 'desk',
528 | 527: 'desktop computer',
529 | 528: 'dial telephone, dial phone',
530 | 529: 'diaper, nappy, napkin',
531 | 530: 'digital clock',
532 | 531: 'digital watch',
533 | 532: 'dining table, board',
534 | 533: 'dishrag, dishcloth',
535 | 534: 'dishwasher, dish washer, dishwashing machine',
536 | 535: 'disk brake, disc brake',
537 | 536: 'dock, dockage, docking facility',
538 | 537: 'dogsled, dog sled, dog sleigh',
539 | 538: 'dome',
540 | 539: 'doormat, welcome mat',
541 | 540: 'drilling platform, offshore rig',
542 | 541: 'drum, membranophone, tympan',
543 | 542: 'drumstick',
544 | 543: 'dumbbell',
545 | 544: 'Dutch oven',
546 | 545: 'electric fan, blower',
547 | 546: 'electric guitar',
548 | 547: 'electric locomotive',
549 | 548: 'entertainment center',
550 | 549: 'envelope',
551 | 550: 'espresso maker',
552 | 551: 'face powder',
553 | 552: 'feather boa, boa',
554 | 553: 'file, file cabinet, filing cabinet',
555 | 554: 'fireboat',
556 | 555: 'fire engine, fire truck',
557 | 556: 'fire screen, fireguard',
558 | 557: 'flagpole, flagstaff',
559 | 558: 'flute, transverse flute',
560 | 559: 'folding chair',
561 | 560: 'football helmet',
562 | 561: 'forklift',
563 | 562: 'fountain',
564 | 563: 'fountain pen',
565 | 564: 'four-poster',
566 | 565: 'freight car',
567 | 566: 'French horn, horn',
568 | 567: 'frying pan, frypan, skillet',
569 | 568: 'fur coat',
570 | 569: 'garbage truck, dustcart',
571 | 570: 'gasmask, respirator, gas helmet',
572 | 571: 'gas pump, gasoline pump, petrol pump, island dispenser',
573 | 572: 'goblet',
574 | 573: 'go-kart',
575 | 574: 'golf ball',
576 | 575: 'golfcart, golf cart',
577 | 576: 'gondola',
578 | 577: 'gong, tam-tam',
579 | 578: 'gown',
580 | 579: 'grand piano, grand',
581 | 580: 'greenhouse, nursery, glasshouse',
582 | 581: 'grille, radiator grille',
583 | 582: 'grocery store, grocery, food market, market',
584 | 583: 'guillotine',
585 | 584: 'hair slide',
586 | 585: 'hair spray',
587 | 586: 'half track',
588 | 587: 'hammer',
589 | 588: 'hamper',
590 | 589: 'hand blower, blow dryer, blow drier, hair dryer, hair drier',
591 | 590: 'hand-held computer, hand-held microcomputer',
592 | 591: 'handkerchief, hankie, hanky, hankey',
593 | 592: 'hard disc, hard disk, fixed disk',
594 | 593: 'harmonica, mouth organ, harp, mouth harp',
595 | 594: 'harp',
596 | 595: 'harvester, reaper',
597 | 596: 'hatchet',
598 | 597: 'holster',
599 | 598: 'home theater, home theatre',
600 | 599: 'honeycomb',
601 | 600: 'hook, claw',
602 | 601: 'hoopskirt, crinoline',
603 | 602: 'horizontal bar, high bar',
604 | 603: 'horse cart, horse-cart',
605 | 604: 'hourglass',
606 | 605: 'iPod',
607 | 606: 'iron, smoothing iron',
608 | 607: "jack-o'-lantern",
609 | 608: 'jean, blue jean, denim',
610 | 609: 'jeep, landrover',
611 | 610: 'jersey, T-shirt, tee shirt',
612 | 611: 'jigsaw puzzle',
613 | 612: 'jinrikisha, ricksha, rickshaw',
614 | 613: 'joystick',
615 | 614: 'kimono',
616 | 615: 'knee pad',
617 | 616: 'knot',
618 | 617: 'lab coat, laboratory coat',
619 | 618: 'ladle',
620 | 619: 'lampshade, lamp shade',
621 | 620: 'laptop, laptop computer',
622 | 621: 'lawn mower, mower',
623 | 622: 'lens cap, lens cover',
624 | 623: 'letter opener, paper knife, paperknife',
625 | 624: 'library',
626 | 625: 'lifeboat',
627 | 626: 'lighter, light, igniter, ignitor',
628 | 627: 'limousine, limo',
629 | 628: 'liner, ocean liner',
630 | 629: 'lipstick, lip rouge',
631 | 630: 'Loafer',
632 | 631: 'lotion',
633 | 632: 'loudspeaker, speaker, speaker unit, loudspeaker system, speaker system',
634 | 633: "loupe, jeweler's loupe",
635 | 634: 'lumbermill, sawmill',
636 | 635: 'magnetic compass',
637 | 636: 'mailbag, postbag',
638 | 637: 'mailbox, letter box',
639 | 638: 'maillot',
640 | 639: 'maillot, tank suit',
641 | 640: 'manhole cover',
642 | 641: 'maraca',
643 | 642: 'marimba, xylophone',
644 | 643: 'mask',
645 | 644: 'matchstick',
646 | 645: 'maypole',
647 | 646: 'maze, labyrinth',
648 | 647: 'measuring cup',
649 | 648: 'medicine chest, medicine cabinet',
650 | 649: 'megalith, megalithic structure',
651 | 650: 'microphone, mike',
652 | 651: 'microwave, microwave oven',
653 | 652: 'military uniform',
654 | 653: 'milk can',
655 | 654: 'minibus',
656 | 655: 'miniskirt, mini',
657 | 656: 'minivan',
658 | 657: 'missile',
659 | 658: 'mitten',
660 | 659: 'mixing bowl',
661 | 660: 'mobile home, manufactured home',
662 | 661: 'Model T',
663 | 662: 'modem',
664 | 663: 'monastery',
665 | 664: 'monitor',
666 | 665: 'moped',
667 | 666: 'mortar',
668 | 667: 'mortarboard',
669 | 668: 'mosque',
670 | 669: 'mosquito net',
671 | 670: 'motor scooter, scooter',
672 | 671: 'mountain bike, all-terrain bike, off-roader',
673 | 672: 'mountain tent',
674 | 673: 'mouse, computer mouse',
675 | 674: 'mousetrap',
676 | 675: 'moving van',
677 | 676: 'muzzle',
678 | 677: 'nail',
679 | 678: 'neck brace',
680 | 679: 'necklace',
681 | 680: 'nipple',
682 | 681: 'notebook, notebook computer',
683 | 682: 'obelisk',
684 | 683: 'oboe, hautboy, hautbois',
685 | 684: 'ocarina, sweet potato',
686 | 685: 'odometer, hodometer, mileometer, milometer',
687 | 686: 'oil filter',
688 | 687: 'organ, pipe organ',
689 | 688: 'oscilloscope, scope, cathode-ray oscilloscope, CRO',
690 | 689: 'overskirt',
691 | 690: 'oxcart',
692 | 691: 'oxygen mask',
693 | 692: 'packet',
694 | 693: 'paddle, boat paddle',
695 | 694: 'paddlewheel, paddle wheel',
696 | 695: 'padlock',
697 | 696: 'paintbrush',
698 | 697: "pajama, pyjama, pj's, jammies",
699 | 698: 'palace',
700 | 699: 'panpipe, pandean pipe, syrinx',
701 | 700: 'paper towel',
702 | 701: 'parachute, chute',
703 | 702: 'parallel bars, bars',
704 | 703: 'park bench',
705 | 704: 'parking meter',
706 | 705: 'passenger car, coach, carriage',
707 | 706: 'patio, terrace',
708 | 707: 'pay-phone, pay-station',
709 | 708: 'pedestal, plinth, footstall',
710 | 709: 'pencil box, pencil case',
711 | 710: 'pencil sharpener',
712 | 711: 'perfume, essence',
713 | 712: 'Petri dish',
714 | 713: 'photocopier',
715 | 714: 'pick, plectrum, plectron',
716 | 715: 'pickelhaube',
717 | 716: 'picket fence, paling',
718 | 717: 'pickup, pickup truck',
719 | 718: 'pier',
720 | 719: 'piggy bank, penny bank',
721 | 720: 'pill bottle',
722 | 721: 'pillow',
723 | 722: 'ping-pong ball',
724 | 723: 'pinwheel',
725 | 724: 'pirate, pirate ship',
726 | 725: 'pitcher, ewer',
727 | 726: "plane, carpenter's plane, woodworking plane",
728 | 727: 'planetarium',
729 | 728: 'plastic bag',
730 | 729: 'plate rack',
731 | 730: 'plow, plough',
732 | 731: "plunger, plumber's helper",
733 | 732: 'Polaroid camera, Polaroid Land camera',
734 | 733: 'pole',
735 | 734: 'police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria',
736 | 735: 'poncho',
737 | 736: 'pool table, billiard table, snooker table',
738 | 737: 'pop bottle, soda bottle',
739 | 738: 'pot, flowerpot',
740 | 739: "potter's wheel",
741 | 740: 'power drill',
742 | 741: 'prayer rug, prayer mat',
743 | 742: 'printer',
744 | 743: 'prison, prison house',
745 | 744: 'projectile, missile',
746 | 745: 'projector',
747 | 746: 'puck, hockey puck',
748 | 747: 'punching bag, punch bag, punching ball, punchball',
749 | 748: 'purse',
750 | 749: 'quill, quill pen',
751 | 750: 'quilt, comforter, comfort, puff',
752 | 751: 'racer, race car, racing car',
753 | 752: 'racket, racquet',
754 | 753: 'radiator',
755 | 754: 'radio, wireless',
756 | 755: 'radio telescope, radio reflector',
757 | 756: 'rain barrel',
758 | 757: 'recreational vehicle, RV, R.V.',
759 | 758: 'reel',
760 | 759: 'reflex camera',
761 | 760: 'refrigerator, icebox',
762 | 761: 'remote control, remote',
763 | 762: 'restaurant, eating house, eating place, eatery',
764 | 763: 'revolver, six-gun, six-shooter',
765 | 764: 'rifle',
766 | 765: 'rocking chair, rocker',
767 | 766: 'rotisserie',
768 | 767: 'rubber eraser, rubber, pencil eraser',
769 | 768: 'rugby ball',
770 | 769: 'rule, ruler',
771 | 770: 'running shoe',
772 | 771: 'safe',
773 | 772: 'safety pin',
774 | 773: 'saltshaker, salt shaker',
775 | 774: 'sandal',
776 | 775: 'sarong',
777 | 776: 'sax, saxophone',
778 | 777: 'scabbard',
779 | 778: 'scale, weighing machine',
780 | 779: 'school bus',
781 | 780: 'schooner',
782 | 781: 'scoreboard',
783 | 782: 'screen, CRT screen',
784 | 783: 'screw',
785 | 784: 'screwdriver',
786 | 785: 'seat belt, seatbelt',
787 | 786: 'sewing machine',
788 | 787: 'shield, buckler',
789 | 788: 'shoe shop, shoe-shop, shoe store',
790 | 789: 'shoji',
791 | 790: 'shopping basket',
792 | 791: 'shopping cart',
793 | 792: 'shovel',
794 | 793: 'shower cap',
795 | 794: 'shower curtain',
796 | 795: 'ski',
797 | 796: 'ski mask',
798 | 797: 'sleeping bag',
799 | 798: 'slide rule, slipstick',
800 | 799: 'sliding door',
801 | 800: 'slot, one-armed bandit',
802 | 801: 'snorkel',
803 | 802: 'snowmobile',
804 | 803: 'snowplow, snowplough',
805 | 804: 'soap dispenser',
806 | 805: 'soccer ball',
807 | 806: 'sock',
808 | 807: 'solar dish, solar collector, solar furnace',
809 | 808: 'sombrero',
810 | 809: 'soup bowl',
811 | 810: 'space bar',
812 | 811: 'space heater',
813 | 812: 'space shuttle',
814 | 813: 'spatula',
815 | 814: 'speedboat',
816 | 815: "spider web, spider's web",
817 | 816: 'spindle',
818 | 817: 'sports car, sport car',
819 | 818: 'spotlight, spot',
820 | 819: 'stage',
821 | 820: 'steam locomotive',
822 | 821: 'steel arch bridge',
823 | 822: 'steel drum',
824 | 823: 'stethoscope',
825 | 824: 'stole',
826 | 825: 'stone wall',
827 | 826: 'stopwatch, stop watch',
828 | 827: 'stove',
829 | 828: 'strainer',
830 | 829: 'streetcar, tram, tramcar, trolley, trolley car',
831 | 830: 'stretcher',
832 | 831: 'studio couch, day bed',
833 | 832: 'stupa, tope',
834 | 833: 'submarine, pigboat, sub, U-boat',
835 | 834: 'suit, suit of clothes',
836 | 835: 'sundial',
837 | 836: 'sunglass',
838 | 837: 'sunglasses, dark glasses, shades',
839 | 838: 'sunscreen, sunblock, sun blocker',
840 | 839: 'suspension bridge',
841 | 840: 'swab, swob, mop',
842 | 841: 'sweatshirt',
843 | 842: 'swimming trunks, bathing trunks',
844 | 843: 'swing',
845 | 844: 'switch, electric switch, electrical switch',
846 | 845: 'syringe',
847 | 846: 'table lamp',
848 | 847: 'tank, army tank, armored combat vehicle, armoured combat vehicle',
849 | 848: 'tape player',
850 | 849: 'teapot',
851 | 850: 'teddy, teddy bear',
852 | 851: 'television, television system',
853 | 852: 'tennis ball',
854 | 853: 'thatch, thatched roof',
855 | 854: 'theater curtain, theatre curtain',
856 | 855: 'thimble',
857 | 856: 'thresher, thrasher, threshing machine',
858 | 857: 'throne',
859 | 858: 'tile roof',
860 | 859: 'toaster',
861 | 860: 'tobacco shop, tobacconist shop, tobacconist',
862 | 861: 'toilet seat',
863 | 862: 'torch',
864 | 863: 'totem pole',
865 | 864: 'tow truck, tow car, wrecker',
866 | 865: 'toyshop',
867 | 866: 'tractor',
868 | 867: 'trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi',
869 | 868: 'tray',
870 | 869: 'trench coat',
871 | 870: 'tricycle, trike, velocipede',
872 | 871: 'trimaran',
873 | 872: 'tripod',
874 | 873: 'triumphal arch',
875 | 874: 'trolleybus, trolley coach, trackless trolley',
876 | 875: 'trombone',
877 | 876: 'tub, vat',
878 | 877: 'turnstile',
879 | 878: 'typewriter keyboard',
880 | 879: 'umbrella',
881 | 880: 'unicycle, monocycle',
882 | 881: 'upright, upright piano',
883 | 882: 'vacuum, vacuum cleaner',
884 | 883: 'vase',
885 | 884: 'vault',
886 | 885: 'velvet',
887 | 886: 'vending machine',
888 | 887: 'vestment',
889 | 888: 'viaduct',
890 | 889: 'violin, fiddle',
891 | 890: 'volleyball',
892 | 891: 'waffle iron',
893 | 892: 'wall clock',
894 | 893: 'wallet, billfold, notecase, pocketbook',
895 | 894: 'wardrobe, closet, press',
896 | 895: 'warplane, military plane',
897 | 896: 'washbasin, handbasin, washbowl, lavabo, wash-hand basin',
898 | 897: 'washer, automatic washer, washing machine',
899 | 898: 'water bottle',
900 | 899: 'water jug',
901 | 900: 'water tower',
902 | 901: 'whiskey jug',
903 | 902: 'whistle',
904 | 903: 'wig',
905 | 904: 'window screen',
906 | 905: 'window shade',
907 | 906: 'Windsor tie',
908 | 907: 'wine bottle',
909 | 908: 'wing',
910 | 909: 'wok',
911 | 910: 'wooden spoon',
912 | 911: 'wool, woolen, woollen',
913 | 912: 'worm fence, snake fence, snake-rail fence, Virginia fence',
914 | 913: 'wreck',
915 | 914: 'yawl',
916 | 915: 'yurt',
917 | 916: 'web site, website, internet site, site',
918 | 917: 'comic book',
919 | 918: 'crossword puzzle, crossword',
920 | 919: 'street sign',
921 | 920: 'traffic light, traffic signal, stoplight',
922 | 921: 'book jacket, dust cover, dust jacket, dust wrapper',
923 | 922: 'menu',
924 | 923: 'plate',
925 | 924: 'guacamole',
926 | 925: 'consomme',
927 | 926: 'hot pot, hotpot',
928 | 927: 'trifle',
929 | 928: 'ice cream, icecream',
930 | 929: 'ice lolly, lolly, lollipop, popsicle',
931 | 930: 'French loaf',
932 | 931: 'bagel, beigel',
933 | 932: 'pretzel',
934 | 933: 'cheeseburger',
935 | 934: 'hotdog, hot dog, red hot',
936 | 935: 'mashed potato',
937 | 936: 'head cabbage',
938 | 937: 'broccoli',
939 | 938: 'cauliflower',
940 | 939: 'zucchini, courgette',
941 | 940: 'spaghetti squash',
942 | 941: 'acorn squash',
943 | 942: 'butternut squash',
944 | 943: 'cucumber, cuke',
945 | 944: 'artichoke, globe artichoke',
946 | 945: 'bell pepper',
947 | 946: 'cardoon',
948 | 947: 'mushroom',
949 | 948: 'Granny Smith',
950 | 949: 'strawberry',
951 | 950: 'orange',
952 | 951: 'lemon',
953 | 952: 'fig',
954 | 953: 'pineapple, ananas',
955 | 954: 'banana',
956 | 955: 'jackfruit, jak, jack',
957 | 956: 'custard apple',
958 | 957: 'pomegranate',
959 | 958: 'hay',
960 | 959: 'carbonara',
961 | 960: 'chocolate sauce, chocolate syrup',
962 | 961: 'dough',
963 | 962: 'meat loaf, meatloaf',
964 | 963: 'pizza, pizza pie',
965 | 964: 'potpie',
966 | 965: 'burrito',
967 | 966: 'red wine',
968 | 967: 'espresso',
969 | 968: 'cup',
970 | 969: 'eggnog',
971 | 970: 'alp',
972 | 971: 'bubble',
973 | 972: 'cliff, drop, drop-off',
974 | 973: 'coral reef',
975 | 974: 'geyser',
976 | 975: 'lakeside, lakeshore',
977 | 976: 'promontory, headland, head, foreland',
978 | 977: 'sandbar, sand bar',
979 | 978: 'seashore, coast, seacoast, sea-coast',
980 | 979: 'valley, vale',
981 | 980: 'volcano',
982 | 981: 'ballplayer, baseball player',
983 | 982: 'groom, bridegroom',
984 | 983: 'scuba diver',
985 | 984: 'rapeseed',
986 | 985: 'daisy',
987 | 986: "yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum",
988 | 987: 'corn',
989 | 988: 'acorn',
990 | 989: 'hip, rose hip, rosehip',
991 | 990: 'buckeye, horse chestnut, conker',
992 | 991: 'coral fungus',
993 | 992: 'agaric',
994 | 993: 'gyromitra',
995 | 994: 'stinkhorn, carrion fungus',
996 | 995: 'earthstar',
997 | 996: 'hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa',
998 | 997: 'bolete',
999 | 998: 'ear, spike, capitulum',
1000 | 999: 'toilet tissue, toilet paper, bathroom tissue'}
--------------------------------------------------------------------------------
/misc/teaser.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UMBCvision/fooling_network_interpretation/46e910cdfb578eda2698a5a4a0110482e1c4d1a0/misc/teaser.jpg
--------------------------------------------------------------------------------
/results/ILSVRC2012_val_00003784_our_adv_patch_gcam.JPEG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UMBCvision/fooling_network_interpretation/46e910cdfb578eda2698a5a4a0110482e1c4d1a0/results/ILSVRC2012_val_00003784_our_adv_patch_gcam.JPEG
--------------------------------------------------------------------------------
/results/ILSVRC2012_val_00003784_our_adv_patch_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UMBCvision/fooling_network_interpretation/46e910cdfb578eda2698a5a4a0110482e1c4d1a0/results/ILSVRC2012_val_00003784_our_adv_patch_image.png
--------------------------------------------------------------------------------
/results/ILSVRC2012_val_00003784_reg_adv_patch_gcam.JPEG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UMBCvision/fooling_network_interpretation/46e910cdfb578eda2698a5a4a0110482e1c4d1a0/results/ILSVRC2012_val_00003784_reg_adv_patch_gcam.JPEG
--------------------------------------------------------------------------------
/results/ILSVRC2012_val_00003784_reg_adv_patch_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UMBCvision/fooling_network_interpretation/46e910cdfb578eda2698a5a4a0110482e1c4d1a0/results/ILSVRC2012_val_00003784_reg_adv_patch_image.png
--------------------------------------------------------------------------------
/results/ILSVRC2012_val_00008855_our_adv_patch_gcam.JPEG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UMBCvision/fooling_network_interpretation/46e910cdfb578eda2698a5a4a0110482e1c4d1a0/results/ILSVRC2012_val_00008855_our_adv_patch_gcam.JPEG
--------------------------------------------------------------------------------
/results/ILSVRC2012_val_00008855_our_adv_patch_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UMBCvision/fooling_network_interpretation/46e910cdfb578eda2698a5a4a0110482e1c4d1a0/results/ILSVRC2012_val_00008855_our_adv_patch_image.png
--------------------------------------------------------------------------------
/results/ILSVRC2012_val_00008855_reg_adv_patch_gcam.JPEG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UMBCvision/fooling_network_interpretation/46e910cdfb578eda2698a5a4a0110482e1c4d1a0/results/ILSVRC2012_val_00008855_reg_adv_patch_gcam.JPEG
--------------------------------------------------------------------------------
/results/ILSVRC2012_val_00008855_reg_adv_patch_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UMBCvision/fooling_network_interpretation/46e910cdfb578eda2698a5a4a0110482e1c4d1a0/results/ILSVRC2012_val_00008855_reg_adv_patch_image.png
--------------------------------------------------------------------------------