xairesearch2023-advnet commited on
Commit
ec3e236
·
verified ·
1 Parent(s): ebd9327

Upload 206 files

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +1 -0
  2. README.md +5 -5
  3. app.py +426 -0
  4. dogs/top1/n02085936-Maltese_dog_67_3.jpeg +0 -0
  5. dogs/top1/n02086079-Pekinese_68_2.jpeg +0 -0
  6. dogs/top1/n02086240-Shih-Tzu_332_1.jpeg +0 -0
  7. dogs/top1/n02086240-Shih-Tzu_74_3.jpeg +0 -0
  8. dogs/top1/n02086646-Blenheim_spaniel_53_1.jpeg +0 -0
  9. dogs/top1/n02086910-papillon_337_2.jpeg +0 -0
  10. dogs/top1/n02086910-papillon_56_0.jpeg +0 -0
  11. dogs/top1/n02087394-Rhodesian_ridgeback_431_2.jpeg +0 -0
  12. dogs/top1/n02088094-Afghan_hound_42_2.jpeg +0 -0
  13. dogs/top1/n02088364-beagle_170_0.jpeg +0 -0
  14. dogs/top1/n02088364-beagle_215_2.jpeg +0 -0
  15. dogs/top1/n02088364-beagle_226_1.jpeg +0 -0
  16. dogs/top1/n02088632-bluetick_253_1.jpeg +0 -0
  17. dogs/top1/n02089078-black-and-tan_coonhound_285_2.jpeg +0 -0
  18. dogs/top1/n02089078-black-and-tan_coonhound_55_3.jpeg +0 -0
  19. dogs/top1/n02089867-Walker_hound_0_1.jpeg +0 -0
  20. dogs/top1/n02089867-Walker_hound_429_1.jpeg +0 -0
  21. dogs/top1/n02090379-redbone_42_3.jpeg +0 -0
  22. dogs/top1/n02091032-Italian_greyhound_225_1.jpeg +0 -0
  23. dogs/top1/n02091032-Italian_greyhound_24_3.jpeg +0 -0
  24. dogs/top1/n02091032-Italian_greyhound_2_0.jpeg +0 -0
  25. dogs/top1/n02091134-whippet_17_1.jpeg +0 -0
  26. dogs/top1/n02091134-whippet_264_3.jpeg +0 -0
  27. dogs/top1/n02091134-whippet_64_1.jpeg +0 -0
  28. dogs/top1/n02093256-Staffordshire_bullterrier_15_0.jpeg +0 -0
  29. dogs/top1/n02093256-Staffordshire_bullterrier_340_0.jpeg +0 -0
  30. dogs/top1/n02093428-American_Staffordshire_terrier_438_3.jpeg +0 -0
  31. dogs/top1/n02093859-Kerry_blue_terrier_33_3.jpeg +0 -0
  32. dogs/top1/n02094114-Norfolk_terrier_19_3.jpeg +0 -0
  33. dogs/top1/n02094258-Norwich_terrier_109_0.jpeg +0 -0
  34. dogs/top1/n02094258-Norwich_terrier_147_3.jpeg +0 -0
  35. dogs/top1/n02094258-Norwich_terrier_327_2.jpeg +0 -0
  36. dogs/top1/n02094433-Yorkshire_terrier_33_0.jpeg +0 -0
  37. dogs/top1/n02095314-wire-haired_fox_terrier_56_2.jpeg +0 -0
  38. dogs/top1/n02095570-Lakeland_terrier_74_2.jpeg +0 -0
  39. dogs/top1/n02095889-Sealyham_terrier_276_1.jpeg +0 -0
  40. dogs/top1/n02096051-Airedale_22_3.jpeg +0 -0
  41. dogs/top1/n02096177-cairn_244_3.jpeg +0 -0
  42. dogs/top1/n02096177-cairn_70_2.jpeg +0 -0
  43. dogs/top1/n02096177-cairn_84_0.jpeg +0 -0
  44. dogs/top1/n02096294-Australian_terrier_292_1.jpeg +0 -0
  45. dogs/top1/n02096294-Australian_terrier_413_2.jpeg +0 -0
  46. dogs/top1/n02096585-Boston_bull_1_0.jpeg +0 -0
  47. dogs/top1/n02096585-Boston_bull_24_1.jpeg +0 -0
  48. dogs/top1/n02097047-miniature_schnauzer_83_1.jpeg +0 -0
  49. dogs/top1/n02097474-Tibetan_terrier_135_3.jpeg +0 -0
  50. dogs/top1/n02097474-Tibetan_terrier_36_0.jpeg +0 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ images/intro.jpg filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -1,10 +1,10 @@
