├── .github
└── FUNDING.yml
├── .gitignore
├── LICENSE
├── README.md
├── area_importance_heatmaps
├── basketball.png
├── basketball_annotated.png
├── pineapple.png
├── pineapple_annotated.png
├── submarine.png
├── submarine_annotated.png
├── zebra.png
└── zebra_annotated.png
├── assets
└── cnn_explainer_icon_web.png
├── cnn_area_importance_heatmaps.ipynb
├── cnn_features_visualizations.ipynb
├── cnn_gradcam_heatmaps.ipynb
├── features_visualizations
├── baseball.png
├── candle.png
├── chain.png
├── claw.png
├── knot.png
├── mug.png
├── screw.png
├── stingray.png
├── tarantula.png
├── toucan.png
└── trombone.png
├── gradcam.py
├── gradcam_heatmaps
├── gradcam_overlay_aircraft_carrier.png
└── gradcam_overlay_submarine.png
├── imagenet_classes.txt
├── test_images
├── barometer.jpg
├── baseball.jpg
├── basketball.jpg
├── candle.jpg
├── chain.jpg
├── claw.jpg
├── dog_and_ram.jpg
├── dome.jpg
├── jay.jpg
├── knot.jpg
├── minivan.jpg
├── mug.jpg
├── obelisk.jpg
├── pineapple.jpg
├── pretzel.jpg
├── saxophone.jpg
├── screw.jpg
├── snail.jpg
├── snake.jpg
├── stingray.jpg
├── submarine.jpg
├── submarine_and_aircraft_carrier.jpg
├── tarantula.jpg
├── toucan.jpg
├── trombone.jpg
├── turtle.jpg
└── zebra.jpg
└── utils.py
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | patreon: gsurma
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | pip-wheel-metadata/
24 | share/python-wheels/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 | MANIFEST
29 |
30 | # PyInstaller
31 | # Usually these files are written by a python script from a template
32 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
33 | *.manifest
34 | *.spec
35 |
36 | # Installer logs
37 | pip-log.txt
38 | pip-delete-this-directory.txt
39 |
40 | # Unit test / coverage reports
41 | htmlcov/
42 | .tox/
43 | .nox/
44 | .coverage
45 | .coverage.*
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 | *.cover
50 | *.py,cover
51 | .hypothesis/
52 | .pytest_cache/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | target/
76 |
77 | # Jupyter Notebook
78 | .ipynb_checkpoints
79 |
80 | # IPython
81 | profile_default/
82 | ipython_config.py
83 |
84 | # pyenv
85 | .python-version
86 |
87 | # pipenv
88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
91 | # install all needed dependencies.
92 | #Pipfile.lock
93 |
94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
95 | __pypackages__/
96 |
97 | # Celery stuff
98 | celerybeat-schedule
99 | celerybeat.pid
100 |
101 | # SageMath parsed files
102 | *.sage.py
103 |
104 | # Environments
105 | .env
106 | .venv
107 | env/
108 | venv/
109 | ENV/
110 | env.bak/
111 | venv.bak/
112 |
113 | # Spyder project settings
114 | .spyderproject
115 | .spyproject
116 |
117 | # Rope project settings
118 | .ropeproject
119 |
120 | # mkdocs documentation
121 | /site
122 |
123 | # mypy
124 | .mypy_cache/
125 | .dmypy.json
126 | dmypy.json
127 |
128 | # Pyre type checker
129 | .pyre/
130 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Greg
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 |
2 |
3 |
4 |
5 | # CNN Explainer
6 |
7 | CNN Explainer is PyTorch based project that aims to make CNN's predictions explainable.
8 |
9 | Check the corresponding articles:
10 |
11 | [CNN Explainer - Interpreting Convolutional Neural Networks (1/N) Generating Area Importance Heatmaps with Occlusions](https://gsurma.medium.com/cnn-explainer-interpreting-convolutional-neural-networks-1-n-e81c62cbb660)
12 |
13 | [CNN Explainer - Interpreting Convolutional Neural Networks (2/N) Visualizing Gradient Weighted Class Activations with GradCAM](https://gsurma.medium.com/cnn-explainer-interpreting-convolutional-neural-networks-2-n-18e40a03eae2)
14 |
15 | [CNN Explainer - Interpreting Convolutional Neural Networks (3/N) Visualizing Boosted Convolutional Features](https://gsurma.medium.com/cnn-explainer-interpreting-convolutional-neural-networks-3-n-de0b348caff)
16 |
17 |
18 | ## Boosted Features Visualizations
19 | [Notebook](cnn_features_visualizations.ipynb)
20 |
21 |
22 |
23 |
24 | ---
25 |
26 |
27 |
28 |
29 | ---
30 |
31 |
32 |
33 |
34 | ---
35 |
36 |
37 |
38 |
39 | ---
40 |
41 |
42 |
43 |
44 | ---
45 |
46 |
47 |
48 |
49 | ---
50 |
51 |
52 |
53 |
54 | ---
55 |
56 |
57 |
58 |
59 | ---
60 |
61 |
62 |
63 |
64 | ---
65 |
66 |
67 |
68 |
69 | ---
70 |
71 |
72 |
73 |
74 | ---
75 |
76 |
77 | ## GradCAM Heatmaps
78 | [Notebook](cnn_gradcam_heatmaps.ipynb)
79 |
80 | Submarine
81 |
82 |
83 |
84 |
85 |
86 | Aircraft Carrier
87 |
88 |
89 |
90 |
91 |
92 | ## Area Importance Heatmaps with Occlusions
93 | [Notebook](cnn_area_importance_heatmaps.ipynb)
94 |
95 |
96 |
97 | ---
98 |
99 |
100 |
101 |
102 | ---
103 |
104 |
105 |
106 |
107 | ---
108 |
109 |
110 |
111 |
112 | ---
113 |
114 |
115 | ## Author
116 |
117 | **Greg (Grzegorz) Surma**
118 |
119 | [**PORTFOLIO**](https://gsurma.github.io)
120 |
121 | [**GITHUB**](https://github.com/gsurma)
122 |
123 | [**BLOG**](https://medium.com/@gsurma)
124 |
--------------------------------------------------------------------------------
/area_importance_heatmaps/basketball.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/area_importance_heatmaps/basketball.png
--------------------------------------------------------------------------------
/area_importance_heatmaps/basketball_annotated.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/area_importance_heatmaps/basketball_annotated.png
--------------------------------------------------------------------------------
/area_importance_heatmaps/pineapple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/area_importance_heatmaps/pineapple.png
--------------------------------------------------------------------------------
/area_importance_heatmaps/pineapple_annotated.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/area_importance_heatmaps/pineapple_annotated.png
--------------------------------------------------------------------------------
/area_importance_heatmaps/submarine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/area_importance_heatmaps/submarine.png
--------------------------------------------------------------------------------
/area_importance_heatmaps/submarine_annotated.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/area_importance_heatmaps/submarine_annotated.png
--------------------------------------------------------------------------------
/area_importance_heatmaps/zebra.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/area_importance_heatmaps/zebra.png
--------------------------------------------------------------------------------
/area_importance_heatmaps/zebra_annotated.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/area_importance_heatmaps/zebra_annotated.png
--------------------------------------------------------------------------------
/assets/cnn_explainer_icon_web.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/assets/cnn_explainer_icon_web.png
--------------------------------------------------------------------------------
/features_visualizations/baseball.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/features_visualizations/baseball.png
--------------------------------------------------------------------------------
/features_visualizations/candle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/features_visualizations/candle.png
--------------------------------------------------------------------------------
/features_visualizations/chain.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/features_visualizations/chain.png
--------------------------------------------------------------------------------
/features_visualizations/claw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/features_visualizations/claw.png
--------------------------------------------------------------------------------
/features_visualizations/knot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/features_visualizations/knot.png
--------------------------------------------------------------------------------
/features_visualizations/mug.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/features_visualizations/mug.png
--------------------------------------------------------------------------------
/features_visualizations/screw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/features_visualizations/screw.png
--------------------------------------------------------------------------------
/features_visualizations/stingray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/features_visualizations/stingray.png
--------------------------------------------------------------------------------
/features_visualizations/tarantula.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/features_visualizations/tarantula.png
--------------------------------------------------------------------------------
/features_visualizations/toucan.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/features_visualizations/toucan.png
--------------------------------------------------------------------------------
/features_visualizations/trombone.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/features_visualizations/trombone.png
--------------------------------------------------------------------------------
/gradcam.py:
--------------------------------------------------------------------------------
1 | import torch
2 | import numpy as np
3 | import cv2
4 |
5 | class Activations():
6 |
7 | def __init__(self, target_layer, target_layer_names):
8 | self.target_layer = target_layer
9 | self.target_layer_names = target_layer_names
10 |
11 | def __call__(self, in_out):
12 | outputs = []
13 | for name, module in self.target_layer._modules.items():
14 | in_out = module(in_out)
15 | if name in self.target_layer_names:
16 | outputs += [in_out]
17 | return outputs, in_out
18 |
19 | class Gradients():
20 |
21 | def __init__(self, target_layer, target_layer_names):
22 | self.target_layer = target_layer
23 | self.target_layer_names = target_layer_names
24 |
25 | def save_gradients(self, grad):
26 | self.gradients.append(grad)
27 |
28 | def get_gradients(self):
29 | return self.gradients
30 |
31 | def __call__(self, in_out):
32 | self.gradients = []
33 | for name, module in self.target_layer._modules.items():
34 | if name in self.target_layer_names:
35 | in_out.register_hook(self.save_gradients)
36 |
37 |
38 | class LayerExtractor():
39 |
40 | def __init__(self, model, target_layer, target_layer_names):
41 | self.model = model
42 | self.target_layer = target_layer
43 |
44 | self.activations = Activations(self.target_layer, target_layer_names)
45 | self.gradients = Gradients(self.target_layer, target_layer_names)
46 |
47 | def get_gradients(self):
48 | return self.gradients.get_gradients()
49 |
50 | def __call__(self, in_out):
51 | for name, module in self.model._modules.items():
52 | if module == self.target_layer:
53 | activations, in_out = self.activations(in_out)
54 | self.gradients(in_out)
55 | elif "avgpool" in name.lower():
56 | in_out = module(in_out)
57 | in_out = in_out.view(in_out.size(0),-1)
58 | else:
59 | in_out = module(in_out)
60 | return activations, in_out
61 |
62 | class GradCam:
63 |
64 | def __init__(self, model, target_layer, target_layer_names):
65 | self.model = model
66 | self.model.eval()
67 | self.target_layer = target_layer
68 | self.layer_extractor = LayerExtractor(self.model, self.target_layer, target_layer_names)
69 |
70 | def forward(self, input_image):
71 | return self.model(input_image)
72 |
73 | def __call__(self, input_image, target_class=None):
74 |
75 | activations, output = self.layer_extractor(input_image)
76 |
77 | if target_class == None: #if not explicitly set, setting the top prediction
78 | target_class = np.argmax(output.cpu().data.numpy())
79 |
80 | one_hot = np.zeros((1, output.size()[-1]), dtype=np.float32)
81 | one_hot[0][target_class] = 1
82 | one_hot = torch.from_numpy(one_hot).requires_grad_(True)
83 | one_hot = torch.sum(one_hot * output)
84 |
85 | self.target_layer.zero_grad()
86 | self.model.zero_grad()
87 | one_hot.backward(retain_graph=True)
88 |
89 | gradients = self.layer_extractor.get_gradients()[-1].cpu().data.numpy()
90 |
91 | activations = activations[-1]
92 | activations = activations.cpu().data.numpy()[0, :]
93 |
94 | gradients = np.mean(gradients, axis=(2, 3))[0, :]
95 | cam = np.zeros(activations.shape[1:], dtype=np.float32)
96 |
97 | for i, gradient in enumerate(gradients):
98 | cam += gradient * activations[i, :, :]
99 |
100 | cam = np.maximum(cam, 0)
101 | cam = cv2.resize(cam, input_image.shape[2:])
102 | cam = cam - np.min(cam)
103 | cam = cam / np.max(cam)
104 | return cam
--------------------------------------------------------------------------------
/gradcam_heatmaps/gradcam_overlay_aircraft_carrier.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/gradcam_heatmaps/gradcam_overlay_aircraft_carrier.png
--------------------------------------------------------------------------------
/gradcam_heatmaps/gradcam_overlay_submarine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/gradcam_heatmaps/gradcam_overlay_submarine.png
--------------------------------------------------------------------------------
/imagenet_classes.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'}
1001 |
--------------------------------------------------------------------------------
/test_images/barometer.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/barometer.jpg
--------------------------------------------------------------------------------
/test_images/baseball.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/baseball.jpg
--------------------------------------------------------------------------------
/test_images/basketball.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/basketball.jpg
--------------------------------------------------------------------------------
/test_images/candle.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/candle.jpg
--------------------------------------------------------------------------------
/test_images/chain.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/chain.jpg
--------------------------------------------------------------------------------
/test_images/claw.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/claw.jpg
--------------------------------------------------------------------------------
/test_images/dog_and_ram.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/dog_and_ram.jpg
--------------------------------------------------------------------------------
/test_images/dome.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/dome.jpg
--------------------------------------------------------------------------------
/test_images/jay.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/jay.jpg
--------------------------------------------------------------------------------
/test_images/knot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/knot.jpg
--------------------------------------------------------------------------------
/test_images/minivan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/minivan.jpg
--------------------------------------------------------------------------------
/test_images/mug.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/mug.jpg
--------------------------------------------------------------------------------
/test_images/obelisk.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/obelisk.jpg
--------------------------------------------------------------------------------
/test_images/pineapple.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/pineapple.jpg
--------------------------------------------------------------------------------
/test_images/pretzel.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/pretzel.jpg
--------------------------------------------------------------------------------
/test_images/saxophone.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/saxophone.jpg
--------------------------------------------------------------------------------
/test_images/screw.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/screw.jpg
--------------------------------------------------------------------------------
/test_images/snail.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/snail.jpg
--------------------------------------------------------------------------------
/test_images/snake.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/snake.jpg
--------------------------------------------------------------------------------
/test_images/stingray.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/stingray.jpg
--------------------------------------------------------------------------------
/test_images/submarine.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/submarine.jpg
--------------------------------------------------------------------------------
/test_images/submarine_and_aircraft_carrier.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/submarine_and_aircraft_carrier.jpg
--------------------------------------------------------------------------------
/test_images/tarantula.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/tarantula.jpg
--------------------------------------------------------------------------------
/test_images/toucan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/toucan.jpg
--------------------------------------------------------------------------------
/test_images/trombone.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/trombone.jpg
--------------------------------------------------------------------------------
/test_images/turtle.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/turtle.jpg
--------------------------------------------------------------------------------
/test_images/zebra.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gsurma/cnn_explainer/96ee8506f5d6dc60c0b90818de4f8533d7a96ec8/test_images/zebra.jpg
--------------------------------------------------------------------------------
/utils.py:
--------------------------------------------------------------------------------
1 | import torch
2 | import torchvision.transforms as transforms
3 | import torch.nn.functional as F
4 | import PIL.Image
5 | import numpy as np
6 | import cv2
7 |
8 | mean = torch.Tensor([0.485, 0.456, 0.406])
9 | std = torch.Tensor([0.229, 0.224, 0.225])
10 |
11 | def preprocess_image(image):
12 | image = transforms.functional.to_tensor(image)
13 | image.sub_(mean[:, None, None]).div_(std[:, None, None])
14 | return image[None, ...]
15 |
16 | def overlay_heatmap_on_image(img, heatmap):
17 | heatmap = cv2.applyColorMap(np.uint8(255*heatmap), cv2.COLORMAP_JET)
18 | heatmap = np.float32(heatmap)/255
19 | overlay = heatmap + np.float32(img)
20 | overlay = overlay / np.max(overlay)
21 | return np.uint8(255*overlay)
--------------------------------------------------------------------------------