taesiri commited on
Commit
9313bc1
·
1 Parent(s): ff8b609

initial commit

Browse files
Files changed (7) hide show
  1. SessionState.py +117 -0
  2. app.py +367 -0
  3. download_utils.py +55 -0
  4. gloss.txt +0 -0
  5. helper.py +23 -0
  6. image_utils.py +137 -0
  7. imagenet-labels.json +1002 -0
SessionState.py ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Hack to add per-session state to Streamlit.
2
+
3
+ Usage
4
+ -----
5
+
6
+ >>> import SessionState
7
+ >>>
8
+ >>> session_state = SessionState.get(user_name='', favorite_color='black')
9
+ >>> session_state.user_name
10
+ ''
11
+ >>> session_state.user_name = 'Mary'
12
+ >>> session_state.favorite_color
13
+ 'black'
14
+
15
+ Since you set user_name above, next time your script runs this will be the
16
+ result:
17
+ >>> session_state = get(user_name='', favorite_color='black')
18
+ >>> session_state.user_name
19
+ 'Mary'
20
+
21
+ """
22
+ try:
23
+ import streamlit.ReportThread as ReportThread
24
+ from streamlit.server.Server import Server
25
+ except Exception:
26
+ # Streamlit >= 0.65.0
27
+ import streamlit.report_thread as ReportThread
28
+ from streamlit.server.server import Server
29
+
30
+
31
+ class SessionState(object):
32
+ def __init__(self, **kwargs):
33
+ """A new SessionState object.
34
+
35
+ Parameters
36
+ ----------
37
+ **kwargs : any
38
+ Default values for the session state.
39
+
40
+ Example
41
+ -------
42
+ >>> session_state = SessionState(user_name='', favorite_color='black')
43
+ >>> session_state.user_name = 'Mary'
44
+ ''
45
+ >>> session_state.favorite_color
46
+ 'black'
47
+
48
+ """
49
+ for key, val in kwargs.items():
50
+ setattr(self, key, val)
51
+
52
+
53
+ def get(**kwargs):
54
+ """Gets a SessionState object for the current session.
55
+
56
+ Creates a new object if necessary.
57
+
58
+ Parameters
59
+ ----------
60
+ **kwargs : any
61
+ Default values you want to add to the session state, if we're creating a
62
+ new one.
63
+
64
+ Example
65
+ -------
66
+ >>> session_state = get(user_name='', favorite_color='black')
67
+ >>> session_state.user_name
68
+ ''
69
+ >>> session_state.user_name = 'Mary'
70
+ >>> session_state.favorite_color
71
+ 'black'
72
+
73
+ Since you set user_name above, next time your script runs this will be the
74
+ result:
75
+ >>> session_state = get(user_name='', favorite_color='black')
76
+ >>> session_state.user_name
77
+ 'Mary'
78
+
79
+ """
80
+ # Hack to get the session object from Streamlit.
81
+
82
+ ctx = ReportThread.get_report_ctx()
83
+
84
+ this_session = None
85
+
86
+ current_server = Server.get_current()
87
+ if hasattr(current_server, '_session_infos'):
88
+ # Streamlit < 0.56
89
+ session_infos = Server.get_current()._session_infos.values()
90
+ else:
91
+ session_infos = Server.get_current()._session_info_by_id.values()
92
+
93
+ for session_info in session_infos:
94
+ s = session_info.session
95
+ if (
96
+ # Streamlit < 0.54.0
97
+ (hasattr(s, '_main_dg') and s._main_dg == ctx.main_dg)
98
+ or
99
+ # Streamlit >= 0.54.0
100
+ (not hasattr(s, '_main_dg') and s.enqueue == ctx.enqueue)
101
+ or
102
+ # Streamlit >= 0.65.2
103
+ (not hasattr(s, '_main_dg') and s._uploaded_file_mgr == ctx.uploaded_file_mgr)
104
+ ):
105
+ this_session = s
106
+
107
+ if this_session is None:
108
+ raise RuntimeError(
109
+ "Oh noes. Couldn't get your Streamlit Session object. "
110
+ 'Are you doing something fancy with threads?')
111
+
112
+ # Got the session object! Now let's attach some state into it.
113
+
114
+ if not hasattr(this_session, '_custom_session_state'):
115
+ this_session._custom_session_state = SessionState(**kwargs)
116
+
117
+ return this_session._custom_session_state
app.py ADDED
@@ -0,0 +1,367 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import os
3
+ import pickle
4
+ import random
5
+ import time
6
+ from collections import Counter
7
+ from datetime import datetime
8
+ from glob import glob
9
+
10
+ import gdown
11
+ import matplotlib.pyplot as plt
12
+ import numpy as np
13
+ import pandas as pd
14
+ import seaborn as sns
15
+ import streamlit as st
16
+ from PIL import Image
17
+
18
+ import SessionState
19
+ from download_utils import *
20
+ from image_utils import *
21
+
22
+ random.seed(datetime.now())
23
+ np.random.seed(int(time.time()))
24
+
25
+ NUMBER_OF_TRIALS = 20
26
+ CLASSIFIER_TAG = "CHM"
27
+ explaination_functions = [load_chm_nns, load_knn_nns]
28
+ selected_xai_tool = None
29
+
30
+ # Config
31
+ folder_to_name = {}
32
+ class_descriptions = {}
33
+ classifier_predictions = {}
34
+ selected_dataset = "Final"
35
+
36
+ root_visualization_dir = "./visualizations/"
37
+ viz_url = "https://static.taesiri.com/xai/Final.zip"
38
+ viz_archivefile = "Final.zip"
39
+
40
+ demonstration_url = "https://static.taesiri.com/xai/demonstrations.zip"
41
+ demonst_zipfile = "demonstrations.zip"
42
+
43
+ picklefile_url = "https://static.taesiri.com/xai/Task1_Results_CHM_and_EMD.pickle"
44
+ prediction_root = "./predictions/"
45
+ prediction_pickle = f"{prediction_root}predictions.pickle"
46
+
47
+ ################################################
48
+ # GLOBAL VARIABLES
49
+ app_mode = ""
50
+
51
+ ## Shared/Global Information
52
+ with open("imagenet-labels.json", "rb") as f:
53
+ folder_to_name = json.load(f)
54
+
55
+ with open("gloss.txt", "r") as f:
56
+ description_file = f.readlines()
57
+
58
+ class_descriptions = {l.split("\t")[0]: l.split("\t")[1] for l in description_file}
59
+ ################################################
60
+
61
+ with open(prediction_pickle, "rb") as f:
62
+ classifier_predictions = pickle.load(f)
63
+
64
+ # SESSION STATE
65
+ session_state = SessionState.get(
66
+ page=1,
67
+ first_run=1,
68
+ user_feedback={},
69
+ queries=[],
70
+ is_classifier_correct={},
71
+ XAI_tool="Unselected",
72
+ )
73
+ ################################################
74
+
75
+
76
+ def get_data():
77
+ download_files(
78
+ root_visualization_dir,
79
+ viz_url,
80
+ viz_archivefile,
81
+ demonstration_url,
82
+ demonst_zipfile,
83
+ picklefile_url,
84
+ prediction_root,
85
+ prediction_pickle,
86
+ )
87
+
88
+
89
+ def resmaple_queries():
90
+ if session_state.first_run == 1:
91
+ both_correct = glob(
92
+ root_visualization_dir + selected_dataset + "/Both_correct/*.JPEG"
93
+ )
94
+ both_wrong = glob(
95
+ root_visualization_dir + selected_dataset + "/Both_wrong/*.JPEG"
96
+ )
97
+
98
+ correct_samples = list(
99
+ np.random.choice(a=both_correct, size=NUMBER_OF_TRIALS // 2, replace=False)
100
+ )
101
+ wrong_samples = list(
102
+ np.random.choice(a=both_wrong, size=NUMBER_OF_TRIALS // 2, replace=False)
103
+ )
104
+
105
+ all_images = correct_samples + wrong_samples
106
+ random.shuffle(all_images)
107
+ session_state.queries = all_images
108
+ session_state.first_run = -1
109
+ # RESET INTERACTIONS
110
+ session_state.user_feedback = {}
111
+ session_state.is_classifier_correct = {}
112
+
113
+
114
+ def render_experiment(query):
115
+ current_query = session_state.queries[query]
116
+ query_id = os.path.basename(current_query)
117
+
118
+ predicted_wnid = classifier_predictions[query_id][f"{CLASSIFIER_TAG}-predictions"]
119
+ prediction_confidence = classifier_predictions[query_id][
120
+ f"{CLASSIFIER_TAG}-confidence"
121
+ ]
122
+ prediction_label = folder_to_name[predicted_wnid]
123
+ class_def = class_descriptions[predicted_wnid]
124
+
125
+ session_state.is_classifier_correct[query_id] = classifier_predictions[query_id][
126
+ f"{CLASSIFIER_TAG}-Output"
127
+ ]
128
+
129
+ ################################### SHOW DESCRIPTION OF CLASS
130
+ with st.expander("Show Class Description"):
131
+ st.write(f"**Name**: {prediction_label}")
132
+ st.write("**Class Definition**:")
133
+ st.markdown("`" + class_def + "`")
134
+ st.image(
135
+ Image.open(f"demonstrations/{predicted_wnid}.jpeg"),
136
+ caption=f"Class Explanation",
137
+ use_column_width=True,
138
+ )
139
+
140
+ ################################### SHOW QUERY and PREDICTION
141
+ with st.expander("Show Query"):
142
+ col1, col2 = st.columns(2)
143
+ with col1:
144
+ st.image(load_query(current_query), caption=f"Query ID: {query_id}")
145
+ with col2:
146
+ default_value = 0
147
+ if query_id in session_state.user_feedback.keys():
148
+ if session_state.user_feedback[query_id] == "Correct":
149
+ default_value = 1
150
+ elif session_state.user_feedback[query_id] == "Wrong":
151
+ default_value = 2
152
+
153
+ session_state.user_feedback[query_id] = st.radio(
154
+ "What do you think about model's prediction?",
155
+ ("-", "Correct", "Wrong"),
156
+ key=query_id,
157
+ index=default_value,
158
+ )
159
+ st.write(f"**Model Prediction**: {prediction_label}")
160
+ st.write(f"**Model Confidence**: {prediction_confidence}")
161
+
162
+ ################################### SHOW Model Explanation
163
+ if selected_xai_tool is not None:
164
+ st.image(
165
+ selected_xai_tool(current_query),
166
+ caption=f"Explaination",
167
+ use_column_width=True,
168
+ )
169
+
170
+ ################################### SHOW DEBUG INFO
171
+
172
+ if st.button("Debug: Show Everything"):
173
+ st.image(Image.open(current_query))
174
+
175
+
176
+ def render_results():
177
+ user_correct_guess = 0
178
+ for q in session_state.user_feedback.keys():
179
+ if session_state.is_classifier_correct[q] == session_state.user_feedback[q]:
180
+ user_correct_guess += 1
181
+
182
+ st.write(
183
+ f"User performance on {CLASSIFIER_TAG}: {user_correct_guess} out of {len( session_state.user_feedback)} Correct"
184
+ )
185
+ st.markdown("## User Performance Breakdown")
186
+
187
+ categories = set(session_state.is_classifier_correct.values())
188
+ breakdown_stats_correct = {c: 0 for c in categories}
189
+ breakdown_stats_wrong = {c: 0 for c in categories}
190
+
191
+ experiment_summary = []
192
+
193
+ for q in session_state.user_feedback.keys():
194
+ category = session_state.is_classifier_correct[q]
195
+ user_feedback_boolean = (
196
+ True if session_state.user_feedback[q] == "Correct" else False
197
+ )
198
+
199
+ is_user_correct = category == user_feedback_boolean
200
+
201
+ if is_user_correct:
202
+ breakdown_stats_correct[category] += 1
203
+ else:
204
+ breakdown_stats_wrong[category] += 1
205
+
206
+ experiment_summary.append(
207
+ [
208
+ q,
209
+ classifier_predictions[q]["real-gts"],
210
+ folder_to_name[
211
+ classifier_predictions[q][f"{CLASSIFIER_TAG}-predictions"]
212
+ ],
213
+ category,
214
+ session_state.user_feedback[q],
215
+ is_user_correct,
216
+ ]
217
+ )
218
+
219
+ experiment_summary_df = pd.DataFrame.from_records(
220
+ experiment_summary,
221
+ columns=[
222
+ "Query",
223
+ "GT Labels",
224
+ f"{CLASSIFIER_TAG} Prediction",
225
+ "Category",
226
+ "User Prediction",
227
+ "Is User Prediction Correct",
228
+ ],
229
+ )
230
+ st.write("Summary", experiment_summary_df)
231
+
232
+ csv = convert_df(experiment_summary_df)
233
+ st.download_button(
234
+ "Press to Download", csv, "summary.csv", "text/csv", key="download-records"
235
+ )
236
+
237
+
238
+ def render_menu():
239
+ # Render the readme as markdown using st.markdown.
240
+ readme_text = st.markdown(
241
+ """
242
+ # Instructions
243
+ ```
244
+ When testing this study, you should first see the class definition, then hide the expander and see the query.
245
+ ```
246
+ """
247
+ )
248
+
249
+ app_mode = st.selectbox(
250
+ "Choose the page to show:",
251
+ ["Experiment Instruction", "Start Experiment", "See the Results"],
252
+ )
253
+
254
+ if app_mode == "Experiment Instruction":
255
+ st.success("To continue select an option in the dropdown menu.")
256
+ elif app_mode == "Start Experiment":
257
+ # Clear Canvas
258
+ readme_text.empty()
259
+
260
+ page_id = session_state.page
261
+ col1, col4, col2, col3 = st.columns(4)
262
+ prev_page = col1.button("Previous Image")
263
+
264
+ if prev_page:
265
+ page_id -= 1
266
+ if page_id < 1:
267
+ page_id = 1
268
+
269
+ next_page = col2.button("Next Image")
270
+
271
+ if next_page:
272
+ page_id += 1
273
+ if page_id > NUMBER_OF_TRIALS:
274
+ page_id = NUMBER_OF_TRIALS
275
+
276
+ if page_id == NUMBER_OF_TRIALS:
277
+ st.success(
278
+ 'You have reached the last image. Please go to the "Results" page to see your performance.'
279
+ )
280
+ if st.button("View"):
281
+ app_mode = "See the Results"
282
+
283
+ if col3.button("Resample"):
284
+ st.write("Restarting ...")
285
+ page_id = 1
286
+ session_state.first_run = 1
287
+ resmaple_queries()
288
+
289
+ session_state.page = page_id
290
+ st.write(f"Render Experiment: {session_state.page}")
291
+ render_experiment(session_state.page - 1)
292
+ elif app_mode == "See the Results":
293
+ readme_text.empty()
294
+ st.write("Results Summary")
295
+ render_results()
296
+
297
+
298
+ def main():
299
+ global app_mode
300
+ global session_state
301
+ global selected_xai_tool
302
+ # Get the Data
303
+ get_data()
304
+
305
+ # Set the session state
306
+ # State Management and General Setup
307
+ st.set_page_config(layout="wide")
308
+ st.title("TASK - 1 - ImageNetREAL")
309
+
310
+ options = [
311
+ "Unselected",
312
+ "NOXAI",
313
+ "KNN",
314
+ "EMD Nearest Neighbors",
315
+ "EMD Correspondence",
316
+ "CHM Nearest Neighbors",
317
+ "CHM Correspondence",
318
+ ]
319
+
320
+ st.markdown(
321
+ """ <style>
322
+ div[role="radiogroup"] > :first-child{
323
+ display: none !important;
324
+ }
325
+ </style>
326
+ """,
327
+ unsafe_allow_html=True,
328
+ )
329
+
330
+ if session_state.XAI_tool == "Unselected":
331
+ default = options.index(session_state.XAI_tool)
332
+ session_state.XAI_tool = st.radio(
333
+ "What explaination tool do you want to evaluate?",
334
+ options,
335
+ key="which_xai",
336
+ index=default,
337
+ )
338
+ # print(session_state.XAI_tool)
339
+
340
+ if session_state.XAI_tool != "Unselected":
341
+ st.markdown(f"## SELECTED METHOD ``{session_state.XAI_tool}``")
342
+
343
+ if session_state.XAI_tool == "NOXAI":
344
+ selected_xai_tool = None
345
+ CLASSIFIER_TAG = "KNN"
346
+ elif session_state.XAI_tool == "KNN":
347
+ selected_xai_tool = load_knn_nns
348
+ CLASSIFIER_TAG = "KNN"
349
+ elif session_state.XAI_tool == "CHM Nearest Neighbors":
350
+ selected_xai_tool = load_chm_nns
351
+ CLASSIFIER_TAG = "CHM"
352
+ elif session_state.XAI_tool == "CHM Correspondence":
353
+ selected_xai_tool = load_chm_corrs
354
+ CLASSIFIER_TAG = "CHM"
355
+ elif session_state.XAI_tool == "EMD Nearest Neighbors":
356
+ selected_xai_tool = load_emd_nns
357
+ CLASSIFIER_TAG = "EMD"
358
+ elif session_state.XAI_tool == "EMD Correspondence":
359
+ selected_xai_tool = load_emd_corrs
360
+ CLASSIFIER_TAG = "EMD"
361
+
362
+ resmaple_queries()
363
+ render_menu()
364
+
365
+
366
+ if __name__ == "__main__":
367
+ main()
download_utils.py ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import os
3
+ import pickle
4
+ import random
5
+ import tarfile
6
+ import zipfile
7
+ from collections import Counter
8
+ from glob import glob
9
+
10
+ import gdown
11
+ import matplotlib.pyplot as plt
12
+ import numpy as np
13
+ import pandas as pd
14
+ import seaborn as sns
15
+ import streamlit as st
16
+ from PIL import Image
17
+
18
+ import SessionState
19
+
20
+
21
+ def download_files(
22
+ root_visualization_dir,
23
+ viz_url,
24
+ viz_archivefile,
25
+ demonstration_url,
26
+ demonst_zipfile,
27
+ picklefile_url,
28
+ prediction_root,
29
+ prediction_pickle,
30
+ ):
31
+ # Get Visualization
32
+ if not os.path.exists(root_visualization_dir):
33
+ gdown.download(viz_url, viz_archivefile, quiet=False)
34
+ os.makedirs(root_visualization_dir, exist_ok=True)
35
+
36
+ if viz_archivefile.endswith("tar.gz"):
37
+ tar = tarfile.open(viz_archivefile, "r:gz")
38
+ tar.extractall(path=root_visualization_dir)
39
+ tar.close()
40
+ elif viz_archivefile.endswith("zip"):
41
+ with zipfile.ZipFile(viz_archivefile, "r") as zip_ref:
42
+ zip_ref.extractall(root_visualization_dir)
43
+
44
+ # Get Demonstrations
45
+ if not os.path.exists(demonst_zipfile):
46
+ gdown.download(demonstration_url, demonst_zipfile, quiet=False)
47
+ # os.makedirs(roo_demonstration_dir, exist_ok=True)
48
+
49
+ with zipfile.ZipFile(demonst_zipfile, "r") as zip_ref:
50
+ zip_ref.extractall("./")
51
+
52
+ # Get Predictions
53
+ if not os.path.exists(prediction_pickle):
54
+ os.makedirs(prediction_root, exist_ok=True)
55
+ gdown.download(picklefile_url, prediction_pickle, quiet=False)
gloss.txt ADDED
The diff for this file is too large to render. See raw diff
 
helper.py ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+
3
+ def get_label_for_query(image_url, model_name):
4
+ fourway_label = image_url.split('/')[-2]
5
+
6
+ if fourway_label=='both_correct':
7
+ return 'Correct'
8
+
9
+ if fourway_label=='both_wrong':
10
+ return 'Wrong'
11
+
12
+ if fourway_label == 'chm_correct_knn_incorrect' and model_name == 'CHM':
13
+ return 'Correct'
14
+ elif fourway_label == 'knn_correct_chm_incorrect' and model_name == 'KNN':
15
+ return 'Correct'
16
+
17
+ return 'Wrong'
18
+
19
+ def get_category(image_url):
20
+ return image_url.split('/')[-2]
21
+
22
+ def translate_winds_to_names(winds):
23
+ return [folder_to_name[x] for x in winds]
image_utils.py ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import os
3
+ import pickle
4
+ import random
5
+ from glob import glob
6
+
7
+ import matplotlib.pyplot as plt
8
+ import pandas as pd
9
+ import seaborn as sns
10
+ import streamlit as st
11
+ from PIL import Image
12
+
13
+
14
+ @st.cache(allow_output_mutation=True, max_entries=10, ttl=3600)
15
+ def load_query(image_path):
16
+ image = Image.open(image_path)
17
+ width, height = image.size
18
+
19
+ new_width = width
20
+ new_height = height
21
+
22
+ left = (width - new_width) / 2
23
+ top = (height - new_height) / 2
24
+ right = (width + new_width) / 2
25
+ bottom = (height + new_height) / 2
26
+
27
+ # Crop the center of the image
28
+ cropped_image = image.crop(
29
+ (left + 75, top + 145, right - 2025, bottom - 2915)
30
+ ).resize((300, 300))
31
+
32
+ return cropped_image
33
+
34
+
35
+ # CHM ############################################################################
36
+ @st.cache(allow_output_mutation=True, max_entries=10, ttl=3600)
37
+ def load_chm_nns(image_path):
38
+ image = Image.open(image_path)
39
+ width, height = image.size
40
+
41
+ new_width = width
42
+ new_height = height
43
+
44
+ left = (width - new_width) / 2
45
+ top = (height - new_height) / 2
46
+ right = (width + new_width) / 2
47
+ bottom = (height + new_height) / 2
48
+
49
+ # Crop the center of the image
50
+ cropped_image = image.crop((left + 475, top + 140, right - 280, bottom - 2920))
51
+ return cropped_image
52
+
53
+
54
+ @st.cache(allow_output_mutation=True, max_entries=10, ttl=3600)
55
+ def load_chm_corrs(image_path):
56
+ image = Image.open(image_path)
57
+ width, height = image.size
58
+
59
+ new_width = width
60
+ new_height = height
61
+
62
+ left = (width - new_width) / 2
63
+ top = (height - new_height) / 2
64
+ right = (width + new_width) / 2
65
+ bottom = (height + new_height) / 2
66
+
67
+ # Crop the center of the image
68
+ cropped_image = image.crop((left + 475, top + 875, right - 280, bottom - 1810))
69
+ return cropped_image
70
+
71
+
72
+ # CHM ############################################################################
73
+
74
+ # KNN ############################################################################
75
+ @st.cache(allow_output_mutation=True, max_entries=10, ttl=3600)
76
+ def load_knn_nns(image_path):
77
+ image = Image.open(image_path)
78
+ width, height = image.size
79
+
80
+ new_width = width
81
+ new_height = height
82
+
83
+ left = (width - new_width) / 2
84
+ top = (height - new_height) / 2
85
+ right = (width + new_width) / 2
86
+ bottom = (height + new_height) / 2
87
+
88
+ # Crop the center of the image
89
+ cropped_image = image.crop((left + 475, top + 510, right - 280, bottom - 2550))
90
+ return cropped_image
91
+
92
+
93
+ # KNN ############################################################################
94
+
95
+ # EMD ############################################################################
96
+ @st.cache(allow_output_mutation=True, max_entries=10, ttl=3600)
97
+ def load_emd_nns(image_path):
98
+ image = Image.open(image_path)
99
+ width, height = image.size
100
+
101
+ new_width = width
102
+ new_height = height
103
+
104
+ left = (width - new_width) / 2
105
+ top = (height - new_height) / 2
106
+ right = (width + new_width) / 2
107
+ bottom = (height + new_height) / 2
108
+
109
+ # Crop the center of the image
110
+ cropped_image = image.crop((left + 10, top + 2075, right - 420, bottom - 925))
111
+ return cropped_image
112
+
113
+
114
+ @st.cache(allow_output_mutation=True, max_entries=10, ttl=3600)
115
+ def load_emd_corrs(image_path):
116
+ image = Image.open(image_path)
117
+ width, height = image.size
118
+
119
+ new_width = width
120
+ new_height = height
121
+
122
+ left = (width - new_width) / 2
123
+ top = (height - new_height) / 2
124
+ right = (width + new_width) / 2
125
+ bottom = (height + new_height) / 2
126
+
127
+ # Crop the center of the image
128
+ cropped_image = image.crop((left + 10, top + 2500, right - 20, bottom))
129
+ return cropped_image
130
+
131
+
132
+ # EMD ############################################################################
133
+
134
+
135
+ @st.cache()
136
+ def convert_df(df):
137
+ return df.to_csv().encode("utf-8")
imagenet-labels.json ADDED
@@ -0,0 +1,1002 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "n01440764" : "tench",
3
+ "n01443537" : "goldfish",
4
+ "n01484850" : "great_white_shark",
5
+ "n01491361" : "tiger_shark",
6
+ "n01494475" : "hammerhead",
7
+ "n01496331" : "electric_ray",
8
+ "n01498041" : "stingray",
9
+ "n01514668" : "cock",
10
+ "n01514859" : "hen",
11
+ "n01518878" : "ostrich",
12
+ "n01530575" : "brambling",
13
+ "n01531178" : "goldfinch",
14
+ "n01532829" : "house_finch",
15
+ "n01534433" : "junco",
16
+ "n01537544" : "indigo_bunting",
17
+ "n01558993" : "robin",
18
+ "n01560419" : "bulbul",
19
+ "n01580077" : "jay",
20
+ "n01582220" : "magpie",
21
+ "n01592084" : "chickadee",
22
+ "n01601694" : "water_ouzel",
23
+ "n01608432" : "kite",
24
+ "n01614925" : "bald_eagle",
25
+ "n01616318" : "vulture",
26
+ "n01622779" : "great_grey_owl",
27
+ "n01629819" : "European_fire_salamander",
28
+ "n01630670" : "common_newt",
29
+ "n01631663" : "eft",
30
+ "n01632458" : "spotted_salamander",
31
+ "n01632777" : "axolotl",
32
+ "n01641577" : "bullfrog",
33
+ "n01644373" : "tree_frog",
34
+ "n01644900" : "tailed_frog",
35
+ "n01664065" : "loggerhead",
36
+ "n01665541" : "leatherback_turtle",
37
+ "n01667114" : "mud_turtle",
38
+ "n01667778" : "terrapin",
39
+ "n01669191" : "box_turtle",
40
+ "n01675722" : "banded_gecko",
41
+ "n01677366" : "common_iguana",
42
+ "n01682714" : "American_chameleon",
43
+ "n01685808" : "whiptail",
44
+ "n01687978" : "agama",
45
+ "n01688243" : "frilled_lizard",
46
+ "n01689811" : "alligator_lizard",
47
+ "n01692333" : "Gila_monster",
48
+ "n01693334" : "green_lizard",
49
+ "n01694178" : "African_chameleon",
50
+ "n01695060" : "Komodo_dragon",
51
+ "n01697457" : "African_crocodile",
52
+ "n01698640" : "American_alligator",
53
+ "n01704323" : "triceratops",
54
+ "n01728572" : "thunder_snake",
55
+ "n01728920" : "ringneck_snake",
56
+ "n01729322" : "hognose_snake",
57
+ "n01729977" : "green_snake",
58
+ "n01734418" : "king_snake",
59
+ "n01735189" : "garter_snake",
60
+ "n01737021" : "water_snake",
61
+ "n01739381" : "vine_snake",
62
+ "n01740131" : "night_snake",
63
+ "n01742172" : "boa_constrictor",
64
+ "n01744401" : "rock_python",
65
+ "n01748264" : "Indian_cobra",
66
+ "n01749939" : "green_mamba",
67
+ "n01751748" : "sea_snake",
68
+ "n01753488" : "horned_viper",
69
+ "n01755581" : "diamondback",
70
+ "n01756291" : "sidewinder",
71
+ "n01768244" : "trilobite",
72
+ "n01770081" : "harvestman",
73
+ "n01770393" : "scorpion",
74
+ "n01773157" : "black_and_gold_garden_spider",
75
+ "n01773549" : "barn_spider",
76
+ "n01773797" : "garden_spider",
77
+ "n01774384" : "black_widow",
78
+ "n01774750" : "tarantula",
79
+ "n01775062" : "wolf_spider",
80
+ "n01776313" : "tick",
81
+ "n01784675" : "centipede",
82
+ "n01795545" : "black_grouse",
83
+ "n01796340" : "ptarmigan",
84
+ "n01797886" : "ruffed_grouse",
85
+ "n01798484" : "prairie_chicken",
86
+ "n01806143" : "peacock",
87
+ "n01806567" : "quail",
88
+ "n01807496" : "partridge",
89
+ "n01817953" : "African_grey",
90
+ "n01818515" : "macaw",
91
+ "n01819313" : "sulphur-crested_cockatoo",
92
+ "n01820546" : "lorikeet",
93
+ "n01824575" : "coucal",
94
+ "n01828970" : "bee_eater",
95
+ "n01829413" : "hornbill",
96
+ "n01833805" : "hummingbird",
97
+ "n01843065" : "jacamar",
98
+ "n01843383" : "toucan",
99
+ "n01847000" : "drake",
100
+ "n01855032" : "red-breasted_merganser",
101
+ "n01855672" : "goose",
102
+ "n01860187" : "black_swan",
103
+ "n01871265" : "tusker",
104
+ "n01872401" : "echidna",
105
+ "n01873310" : "platypus",
106
+ "n01877812" : "wallaby",
107
+ "n01882714" : "koala",
108
+ "n01883070" : "wombat",
109
+ "n01910747" : "jellyfish",
110
+ "n01914609" : "sea_anemone",
111
+ "n01917289" : "brain_coral",
112
+ "n01924916" : "flatworm",
113
+ "n01930112" : "nematode",
114
+ "n01943899" : "conch",
115
+ "n01944390" : "snail",
116
+ "n01945685" : "slug",
117
+ "n01950731" : "sea_slug",
118
+ "n01955084" : "chiton",
119
+ "n01968897" : "chambered_nautilus",
120
+ "n01978287" : "Dungeness_crab",
121
+ "n01978455" : "rock_crab",
122
+ "n01980166" : "fiddler_crab",
123
+ "n01981276" : "king_crab",
124
+ "n01983481" : "American_lobster",
125
+ "n01984695" : "spiny_lobster",
126
+ "n01985128" : "crayfish",
127
+ "n01986214" : "hermit_crab",
128
+ "n01990800" : "isopod",
129
+ "n02002556" : "white_stork",
130
+ "n02002724" : "black_stork",
131
+ "n02006656" : "spoonbill",
132
+ "n02007558" : "flamingo",
133
+ "n02009229" : "little_blue_heron",
134
+ "n02009912" : "American_egret",
135
+ "n02011460" : "bittern",
136
+ "n02012849" : "crane",
137
+ "n02013706" : "limpkin",
138
+ "n02017213" : "European_gallinule",
139
+ "n02018207" : "American_coot",
140
+ "n02018795" : "bustard",
141
+ "n02025239" : "ruddy_turnstone",
142
+ "n02027492" : "red-backed_sandpiper",
143
+ "n02028035" : "redshank",
144
+ "n02033041" : "dowitcher",
145
+ "n02037110" : "oystercatcher",
146
+ "n02051845" : "pelican",
147
+ "n02056570" : "king_penguin",
148
+ "n02058221" : "albatross",
149
+ "n02066245" : "grey_whale",
150
+ "n02071294" : "killer_whale",
151
+ "n02074367" : "dugong",
152
+ "n02077923" : "sea_lion",
153
+ "n02085620" : "Chihuahua",
154
+ "n02085782" : "Japanese_spaniel",
155
+ "n02085936" : "Maltese_dog",
156
+ "n02086079" : "Pekinese",
157
+ "n02086240" : "Shih-Tzu",
158
+ "n02086646" : "Blenheim_spaniel",
159
+ "n02086910" : "papillon",
160
+ "n02087046" : "toy_terrier",
161
+ "n02087394" : "Rhodesian_ridgeback",
162
+ "n02088094" : "Afghan_hound",
163
+ "n02088238" : "basset",
164
+ "n02088364" : "beagle",
165
+ "n02088466" : "bloodhound",
166
+ "n02088632" : "bluetick",
167
+ "n02089078" : "black-and-tan_coonhound",
168
+ "n02089867" : "Walker_hound",
169
+ "n02089973" : "English_foxhound",
170
+ "n02090379" : "redbone",
171
+ "n02090622" : "borzoi",
172
+ "n02090721" : "Irish_wolfhound",
173
+ "n02091032" : "Italian_greyhound",
174
+ "n02091134" : "whippet",
175
+ "n02091244" : "Ibizan_hound",
176
+ "n02091467" : "Norwegian_elkhound",
177
+ "n02091635" : "otterhound",
178
+ "n02091831" : "Saluki",
179
+ "n02092002" : "Scottish_deerhound",
180
+ "n02092339" : "Weimaraner",
181
+ "n02093256" : "Staffordshire_bullterrier",
182
+ "n02093428" : "American_Staffordshire_terrier",
183
+ "n02093647" : "Bedlington_terrier",
184
+ "n02093754" : "Border_terrier",
185
+ "n02093859" : "Kerry_blue_terrier",
186
+ "n02093991" : "Irish_terrier",
187
+ "n02094114" : "Norfolk_terrier",
188
+ "n02094258" : "Norwich_terrier",
189
+ "n02094433" : "Yorkshire_terrier",
190
+ "n02095314" : "wire-haired_fox_terrier",
191
+ "n02095570" : "Lakeland_terrier",
192
+ "n02095889" : "Sealyham_terrier",
193
+ "n02096051" : "Airedale",
194
+ "n02096177" : "cairn",
195
+ "n02096294" : "Australian_terrier",
196
+ "n02096437" : "Dandie_Dinmont",
197
+ "n02096585" : "Boston_bull",
198
+ "n02097047" : "miniature_schnauzer",
199
+ "n02097130" : "giant_schnauzer",
200
+ "n02097209" : "standard_schnauzer",
201
+ "n02097298" : "Scotch_terrier",
202
+ "n02097474" : "Tibetan_terrier",
203
+ "n02097658" : "silky_terrier",
204
+ "n02098105" : "soft-coated_wheaten_terrier",
205
+ "n02098286" : "West_Highland_white_terrier",
206
+ "n02098413" : "Lhasa",
207
+ "n02099267" : "flat-coated_retriever",
208
+ "n02099429" : "curly-coated_retriever",
209
+ "n02099601" : "golden_retriever",
210
+ "n02099712" : "Labrador_retriever",
211
+ "n02099849" : "Chesapeake_Bay_retriever",
212
+ "n02100236" : "German_short-haired_pointer",
213
+ "n02100583" : "vizsla",
214
+ "n02100735" : "English_setter",
215
+ "n02100877" : "Irish_setter",
216
+ "n02101006" : "Gordon_setter",
217
+ "n02101388" : "Brittany_spaniel",
218
+ "n02101556" : "clumber",
219
+ "n02102040" : "English_springer",
220
+ "n02102177" : "Welsh_springer_spaniel",
221
+ "n02102318" : "cocker_spaniel",
222
+ "n02102480" : "Sussex_spaniel",
223
+ "n02102973" : "Irish_water_spaniel",
224
+ "n02104029" : "kuvasz",
225
+ "n02104365" : "schipperke",
226
+ "n02105056" : "groenendael",
227
+ "n02105162" : "malinois",
228
+ "n02105251" : "briard",
229
+ "n02105412" : "kelpie",
230
+ "n02105505" : "komondor",
231
+ "n02105641" : "Old_English_sheepdog",
232
+ "n02105855" : "Shetland_sheepdog",
233
+ "n02106030" : "collie",
234
+ "n02106166" : "Border_collie",
235
+ "n02106382" : "Bouvier_des_Flandres",
236
+ "n02106550" : "Rottweiler",
237
+ "n02106662" : "German_shepherd",
238
+ "n02107142" : "Doberman",
239
+ "n02107312" : "miniature_pinscher",
240
+ "n02107574" : "Greater_Swiss_Mountain_dog",
241
+ "n02107683" : "Bernese_mountain_dog",
242
+ "n02107908" : "Appenzeller",
243
+ "n02108000" : "EntleBucher",
244
+ "n02108089" : "boxer",
245
+ "n02108422" : "bull_mastiff",
246
+ "n02108551" : "Tibetan_mastiff",
247
+ "n02108915" : "French_bulldog",
248
+ "n02109047" : "Great_Dane",
249
+ "n02109525" : "Saint_Bernard",
250
+ "n02109961" : "Eskimo_dog",
251
+ "n02110063" : "malamute",
252
+ "n02110185" : "Siberian_husky",
253
+ "n02110341" : "dalmatian",
254
+ "n02110627" : "affenpinscher",
255
+ "n02110806" : "basenji",
256
+ "n02110958" : "pug",
257
+ "n02111129" : "Leonberg",
258
+ "n02111277" : "Newfoundland",
259
+ "n02111500" : "Great_Pyrenees",
260
+ "n02111889" : "Samoyed",
261
+ "n02112018" : "Pomeranian",
262
+ "n02112137" : "chow",
263
+ "n02112350" : "keeshond",
264
+ "n02112706" : "Brabancon_griffon",
265
+ "n02113023" : "Pembroke",
266
+ "n02113186" : "Cardigan",
267
+ "n02113624" : "toy_poodle",
268
+ "n02113712" : "miniature_poodle",
269
+ "n02113799" : "standard_poodle",
270
+ "n02113978" : "Mexican_hairless",
271
+ "n02114367" : "timber_wolf",
272
+ "n02114548" : "white_wolf",
273
+ "n02114712" : "red_wolf",
274
+ "n02114855" : "coyote",
275
+ "n02115641" : "dingo",
276
+ "n02115913" : "dhole",
277
+ "n02116738" : "African_hunting_dog",
278
+ "n02117135" : "hyena",
279
+ "n02119022" : "red_fox",
280
+ "n02119789" : "kit_fox",
281
+ "n02120079" : "Arctic_fox",
282
+ "n02120505" : "grey_fox",
283
+ "n02123045" : "tabby",
284
+ "n02123159" : "tiger_cat",
285
+ "n02123394" : "Persian_cat",
286
+ "n02123597" : "Siamese_cat",
287
+ "n02124075" : "Egyptian_cat",
288
+ "n02125311" : "cougar",
289
+ "n02127052" : "lynx",
290
+ "n02128385" : "leopard",
291
+ "n02128757" : "snow_leopard",
292
+ "n02128925" : "jaguar",
293
+ "n02129165" : "lion",
294
+ "n02129604" : "tiger",
295
+ "n02130308" : "cheetah",
296
+ "n02132136" : "brown_bear",
297
+ "n02133161" : "American_black_bear",
298
+ "n02134084" : "ice_bear",
299
+ "n02134418" : "sloth_bear",
300
+ "n02137549" : "mongoose",
301
+ "n02138441" : "meerkat",
302
+ "n02165105" : "tiger_beetle",
303
+ "n02165456" : "ladybug",
304
+ "n02167151" : "ground_beetle",
305
+ "n02168699" : "long-horned_beetle",
306
+ "n02169497" : "leaf_beetle",
307
+ "n02172182" : "dung_beetle",
308
+ "n02174001" : "rhinoceros_beetle",
309
+ "n02177972" : "weevil",
310
+ "n02190166" : "fly",
311
+ "n02206856" : "bee",
312
+ "n02219486" : "ant",
313
+ "n02226429" : "grasshopper",
314
+ "n02229544" : "cricket",
315
+ "n02231487" : "walking_stick",
316
+ "n02233338" : "cockroach",
317
+ "n02236044" : "mantis",
318
+ "n02256656" : "cicada",
319
+ "n02259212" : "leafhopper",
320
+ "n02264363" : "lacewing",
321
+ "n02268443" : "dragonfly",
322
+ "n02268853" : "damselfly",
323
+ "n02276258" : "admiral",
324
+ "n02277742" : "ringlet",
325
+ "n02279972" : "monarch",
326
+ "n02280649" : "cabbage_butterfly",
327
+ "n02281406" : "sulphur_butterfly",
328
+ "n02281787" : "lycaenid",
329
+ "n02317335" : "starfish",
330
+ "n02319095" : "sea_urchin",
331
+ "n02321529" : "sea_cucumber",
332
+ "n02325366" : "wood_rabbit",
333
+ "n02326432" : "hare",
334
+ "n02328150" : "Angora",
335
+ "n02342885" : "hamster",
336
+ "n02346627" : "porcupine",
337
+ "n02356798" : "fox_squirrel",
338
+ "n02361337" : "marmot",
339
+ "n02363005" : "beaver",
340
+ "n02364673" : "guinea_pig",
341
+ "n02389026" : "sorrel",
342
+ "n02391049" : "zebra",
343
+ "n02395406" : "hog",
344
+ "n02396427" : "wild_boar",
345
+ "n02397096" : "warthog",
346
+ "n02398521" : "hippopotamus",
347
+ "n02403003" : "ox",
348
+ "n02408429" : "water_buffalo",
349
+ "n02410509" : "bison",
350
+ "n02412080" : "ram",
351
+ "n02415577" : "bighorn",
352
+ "n02417914" : "ibex",
353
+ "n02422106" : "hartebeest",
354
+ "n02422699" : "impala",
355
+ "n02423022" : "gazelle",
356
+ "n02437312" : "Arabian_camel",
357
+ "n02437616" : "llama",
358
+ "n02441942" : "weasel",
359
+ "n02442845" : "mink",
360
+ "n02443114" : "polecat",
361
+ "n02443484" : "black-footed_ferret",
362
+ "n02444819" : "otter",
363
+ "n02445715" : "skunk",
364
+ "n02447366" : "badger",
365
+ "n02454379" : "armadillo",
366
+ "n02457408" : "three-toed_sloth",
367
+ "n02480495" : "orangutan",
368
+ "n02480855" : "gorilla",
369
+ "n02481823" : "chimpanzee",
370
+ "n02483362" : "gibbon",
371
+ "n02483708" : "siamang",
372
+ "n02484975" : "guenon",
373
+ "n02486261" : "patas",
374
+ "n02486410" : "baboon",
375
+ "n02487347" : "macaque",
376
+ "n02488291" : "langur",
377
+ "n02488702" : "colobus",
378
+ "n02489166" : "proboscis_monkey",
379
+ "n02490219" : "marmoset",
380
+ "n02492035" : "capuchin",
381
+ "n02492660" : "howler_monkey",
382
+ "n02493509" : "titi",
383
+ "n02493793" : "spider_monkey",
384
+ "n02494079" : "squirrel_monkey",
385
+ "n02497673" : "Madagascar_cat",
386
+ "n02500267" : "indri",
387
+ "n02504013" : "Indian_elephant",
388
+ "n02504458" : "African_elephant",
389
+ "n02509815" : "lesser_panda",
390
+ "n02510455" : "giant_panda",
391
+ "n02514041" : "barracouta",
392
+ "n02526121" : "eel",
393
+ "n02536864" : "coho",
394
+ "n02606052" : "rock_beauty",
395
+ "n02607072" : "anemone_fish",
396
+ "n02640242" : "sturgeon",
397
+ "n02641379" : "gar",
398
+ "n02643566" : "lionfish",
399
+ "n02655020" : "puffer",
400
+ "n02666196" : "abacus",
401
+ "n02667093" : "abaya",
402
+ "n02669723" : "academic_gown",
403
+ "n02672831" : "accordion",
404
+ "n02676566" : "acoustic_guitar",
405
+ "n02687172" : "aircraft_carrier",
406
+ "n02690373" : "airliner",
407
+ "n02692877" : "airship",
408
+ "n02699494" : "altar",
409
+ "n02701002" : "ambulance",
410
+ "n02704792" : "amphibian",
411
+ "n02708093" : "analog_clock",
412
+ "n02727426" : "apiary",
413
+ "n02730930" : "apron",
414
+ "n02747177" : "ashcan",
415
+ "n02749479" : "assault_rifle",
416
+ "n02769748" : "backpack",
417
+ "n02776631" : "bakery",
418
+ "n02777292" : "balance_beam",
419
+ "n02782093" : "balloon",
420
+ "n02783161" : "ballpoint",
421
+ "n02786058" : "Band_Aid",
422
+ "n02787622" : "banjo",
423
+ "n02788148" : "bannister",
424
+ "n02790996" : "barbell",
425
+ "n02791124" : "barber_chair",
426
+ "n02791270" : "barbershop",
427
+ "n02793495" : "barn",
428
+ "n02794156" : "barometer",
429
+ "n02795169" : "barrel",
430
+ "n02797295" : "barrow",
431
+ "n02799071" : "baseball",
432
+ "n02802426" : "basketball",
433
+ "n02804414" : "bassinet",
434
+ "n02804610" : "bassoon",
435
+ "n02807133" : "bathing_cap",
436
+ "n02808304" : "bath_towel",
437
+ "n02808440" : "bathtub",
438
+ "n02814533" : "beach_wagon",
439
+ "n02814860" : "beacon",
440
+ "n02815834" : "beaker",
441
+ "n02817516" : "bearskin",
442
+ "n02823428" : "beer_bottle",
443
+ "n02823750" : "beer_glass",
444
+ "n02825657" : "bell_cote",
445
+ "n02834397" : "bib",
446
+ "n02835271" : "bicycle-built-for-two",
447
+ "n02837789" : "bikini",
448
+ "n02840245" : "binder",
449
+ "n02841315" : "binoculars",
450
+ "n02843684" : "birdhouse",
451
+ "n02859443" : "boathouse",
452
+ "n02860847" : "bobsled",
453
+ "n02865351" : "bolo_tie",
454
+ "n02869837" : "bonnet",
455
+ "n02870880" : "bookcase",
456
+ "n02871525" : "bookshop",
457
+ "n02877765" : "bottlecap",
458
+ "n02879718" : "bow",
459
+ "n02883205" : "bow_tie",
460
+ "n02892201" : "brass",
461
+ "n02892767" : "brassiere",
462
+ "n02894605" : "breakwater",
463
+ "n02895154" : "breastplate",
464
+ "n02906734" : "broom",
465
+ "n02909870" : "bucket",
466
+ "n02910353" : "buckle",
467
+ "n02916936" : "bulletproof_vest",
468
+ "n02917067" : "bullet_train",
469
+ "n02927161" : "butcher_shop",
470
+ "n02930766" : "cab",
471
+ "n02939185" : "caldron",
472
+ "n02948072" : "candle",
473
+ "n02950826" : "cannon",
474
+ "n02951358" : "canoe",
475
+ "n02951585" : "can_opener",
476
+ "n02963159" : "cardigan",
477
+ "n02965783" : "car_mirror",
478
+ "n02966193" : "carousel",
479
+ "n02966687" : "carpenter's_kit",
480
+ "n02971356" : "carton",
481
+ "n02974003" : "car_wheel",
482
+ "n02977058" : "cash_machine",
483
+ "n02978881" : "cassette",
484
+ "n02979186" : "cassette_player",
485
+ "n02980441" : "castle",
486
+ "n02981792" : "catamaran",
487
+ "n02988304" : "CD_player",
488
+ "n02992211" : "cello",
489
+ "n02992529" : "cellular_telephone",
490
+ "n02999410" : "chain",
491
+ "n03000134" : "chainlink_fence",
492
+ "n03000247" : "chain_mail",
493
+ "n03000684" : "chain_saw",
494
+ "n03014705" : "chest",
495
+ "n03016953" : "chiffonier",
496
+ "n03017168" : "chime",
497
+ "n03018349" : "china_cabinet",
498
+ "n03026506" : "Christmas_stocking",
499
+ "n03028079" : "church",
500
+ "n03032252" : "cinema",
501
+ "n03041632" : "cleaver",
502
+ "n03042490" : "cliff_dwelling",
503
+ "n03045698" : "cloak",
504
+ "n03047690" : "clog",
505
+ "n03062245" : "cocktail_shaker",
506
+ "n03063599" : "coffee_mug",
507
+ "n03063689" : "coffeepot",
508
+ "n03065424" : "coil",
509
+ "n03075370" : "combination_lock",
510
+ "n03085013" : "computer_keyboard",
511
+ "n03089624" : "confectionery",
512
+ "n03095699" : "container_ship",
513
+ "n03100240" : "convertible",
514
+ "n03109150" : "corkscrew",
515
+ "n03110669" : "cornet",
516
+ "n03124043" : "cowboy_boot",
517
+ "n03124170" : "cowboy_hat",
518
+ "n03125729" : "cradle",
519
+ "n03126707" : "crane",
520
+ "n03127747" : "crash_helmet",
521
+ "n03127925" : "crate",
522
+ "n03131574" : "crib",
523
+ "n03133878" : "Crock_Pot",
524
+ "n03134739" : "croquet_ball",
525
+ "n03141823" : "crutch",
526
+ "n03146219" : "cuirass",
527
+ "n03160309" : "dam",
528
+ "n03179701" : "desk",
529
+ "n03180011" : "desktop_computer",
530
+ "n03187595" : "dial_telephone",
531
+ "n03188531" : "diaper",
532
+ "n03196217" : "digital_clock",
533
+ "n03197337" : "digital_watch",
534
+ "n03201208" : "dining_table",
535
+ "n03207743" : "dishrag",
536
+ "n03207941" : "dishwasher",
537
+ "n03208938" : "disk_brake",
538
+ "n03216828" : "dock",
539
+ "n03218198" : "dogsled",
540
+ "n03220513" : "dome",
541
+ "n03223299" : "doormat",
542
+ "n03240683" : "drilling_platform",
543
+ "n03249569" : "drum",
544
+ "n03250847" : "drumstick",
545
+ "n03255030" : "dumbbell",
546
+ "n03259280" : "Dutch_oven",
547
+ "n03271574" : "electric_fan",
548
+ "n03272010" : "electric_guitar",
549
+ "n03272562" : "electric_locomotive",
550
+ "n03290653" : "entertainment_center",
551
+ "n03291819" : "envelope",
552
+ "n03297495" : "espresso_maker",
553
+ "n03314780" : "face_powder",
554
+ "n03325584" : "feather_boa",
555
+ "n03337140" : "file",
556
+ "n03344393" : "fireboat",
557
+ "n03345487" : "fire_engine",
558
+ "n03347037" : "fire_screen",
559
+ "n03355925" : "flagpole",
560
+ "n03372029" : "flute",
561
+ "n03376595" : "folding_chair",
562
+ "n03379051" : "football_helmet",
563
+ "n03384352" : "forklift",
564
+ "n03388043" : "fountain",
565
+ "n03388183" : "fountain_pen",
566
+ "n03388549" : "four-poster",
567
+ "n03393912" : "freight_car",
568
+ "n03394916" : "French_horn",
569
+ "n03400231" : "frying_pan",
570
+ "n03404251" : "fur_coat",
571
+ "n03417042" : "garbage_truck",
572
+ "n03424325" : "gasmask",
573
+ "n03425413" : "gas_pump",
574
+ "n03443371" : "goblet",
575
+ "n03444034" : "go-kart",
576
+ "n03445777" : "golf_ball",
577
+ "n03445924" : "golfcart",
578
+ "n03447447" : "gondola",
579
+ "n03447721" : "gong",
580
+ "n03450230" : "gown",
581
+ "n03452741" : "grand_piano",
582
+ "n03457902" : "greenhouse",
583
+ "n03459775" : "grille",
584
+ "n03461385" : "grocery_store",
585
+ "n03467068" : "guillotine",
586
+ "n03476684" : "hair_slide",
587
+ "n03476991" : "hair_spray",
588
+ "n03478589" : "half_track",
589
+ "n03481172" : "hammer",
590
+ "n03482405" : "hamper",
591
+ "n03483316" : "hand_blower",
592
+ "n03485407" : "hand-held_computer",
593
+ "n03485794" : "handkerchief",
594
+ "n03492542" : "hard_disc",
595
+ "n03494278" : "harmonica",
596
+ "n03495258" : "harp",
597
+ "n03496892" : "harvester",
598
+ "n03498962" : "hatchet",
599
+ "n03527444" : "holster",
600
+ "n03529860" : "home_theater",
601
+ "n03530642" : "honeycomb",
602
+ "n03532672" : "hook",
603
+ "n03534580" : "hoopskirt",
604
+ "n03535780" : "horizontal_bar",
605
+ "n03538406" : "horse_cart",
606
+ "n03544143" : "hourglass",
607
+ "n03584254" : "iPod",
608
+ "n03584829" : "iron",
609
+ "n03590841" : "jack-o'-lantern",
610
+ "n03594734" : "jean",
611
+ "n03594945" : "jeep",
612
+ "n03595614" : "jersey",
613
+ "n03598930" : "jigsaw_puzzle",
614
+ "n03599486" : "jinrikisha",
615
+ "n03602883" : "joystick",
616
+ "n03617480" : "kimono",
617
+ "n03623198" : "knee_pad",
618
+ "n03627232" : "knot",
619
+ "n03630383" : "lab_coat",
620
+ "n03633091" : "ladle",
621
+ "n03637318" : "lampshade",
622
+ "n03642806" : "laptop",
623
+ "n03649909" : "lawn_mower",
624
+ "n03657121" : "lens_cap",
625
+ "n03658185" : "letter_opener",
626
+ "n03661043" : "library",
627
+ "n03662601" : "lifeboat",
628
+ "n03666591" : "lighter",
629
+ "n03670208" : "limousine",
630
+ "n03673027" : "liner",
631
+ "n03676483" : "lipstick",
632
+ "n03680355" : "Loafer",
633
+ "n03690938" : "lotion",
634
+ "n03691459" : "loudspeaker",
635
+ "n03692522" : "loupe",
636
+ "n03697007" : "lumbermill",
637
+ "n03706229" : "magnetic_compass",
638
+ "n03709823" : "mailbag",
639
+ "n03710193" : "mailbox",
640
+ "n03710637" : "maillot",
641
+ "n03710721" : "maillot",
642
+ "n03717622" : "manhole_cover",
643
+ "n03720891" : "maraca",
644
+ "n03721384" : "marimba",
645
+ "n03724870" : "mask",
646
+ "n03729826" : "matchstick",
647
+ "n03733131" : "maypole",
648
+ "n03733281" : "maze",
649
+ "n03733805" : "measuring_cup",
650
+ "n03742115" : "medicine_chest",
651
+ "n03743016" : "megalith",
652
+ "n03759954" : "microphone",
653
+ "n03761084" : "microwave",
654
+ "n03763968" : "military_uniform",
655
+ "n03764736" : "milk_can",
656
+ "n03769881" : "minibus",
657
+ "n03770439" : "miniskirt",
658
+ "n03770679" : "minivan",
659
+ "n03773504" : "missile",
660
+ "n03775071" : "mitten",
661
+ "n03775546" : "mixing_bowl",
662
+ "n03776460" : "mobile_home",
663
+ "n03777568" : "Model_T",
664
+ "n03777754" : "modem",
665
+ "n03781244" : "monastery",
666
+ "n03782006" : "monitor",
667
+ "n03785016" : "moped",
668
+ "n03786901" : "mortar",
669
+ "n03787032" : "mortarboard",
670
+ "n03788195" : "mosque",
671
+ "n03788365" : "mosquito_net",
672
+ "n03791053" : "motor_scooter",
673
+ "n03792782" : "mountain_bike",
674
+ "n03792972" : "mountain_tent",
675
+ "n03793489" : "mouse",
676
+ "n03794056" : "mousetrap",
677
+ "n03796401" : "moving_van",
678
+ "n03803284" : "muzzle",
679
+ "n03804744" : "nail",
680
+ "n03814639" : "neck_brace",
681
+ "n03814906" : "necklace",
682
+ "n03825788" : "nipple",
683
+ "n03832673" : "notebook",
684
+ "n03837869" : "obelisk",
685
+ "n03838899" : "oboe",
686
+ "n03840681" : "ocarina",
687
+ "n03841143" : "odometer",
688
+ "n03843555" : "oil_filter",
689
+ "n03854065" : "organ",
690
+ "n03857828" : "oscilloscope",
691
+ "n03866082" : "overskirt",
692
+ "n03868242" : "oxcart",
693
+ "n03868863" : "oxygen_mask",
694
+ "n03871628" : "packet",
695
+ "n03873416" : "paddle",
696
+ "n03874293" : "paddlewheel",
697
+ "n03874599" : "padlock",
698
+ "n03876231" : "paintbrush",
699
+ "n03877472" : "pajama",
700
+ "n03877845" : "palace",
701
+ "n03884397" : "panpipe",
702
+ "n03887697" : "paper_towel",
703
+ "n03888257" : "parachute",
704
+ "n03888605" : "parallel_bars",
705
+ "n03891251" : "park_bench",
706
+ "n03891332" : "parking_meter",
707
+ "n03895866" : "passenger_car",
708
+ "n03899768" : "patio",
709
+ "n03902125" : "pay-phone",
710
+ "n03903868" : "pedestal",
711
+ "n03908618" : "pencil_box",
712
+ "n03908714" : "pencil_sharpener",
713
+ "n03916031" : "perfume",
714
+ "n03920288" : "Petri_dish",
715
+ "n03924679" : "photocopier",
716
+ "n03929660" : "pick",
717
+ "n03929855" : "pickelhaube",
718
+ "n03930313" : "picket_fence",
719
+ "n03930630" : "pickup",
720
+ "n03933933" : "pier",
721
+ "n03935335" : "piggy_bank",
722
+ "n03937543" : "pill_bottle",
723
+ "n03938244" : "pillow",
724
+ "n03942813" : "ping-pong_ball",
725
+ "n03944341" : "pinwheel",
726
+ "n03947888" : "pirate",
727
+ "n03950228" : "pitcher",
728
+ "n03954731" : "plane",
729
+ "n03956157" : "planetarium",
730
+ "n03958227" : "plastic_bag",
731
+ "n03961711" : "plate_rack",
732
+ "n03967562" : "plow",
733
+ "n03970156" : "plunger",
734
+ "n03976467" : "Polaroid_camera",
735
+ "n03976657" : "pole",
736
+ "n03977966" : "police_van",
737
+ "n03980874" : "poncho",
738
+ "n03982430" : "pool_table",
739
+ "n03983396" : "pop_bottle",
740
+ "n03991062" : "pot",
741
+ "n03992509" : "potter's_wheel",
742
+ "n03995372" : "power_drill",
743
+ "n03998194" : "prayer_rug",
744
+ "n04004767" : "printer",
745
+ "n04005630" : "prison",
746
+ "n04008634" : "projectile",
747
+ "n04009552" : "projector",
748
+ "n04019541" : "puck",
749
+ "n04023962" : "punching_bag",
750
+ "n04026417" : "purse",
751
+ "n04033901" : "quill",
752
+ "n04033995" : "quilt",
753
+ "n04037443" : "racer",
754
+ "n04039381" : "racket",
755
+ "n04040759" : "radiator",
756
+ "n04041544" : "radio",
757
+ "n04044716" : "radio_telescope",
758
+ "n04049303" : "rain_barrel",
759
+ "n04065272" : "recreational_vehicle",
760
+ "n04067472" : "reel",
761
+ "n04069434" : "reflex_camera",
762
+ "n04070727" : "refrigerator",
763
+ "n04074963" : "remote_control",
764
+ "n04081281" : "restaurant",
765
+ "n04086273" : "revolver",
766
+ "n04090263" : "rifle",
767
+ "n04099969" : "rocking_chair",
768
+ "n04111531" : "rotisserie",
769
+ "n04116512" : "rubber_eraser",
770
+ "n04118538" : "rugby_ball",
771
+ "n04118776" : "rule",
772
+ "n04120489" : "running_shoe",
773
+ "n04125021" : "safe",
774
+ "n04127249" : "safety_pin",
775
+ "n04131690" : "saltshaker",
776
+ "n04133789" : "sandal",
777
+ "n04136333" : "sarong",
778
+ "n04141076" : "sax",
779
+ "n04141327" : "scabbard",
780
+ "n04141975" : "scale",
781
+ "n04146614" : "school_bus",
782
+ "n04147183" : "schooner",
783
+ "n04149813" : "scoreboard",
784
+ "n04152593" : "screen",
785
+ "n04153751" : "screw",
786
+ "n04154565" : "screwdriver",
787
+ "n04162706" : "seat_belt",
788
+ "n04179913" : "sewing_machine",
789
+ "n04192698" : "shield",
790
+ "n04200800" : "shoe_shop",
791
+ "n04201297" : "shoji",
792
+ "n04204238" : "shopping_basket",
793
+ "n04204347" : "shopping_cart",
794
+ "n04208210" : "shovel",
795
+ "n04209133" : "shower_cap",
796
+ "n04209239" : "shower_curtain",
797
+ "n04228054" : "ski",
798
+ "n04229816" : "ski_mask",
799
+ "n04235860" : "sleeping_bag",
800
+ "n04238763" : "slide_rule",
801
+ "n04239074" : "sliding_door",
802
+ "n04243546" : "slot",
803
+ "n04251144" : "snorkel",
804
+ "n04252077" : "snowmobile",
805
+ "n04252225" : "snowplow",
806
+ "n04254120" : "soap_dispenser",
807
+ "n04254680" : "soccer_ball",
808
+ "n04254777" : "sock",
809
+ "n04258138" : "solar_dish",
810
+ "n04259630" : "sombrero",
811
+ "n04263257" : "soup_bowl",
812
+ "n04264628" : "space_bar",
813
+ "n04265275" : "space_heater",
814
+ "n04266014" : "space_shuttle",
815
+ "n04270147" : "spatula",
816
+ "n04273569" : "speedboat",
817
+ "n04275548" : "spider_web",
818
+ "n04277352" : "spindle",
819
+ "n04285008" : "sports_car",
820
+ "n04286575" : "spotlight",
821
+ "n04296562" : "stage",
822
+ "n04310018" : "steam_locomotive",
823
+ "n04311004" : "steel_arch_bridge",
824
+ "n04311174" : "steel_drum",
825
+ "n04317175" : "stethoscope",
826
+ "n04325704" : "stole",
827
+ "n04326547" : "stone_wall",
828
+ "n04328186" : "stopwatch",
829
+ "n04330267" : "stove",
830
+ "n04332243" : "strainer",
831
+ "n04335435" : "streetcar",
832
+ "n04336792" : "stretcher",
833
+ "n04344873" : "studio_couch",
834
+ "n04346328" : "stupa",
835
+ "n04347754" : "submarine",
836
+ "n04350905" : "suit",
837
+ "n04355338" : "sundial",
838
+ "n04355933" : "sunglass",
839
+ "n04356056" : "sunglasses",
840
+ "n04357314" : "sunscreen",
841
+ "n04366367" : "suspension_bridge",
842
+ "n04367480" : "swab",
843
+ "n04370456" : "sweatshirt",
844
+ "n04371430" : "swimming_trunks",
845
+ "n04371774" : "swing",
846
+ "n04372370" : "switch",
847
+ "n04376876" : "syringe",
848
+ "n04380533" : "table_lamp",
849
+ "n04389033" : "tank",
850
+ "n04392985" : "tape_player",
851
+ "n04398044" : "teapot",
852
+ "n04399382" : "teddy",
853
+ "n04404412" : "television",
854
+ "n04409515" : "tennis_ball",
855
+ "n04417672" : "thatch",
856
+ "n04418357" : "theater_curtain",
857
+ "n04423845" : "thimble",
858
+ "n04428191" : "thresher",
859
+ "n04429376" : "throne",
860
+ "n04435653" : "tile_roof",
861
+ "n04442312" : "toaster",
862
+ "n04443257" : "tobacco_shop",
863
+ "n04447861" : "toilet_seat",
864
+ "n04456115" : "torch",
865
+ "n04458633" : "totem_pole",
866
+ "n04461696" : "tow_truck",
867
+ "n04462240" : "toyshop",
868
+ "n04465501" : "tractor",
869
+ "n04467665" : "trailer_truck",
870
+ "n04476259" : "tray",
871
+ "n04479046" : "trench_coat",
872
+ "n04482393" : "tricycle",
873
+ "n04483307" : "trimaran",
874
+ "n04485082" : "tripod",
875
+ "n04486054" : "triumphal_arch",
876
+ "n04487081" : "trolleybus",
877
+ "n04487394" : "trombone",
878
+ "n04493381" : "tub",
879
+ "n04501370" : "turnstile",
880
+ "n04505470" : "typewriter_keyboard",
881
+ "n04507155" : "umbrella",
882
+ "n04509417" : "unicycle",
883
+ "n04515003" : "upright",
884
+ "n04517823" : "vacuum",
885
+ "n04522168" : "vase",
886
+ "n04523525" : "vault",
887
+ "n04525038" : "velvet",
888
+ "n04525305" : "vending_machine",
889
+ "n04532106" : "vestment",
890
+ "n04532670" : "viaduct",
891
+ "n04536866" : "violin",
892
+ "n04540053" : "volleyball",
893
+ "n04542943" : "waffle_iron",
894
+ "n04548280" : "wall_clock",
895
+ "n04548362" : "wallet",
896
+ "n04550184" : "wardrobe",
897
+ "n04552348" : "warplane",
898
+ "n04553703" : "washbasin",
899
+ "n04554684" : "washer",
900
+ "n04557648" : "water_bottle",
901
+ "n04560804" : "water_jug",
902
+ "n04562935" : "water_tower",
903
+ "n04579145" : "whiskey_jug",
904
+ "n04579432" : "whistle",
905
+ "n04584207" : "wig",
906
+ "n04589890" : "window_screen",
907
+ "n04590129" : "window_shade",
908
+ "n04591157" : "Windsor_tie",
909
+ "n04591713" : "wine_bottle",
910
+ "n04592741" : "wing",
911
+ "n04596742" : "wok",
912
+ "n04597913" : "wooden_spoon",
913
+ "n04599235" : "wool",
914
+ "n04604644" : "worm_fence",
915
+ "n04606251" : "wreck",
916
+ "n04612504" : "yawl",
917
+ "n04613696" : "yurt",
918
+ "n06359193" : "web_site",
919
+ "n06596364" : "comic_book",
920
+ "n06785654" : "crossword_puzzle",
921
+ "n06794110" : "street_sign",
922
+ "n06874185" : "traffic_light",
923
+ "n07248320" : "book_jacket",
924
+ "n07565083" : "menu",
925
+ "n07579787" : "plate",
926
+ "n07583066" : "guacamole",
927
+ "n07584110" : "consomme",
928
+ "n07590611" : "hot_pot",
929
+ "n07613480" : "trifle",
930
+ "n07614500" : "ice_cream",
931
+ "n07615774" : "ice_lolly",
932
+ "n07684084" : "French_loaf",
933
+ "n07693725" : "bagel",
934
+ "n07695742" : "pretzel",
935
+ "n07697313" : "cheeseburger",
936
+ "n07697537" : "hotdog",
937
+ "n07711569" : "mashed_potato",
938
+ "n07714571" : "head_cabbage",
939
+ "n07714990" : "broccoli",
940
+ "n07715103" : "cauliflower",
941
+ "n07716358" : "zucchini",
942
+ "n07716906" : "spaghetti_squash",
943
+ "n07717410" : "acorn_squash",
944
+ "n07717556" : "butternut_squash",
945
+ "n07718472" : "cucumber",
946
+ "n07718747" : "artichoke",
947
+ "n07720875" : "bell_pepper",
948
+ "n07730033" : "cardoon",
949
+ "n07734744" : "mushroom",
950
+ "n07742313" : "Granny_Smith",
951
+ "n07745940" : "strawberry",
952
+ "n07747607" : "orange",
953
+ "n07749582" : "lemon",
954
+ "n07753113" : "fig",
955
+ "n07753275" : "pineapple",
956
+ "n07753592" : "banana",
957
+ "n07754684" : "jackfruit",
958
+ "n07760859" : "custard_apple",
959
+ "n07768694" : "pomegranate",
960
+ "n07802026" : "hay",
961
+ "n07831146" : "carbonara",
962
+ "n07836838" : "chocolate_sauce",
963
+ "n07860988" : "dough",
964
+ "n07871810" : "meat_loaf",
965
+ "n07873807" : "pizza",
966
+ "n07875152" : "potpie",
967
+ "n07880968" : "burrito",
968
+ "n07892512" : "red_wine",
969
+ "n07920052" : "espresso",
970
+ "n07930864" : "cup",
971
+ "n07932039" : "eggnog",
972
+ "n09193705" : "alp",
973
+ "n09229709" : "bubble",
974
+ "n09246464" : "cliff",
975
+ "n09256479" : "coral_reef",
976
+ "n09288635" : "geyser",
977
+ "n09332890" : "lakeside",
978
+ "n09399592" : "promontory",
979
+ "n09421951" : "sandbar",
980
+ "n09428293" : "seashore",
981
+ "n09468604" : "valley",
982
+ "n09472597" : "volcano",
983
+ "n09835506" : "ballplayer",
984
+ "n10148035" : "groom",
985
+ "n10565667" : "scuba_diver",
986
+ "n11879895" : "rapeseed",
987
+ "n11939491" : "daisy",
988
+ "n12057211" : "yellow_lady's_slipper",
989
+ "n12144580" : "corn",
990
+ "n12267677" : "acorn",
991
+ "n12620546" : "hip",
992
+ "n12768682" : "buckeye",
993
+ "n12985857" : "coral_fungus",
994
+ "n12998815" : "agaric",
995
+ "n13037406" : "gyromitra",
996
+ "n13040303" : "stinkhorn",
997
+ "n13044778" : "earthstar",
998
+ "n13052670" : "hen-of-the-woods",
999
+ "n13054560" : "bolete",
1000
+ "n13133613" : "ear",
1001
+ "n15075141" : "toilet_tissu"
1002
+ }