1
  ---
2
- title: HumanStudy Dogs
3
- emoji: 🏢
4
- colorFrom: pink
5
- colorTo: yellow
6
  sdk: gradio
7
- sdk_version: 4.31.1
8
  app_file: app.py
9
  pinned: false
10
  ---
 
1
  ---
2
+ title: PCNN-StanfordDogs-HumanStudy
3
+ emoji: 🐕
4
+ colorFrom: green
5
+ colorTo: red
6
  sdk: gradio
7
+ sdk_version: 4.29.0
8
  app_file: app.py
9
  pinned: false
10
  ---
app.py ADDED
@@ -0,0 +1,426 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import gradio as gr
3
+ import numpy as np
4
+ import time
5
+ import csv
6
+ import json
7
+ import os
8
+ import random
9
+ import string
10
+ import sys
11
+ import time
12
+ import gradio as gr
13
+ import numpy as np
14
+ import pandas as pd
15
+ from huggingface_hub import (
16
+ CommitScheduler,
17
+ HfApi,
18
+ InferenceClient,
19
+ login,
20
+ snapshot_download,
21
+ hf_hub_download,
22
+ )
23
+ from PIL import Image
24
+ from utils import string_to_image
25
+ import matplotlib.backends.backend_agg as agg
26
+ import math
27
+ from pathlib import Path
28
+ import zipfile
29
+ import gdown
30
+
31
+ random.seed(int(time.time()))
32
+ np.random.seed(int(time.time()))
33
+ csv.field_size_limit(sys.maxsize)
34
+
35
+
36
+ ###############################################################################################################
37
+ session_token = os.environ.get("SessionToken")
38
+ login(token=session_token, add_to_git_credential=True)
39
+
40
+ NUMBER_OF_IMAGES = 30
41
+ intro_screen = Image.open("./images/intro.jpg")
42
+
43
+
44
+ meta_top1 = json.load(open("./dogs/top1/metadata.json"))
45
+ meta_topk = json.load(open("./dogs/topk/metadata.json"))
46
+
47
+ all_data = {}
48
+ all_data["top1"] = meta_top1
49
+ all_data["topk"] = meta_topk
50
+
51
+
52
+ # for data in all_data["top1"] and all_data["topk"] add a key to show which type they are
53
+ for k in all_data["top1"].keys():
54
+ all_data["top1"][k]["type"] = "top1"
55
+
56
+ for k in all_data["topk"].keys():
57
+ all_data["topk"][k]["type"] = "topk"
58
+
59
+
60
+ REPO_URL = "xairesearch2023-advnet/HumanStudyData-Dogs"
61
+ JSON_DATASET_DIR = Path("responses")
62
+
63
+ ################################################################################################################
64
+
65
+ scheduler = CommitScheduler(
66
+ repo_id=REPO_URL,
67
+ repo_type="dataset",
68
+ folder_path=JSON_DATASET_DIR,
69
+ path_in_repo="./data",
70
+ every=1,
71
+ private=True,
72
+ )
73
+
74
+
75
+ if not JSON_DATASET_DIR.exists():
76
+ JSON_DATASET_DIR.mkdir()
77
+
78
+
79
+ def generate_data(type_of_nns, seed):
80
+ global NUMBER_OF_IMAGES
81
+ random.seed(int(seed)) # Set the random seed
82
+ keys = list(all_data[type_of_nns].keys())
83
+ sample_data = random.sample(keys, NUMBER_OF_IMAGES)
84
+
85
+ data = []
86
+ for k in sample_data:
87
+ new_datapoint = all_data[type_of_nns][k]
88
+ new_datapoint["image-path"] = f"./dogs/{type_of_nns}/{k}.jpeg"
89
+ data.append(new_datapoint)
90
+
91
+ return data
92
+
93
+
94
+ def load_sample(data, current_index):
95
+ current_datapoint = data[current_index]
96
+
97
+ image_path = current_datapoint["image-path"]
98
+ image = Image.open(image_path)
99
+ top_1 = current_datapoint["top1-label"]
100
+ top_1_score = current_datapoint["top1-score"]
101
+
102
+ q_template = (
103
+ "<div style='font-size: 24px;'>Sam guessed the Input image is "
104
+ "<span style='font-weight: bold;'>{}</span> "
105
+ "with <span style='font-weight: bold;'>{}%</span> "
106
+ "confidence. Is this dog a <span style='font-weight: bold;'>{}</span>?"
107
+ "</div>"
108
+ )
109
+
110
+ q_template = (
111
+ "<div style='font-size: 24px;'>Sam guessed the Input image is "
112
+ "<span style='font-weight: bold;'>{}</span> "
113
+ "with <span style='font-weight: bold;'>{}%</span> "
114
+ "confidence.<br>Is this dog a <span style='font-weight: bold;'>{}</span>?"
115
+ "</div>"
116
+ )
117
+
118
+ top_1_score = top_1_score * 100
119
+ top_1_score = round(top_1_score, 2)
120
+
121
+ rounded_up_score = math.ceil(top_1_score)
122
+ rounded_up_score = int(rounded_up_score)
123
+ question = q_template.format(
124
+ top_1.replace("_", " "), str(rounded_up_score), top_1.replace("_", " ")
125
+ )
126
+
127
+ accept_reject = current_datapoint["Accept/Reject"]
128
+
129
+ return image, top_1, rounded_up_score, question, accept_reject
130
+
131
+
132
+ def preprocessing(data, type_of_nns, current_index, history, username, seed):
133
+ print("preprocessing")
134
+ data = generate_data(type_of_nns, seed) # Pass the seed here
135
+ print("data generated")
136
+
137
+ # set random seed to time
138
+ random.seed(int(time.time()))
139
+ # append a random text to the username
140
+ random_text = "".join(
141
+ random.choice(string.ascii_lowercase + string.digits) for _ in range(8)
142
+ )
143
+
144
+ if username == "":
145
+ username = "username"
146
+
147
+ username = f"{username}-{random_text}"
148
+
149
+ current_index = 0
150
+ print("loading sample ....")
151
+ qimage, top_1, top_1_score, question, accept_reject = load_sample(
152
+ data, current_index
153
+ )
154
+
155
+ return (
156
+ qimage,
157
+ top_1,
158
+ top_1_score,
159
+ question,
160
+ accept_reject,
161
+ current_index,
162
+ history,
163
+ data,
164
+ username,
165
+ )
166
+
167
+
168
+ def update_app(decision, data, current_index, history, username):
169
+ global NUMBER_OF_IMAGES
170
+ if current_index == -1:
171
+ gr.Error("Please Enter your username and load samples")
172
+
173
+ fake_plot = string_to_image("Please Enter your username and load samples")
174
+ canvas = agg.FigureCanvasAgg(fake_plot)
175
+ canvas.draw()
176
+ empty_image = Image.frombytes(
177
+ "RGBA", canvas.get_width_height(), canvas.tostring_argb()
178
+ )
179
+
180
+ return (
181
+ empty_image,
182
+ "",
183
+ "",
184
+ "",
185
+ "",
186
+ current_index,
187
+ history,
188
+ data,
189
+ 0,
190
+ gr.update(interactive=False),
191
+ gr.update(interactive=False),
192
+ "",
193
+ )
194
+
195
+ # Done, let's save and upload
196
+ if current_index == NUMBER_OF_IMAGES - 1:
197
+ time_stamp = int(time.time())
198
+
199
+ # Add decision to the history
200
+ current_dicitonary = data[current_index].copy()
201
+ current_dicitonary["user_decision"] = decision
202
+ current_dicitonary["user_id"] = username
203
+ accept_reject_string = "Accept" if decision == "YES" else "Reject"
204
+ current_dicitonary["is_user_correct"] = (
205
+ current_dicitonary["Accept/Reject"] == accept_reject_string
206
+ )
207
+ history.append(current_dicitonary)
208
+
209
+ # convert to percentage
210
+ final_decision_data = {
211
+ "user_id": username,
212
+ "time": time_stamp,
213
+ "history": history,
214
+ }
215
+
216
+ # upload the decision to the server
217
+ temp_filename = f"./responses/results_{username}.json"
218
+ # convert decision_dict to json and save it on the disk
219
+ with open(temp_filename, "w") as f:
220
+ json.dump(final_decision_data, f)
221
+
222
+ fake_plot = string_to_image("Thank you for your time!")
223
+ canvas = agg.FigureCanvasAgg(fake_plot)
224
+ canvas.draw()
225
+ empty_image = Image.frombytes(
226
+ "RGBA", canvas.get_width_height(), canvas.tostring_argb()
227
+ )
228
+
229
+ # TODO, Call the accuracy and show it to the user
230
+ # calcualte the mean of is_user_correct
231
+ all_is_user_correct = [d["is_user_correct"] for d in history]
232
+ accuracy = np.mean(all_is_user_correct) * 100
233
+ accuracy = round(accuracy, 2)
234
+
235
+ return (
236
+ empty_image,
237
+ "",
238
+ "",
239
+ "",
240
+ "",
241
+ current_index,
242
+ history,
243
+ data,
244
+ current_index + 1,
245
+ gr.update(interactive=False),
246
+ gr.update(interactive=False),
247
+ f"User Accuracy: {accuracy}",
248
+ )
249
+
250
+ if current_index >= 0 and current_index < NUMBER_OF_IMAGES - 1:
251
+ current_dicitonary = data[current_index].copy()
252
+ current_dicitonary["user_decision"] = decision
253
+ current_dicitonary["user_id"] = username
254
+ accept_reject_string = True if decision == "YES" else False
255
+ current_dicitonary["is_user_correct"] = (
256
+ current_dicitonary["Accept/Reject"] == accept_reject_string
257
+ )
258
+
259
+ print(f" accept/reject : {current_dicitonary['Accept/Reject'] }")
260
+ print(
261
+ f" accept/reject status: {current_dicitonary['Accept/Reject'] == accept_reject_string}"
262
+ )
263
+
264
+ history.append(current_dicitonary)
265
+
266
+ current_index += 1
267
+ qimage, top_1, top_1_score, question, accept_reject = load_sample(
268
+ data, current_index
269
+ )
270
+
271
+ return (
272
+ qimage,
273
+ top_1,
274
+ top_1_score,
275
+ question,
276
+ accept_reject,
277
+ current_index,
278
+ history,
279
+ data,
280
+ current_index,
281
+ gr.update(interactive=True),
282
+ gr.update(interactive=True),
283
+ "",
284
+ )
285
+
286
+
287
+ def disable_component():
288
+ return gr.update(interactive=False)
289
+
290
+
291
+ def enable_component():
292
+ return gr.update(interactive=True)
293
+
294
+
295
+ def hide_component():
296
+ return gr.update(visible=False)
297
+
298
+
299
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
300
+ data_state = gr.State({})
301
+ current_index = gr.State(-1)
302
+ history = gr.State([])
303
+
304
+ gr.Markdown("# Advising Networks")
305
+ gr.Markdown("## Accept/Reject AI predicted label using Explanations")
306
+
307
+ with gr.Column():
308
+ with gr.Row():
309
+ username_textbox = gr.Textbox(label="Username", value=f"username")
310
+ labeled_images_textbox = gr.Textbox(label="Labeled Images", value="0")
311
+ total_images_textbox = gr.Textbox(
312
+ label="Total Images", value=NUMBER_OF_IMAGES
313
+ )
314
+ type_of_nns_dropdown = gr.Dropdown(
315
+ label="Type of NNs",
316
+ choices=["top1", "topk"],
317
+ value="top1",
318
+ )
319
+ random_seed_textbox = gr.Number(label="Random Seed", value="0")
320
+
321
+ prepare_btn = gr.Button(value="Start The Experiment")
322
+
323
+ with gr.Column():
324
+ with gr.Row():
325
+ question_textbox = gr.HTML("")
326
+ # question_textbox = gr.Markdown("")
327
+
328
+ with gr.Column(elem_id="parent_row"):
329
+ query_image = gr.Image(
330
+ type="pil", label="Query", show_label=False, value="./images/intro.jpg"
331
+ )
332
+
333
+ with gr.Row():
334
+ accept_btn = gr.Button(value="YES", interactive=False)
335
+ reject_btn = gr.Button(value="NO", interactive=False)
336
+
337
+ with gr.Column(elem_id="parent_row"):
338
+ top_1_textbox = gr.Textbox(label="Top 1", value="", visible=False)
339
+ top_1_score_textbox = gr.Textbox(
340
+ label="Top 1 Score", value="", visible=False
341
+ )
342
+ accept_reject_textbox = gr.Textbox(
343
+ label="Accept/Reject", value="", visible=False
344
+ )
345
+
346
+ with gr.Column():
347
+ with gr.Row():
348
+ final_results = gr.HTML("")
349
+
350
+ # data, type_of_nns, current_index, history
351
+ prepare_btn.click(
352
+ preprocessing,
353
+ inputs=[
354
+ data_state,
355
+ type_of_nns_dropdown,
356
+ current_index,
357
+ history,
358
+ username_textbox,
359
+ random_seed_textbox,
360
+ ],
361
+ outputs=[
362
+ query_image,
363
+ top_1_textbox,
364
+ top_1_score_textbox,
365
+ question_textbox,
366
+ accept_reject_textbox,
367
+ current_index,
368
+ history,
369
+ data_state,
370
+ username_textbox,
371
+ ],
372
+ ).then(fn=disable_component, outputs=[prepare_btn]).then(
373
+ fn=disable_component, outputs=[type_of_nns_dropdown]
374
+ ).then(
375
+ fn=disable_component, outputs=[username_textbox]
376
+ ).then(
377
+ fn=disable_component, outputs=[prepare_btn]
378
+ ).then(
379
+ fn=enable_component, outputs=[accept_btn]
380
+ ).then(
381
+ fn=enable_component, outputs=[reject_btn]
382
+ ).then(
383
+ fn=hide_component, outputs=[prepare_btn]
384
+ )
385
+
386
+ accept_btn.click(
387
+ update_app,
388
+ inputs=[accept_btn, data_state, current_index, history, username_textbox],
389
+ outputs=[
390
+ query_image,
391
+ top_1_textbox,
392
+ top_1_score_textbox,
393
+ question_textbox,
394
+ accept_reject_textbox,
395
+ current_index,
396
+ history,
397
+ data_state,
398
+ labeled_images_textbox,
399
+ accept_btn,
400
+ reject_btn,
401
+ final_results,
402
+ ],
403
+ )
404
+
405
+ reject_btn.click(
406
+ update_app,
407
+ inputs=[reject_btn, data_state, current_index, history, username_textbox],
408
+ outputs=[
409
+ query_image,
410
+ top_1_textbox,
411
+ top_1_score_textbox,
412
+ question_textbox,
413
+ accept_reject_textbox,
414
+ current_index,
415
+ history,
416
+ data_state,
417
+ labeled_images_textbox,
418
+ accept_btn,
419
+ reject_btn,
420
+ final_results,
421
+ ],
422
+ )
423
+
424
+
425
+ demo.launch(debug=False, server_name="0.0.0.0")
426
+ # demo.launch(debug=False)
dogs/top1/n02085936-Maltese_dog_67_3.jpeg ADDED
dogs/top1/n02086079-Pekinese_68_2.jpeg ADDED
dogs/top1/n02086240-Shih-Tzu_332_1.jpeg ADDED
dogs/top1/n02086240-Shih-Tzu_74_3.jpeg ADDED
dogs/top1/n02086646-Blenheim_spaniel_53_1.jpeg ADDED
dogs/top1/n02086910-papillon_337_2.jpeg ADDED
dogs/top1/n02086910-papillon_56_0.jpeg ADDED
dogs/top1/n02087394-Rhodesian_ridgeback_431_2.jpeg ADDED
dogs/top1/n02088094-Afghan_hound_42_2.jpeg ADDED
dogs/top1/n02088364-beagle_170_0.jpeg ADDED
dogs/top1/n02088364-beagle_215_2.jpeg ADDED
dogs/top1/n02088364-beagle_226_1.jpeg ADDED
dogs/top1/n02088632-bluetick_253_1.jpeg ADDED
dogs/top1/n02089078-black-and-tan_coonhound_285_2.jpeg ADDED
dogs/top1/n02089078-black-and-tan_coonhound_55_3.jpeg ADDED
dogs/top1/n02089867-Walker_hound_0_1.jpeg ADDED
dogs/top1/n02089867-Walker_hound_429_1.jpeg ADDED
dogs/top1/n02090379-redbone_42_3.jpeg ADDED
dogs/top1/n02091032-Italian_greyhound_225_1.jpeg ADDED
dogs/top1/n02091032-Italian_greyhound_24_3.jpeg ADDED
dogs/top1/n02091032-Italian_greyhound_2_0.jpeg ADDED
dogs/top1/n02091134-whippet_17_1.jpeg ADDED
dogs/top1/n02091134-whippet_264_3.jpeg ADDED
dogs/top1/n02091134-whippet_64_1.jpeg ADDED
dogs/top1/n02093256-Staffordshire_bullterrier_15_0.jpeg ADDED
dogs/top1/n02093256-Staffordshire_bullterrier_340_0.jpeg ADDED
dogs/top1/n02093428-American_Staffordshire_terrier_438_3.jpeg ADDED
dogs/top1/n02093859-Kerry_blue_terrier_33_3.jpeg ADDED
dogs/top1/n02094114-Norfolk_terrier_19_3.jpeg ADDED
dogs/top1/n02094258-Norwich_terrier_109_0.jpeg ADDED
dogs/top1/n02094258-Norwich_terrier_147_3.jpeg ADDED
dogs/top1/n02094258-Norwich_terrier_327_2.jpeg ADDED
dogs/top1/n02094433-Yorkshire_terrier_33_0.jpeg ADDED
dogs/top1/n02095314-wire-haired_fox_terrier_56_2.jpeg ADDED
dogs/top1/n02095570-Lakeland_terrier_74_2.jpeg ADDED
dogs/top1/n02095889-Sealyham_terrier_276_1.jpeg ADDED
dogs/top1/n02096051-Airedale_22_3.jpeg ADDED
dogs/top1/n02096177-cairn_244_3.jpeg ADDED
dogs/top1/n02096177-cairn_70_2.jpeg ADDED
dogs/top1/n02096177-cairn_84_0.jpeg ADDED
dogs/top1/n02096294-Australian_terrier_292_1.jpeg ADDED
dogs/top1/n02096294-Australian_terrier_413_2.jpeg ADDED
dogs/top1/n02096585-Boston_bull_1_0.jpeg ADDED
dogs/top1/n02096585-Boston_bull_24_1.jpeg ADDED
dogs/top1/n02097047-miniature_schnauzer_83_1.jpeg ADDED
dogs/top1/n02097474-Tibetan_terrier_135_3.jpeg ADDED
dogs/top1/n02097474-Tibetan_terrier_36_0.jpeg ADDED