Spaces:
Runtime error
Runtime error
Brian Sigafoos
commited on
Commit
•
be10678
1
Parent(s):
d3fee11
More clean up
Browse files- model.ipynb +40 -537
model.ipynb
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
-
"execution_count":
|
6 |
"metadata": {},
|
7 |
"outputs": [],
|
8 |
"source": [
|
@@ -14,7 +14,7 @@
|
|
14 |
},
|
15 |
{
|
16 |
"cell_type": "code",
|
17 |
-
"execution_count":
|
18 |
"metadata": {},
|
19 |
"outputs": [],
|
20 |
"source": [
|
@@ -24,20 +24,9 @@
|
|
24 |
},
|
25 |
{
|
26 |
"cell_type": "code",
|
27 |
-
"execution_count":
|
28 |
"metadata": {},
|
29 |
-
"outputs": [
|
30 |
-
{
|
31 |
-
"data": {
|
32 |
-
"text/plain": [
|
33 |
-
"10"
|
34 |
-
]
|
35 |
-
},
|
36 |
-
"execution_count": 4,
|
37 |
-
"metadata": {},
|
38 |
-
"output_type": "execute_result"
|
39 |
-
}
|
40 |
-
],
|
41 |
"source": [
|
42 |
"ims = search_images_ddg('gingko biloba tree leaf', max_images=10)\n",
|
43 |
"len(ims)"
|
@@ -45,64 +34,9 @@
|
|
45 |
},
|
46 |
{
|
47 |
"cell_type": "code",
|
48 |
-
"execution_count":
|
49 |
"metadata": {},
|
50 |
-
"outputs": [
|
51 |
-
{
|
52 |
-
"data": {
|
53 |
-
"text/html": [
|
54 |
-
"\n",
|
55 |
-
"<style>\n",
|
56 |
-
" /* Turns off some styling */\n",
|
57 |
-
" progress {\n",
|
58 |
-
" /* gets rid of default border in Firefox and Opera. */\n",
|
59 |
-
" border: none;\n",
|
60 |
-
" /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
|
61 |
-
" background-size: auto;\n",
|
62 |
-
" }\n",
|
63 |
-
" progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
|
64 |
-
" background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
|
65 |
-
" }\n",
|
66 |
-
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
|
67 |
-
" background: #F44336;\n",
|
68 |
-
" }\n",
|
69 |
-
"</style>\n"
|
70 |
-
],
|
71 |
-
"text/plain": [
|
72 |
-
"<IPython.core.display.HTML object>"
|
73 |
-
]
|
74 |
-
},
|
75 |
-
"metadata": {},
|
76 |
-
"output_type": "display_data"
|
77 |
-
},
|
78 |
-
{
|
79 |
-
"data": {
|
80 |
-
"text/html": [
|
81 |
-
"\n",
|
82 |
-
" <div>\n",
|
83 |
-
" <progress value='65536' class='' max='62078' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
|
84 |
-
" 105.57% [65536/62078 00:00<00:00]\n",
|
85 |
-
" </div>\n",
|
86 |
-
" "
|
87 |
-
],
|
88 |
-
"text/plain": [
|
89 |
-
"<IPython.core.display.HTML object>"
|
90 |
-
]
|
91 |
-
},
|
92 |
-
"metadata": {},
|
93 |
-
"output_type": "display_data"
|
94 |
-
},
|
95 |
-
{
|
96 |
-
"data": {
|
97 |
-
"text/plain": [
|
98 |
-
"Path('images/tree.jpg')"
|
99 |
-
]
|
100 |
-
},
|
101 |
-
"execution_count": 5,
|
102 |
-
"metadata": {},
|
103 |
-
"output_type": "execute_result"
|
104 |
-
}
|
105 |
-
],
|
106 |
"source": [
|
107 |
"dest = 'images/tree.jpg'\n",
|
108 |
"download_url(ims[0], dest)"
|
@@ -120,7 +54,7 @@
|
|
120 |
},
|
121 |
{
|
122 |
"cell_type": "code",
|
123 |
-
"execution_count":
|
124 |
"metadata": {},
|
125 |
"outputs": [],
|
126 |
"source": [
|
@@ -130,7 +64,7 @@
|
|
130 |
},
|
131 |
{
|
132 |
"cell_type": "code",
|
133 |
-
"execution_count":
|
134 |
"metadata": {},
|
135 |
"outputs": [],
|
136 |
"source": [
|
@@ -155,20 +89,9 @@
|
|
155 |
},
|
156 |
{
|
157 |
"cell_type": "code",
|
158 |
-
"execution_count":
|
159 |
"metadata": {},
|
160 |
-
"outputs": [
|
161 |
-
{
|
162 |
-
"data": {
|
163 |
-
"text/plain": [
|
164 |
-
"(#0) []"
|
165 |
-
]
|
166 |
-
},
|
167 |
-
"execution_count": 10,
|
168 |
-
"metadata": {},
|
169 |
-
"output_type": "execute_result"
|
170 |
-
}
|
171 |
-
],
|
172 |
"source": [
|
173 |
"failed = verify_images(fns)\n",
|
174 |
"failed"
|
@@ -176,7 +99,7 @@
|
|
176 |
},
|
177 |
{
|
178 |
"cell_type": "code",
|
179 |
-
"execution_count":
|
180 |
"metadata": {},
|
181 |
"outputs": [],
|
182 |
"source": [
|
@@ -192,22 +115,20 @@
|
|
192 |
},
|
193 |
{
|
194 |
"cell_type": "code",
|
195 |
-
"execution_count":
|
196 |
"metadata": {},
|
197 |
"outputs": [],
|
198 |
"source": [
|
199 |
-
"trees = DataBlock(
|
200 |
-
"
|
201 |
-
"
|
202 |
-
"
|
203 |
-
"
|
204 |
-
" item_tfms=Resize(128)\n",
|
205 |
-
")"
|
206 |
]
|
207 |
},
|
208 |
{
|
209 |
"cell_type": "code",
|
210 |
-
"execution_count":
|
211 |
"metadata": {},
|
212 |
"outputs": [],
|
213 |
"source": [
|
@@ -238,7 +159,7 @@
|
|
238 |
"source": [
|
239 |
"trees = trees.new(item_tfms=Resize(128), batch_tfms=aug_transforms(mult=2))\n",
|
240 |
"dls = trees.dataloaders(path)\n",
|
241 |
-
"dls.train.show_batch(max_n=8, nrows=2, unique=True)"
|
242 |
]
|
243 |
},
|
244 |
{
|
@@ -250,280 +171,30 @@
|
|
250 |
},
|
251 |
{
|
252 |
"cell_type": "code",
|
253 |
-
"execution_count":
|
254 |
"metadata": {},
|
255 |
"outputs": [],
|
256 |
"source": [
|
257 |
-
"trees = trees.new(
|
258 |
-
"
|
259 |
-
"
|
260 |
-
")\n",
|
261 |
-
"dls = trees.dataloaders(path)"
|
262 |
]
|
263 |
},
|
264 |
{
|
265 |
"cell_type": "code",
|
266 |
-
"execution_count":
|
267 |
"metadata": {},
|
268 |
-
"outputs": [
|
269 |
-
{
|
270 |
-
"name": "stderr",
|
271 |
-
"output_type": "stream",
|
272 |
-
"text": [
|
273 |
-
"/Users/briansigafoos/.pyenv/versions/3.9.15/lib/python3.9/site-packages/torchvision/models/_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n",
|
274 |
-
" warnings.warn(\n",
|
275 |
-
"/Users/briansigafoos/.pyenv/versions/3.9.15/lib/python3.9/site-packages/torchvision/models/_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=ResNet18_Weights.IMAGENET1K_V1`. You can also use `weights=ResNet18_Weights.DEFAULT` to get the most up-to-date weights.\n",
|
276 |
-
" warnings.warn(msg)\n"
|
277 |
-
]
|
278 |
-
},
|
279 |
-
{
|
280 |
-
"data": {
|
281 |
-
"text/html": [
|
282 |
-
"\n",
|
283 |
-
"<style>\n",
|
284 |
-
" /* Turns off some styling */\n",
|
285 |
-
" progress {\n",
|
286 |
-
" /* gets rid of default border in Firefox and Opera. */\n",
|
287 |
-
" border: none;\n",
|
288 |
-
" /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
|
289 |
-
" background-size: auto;\n",
|
290 |
-
" }\n",
|
291 |
-
" progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
|
292 |
-
" background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
|
293 |
-
" }\n",
|
294 |
-
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
|
295 |
-
" background: #F44336;\n",
|
296 |
-
" }\n",
|
297 |
-
"</style>\n"
|
298 |
-
],
|
299 |
-
"text/plain": [
|
300 |
-
"<IPython.core.display.HTML object>"
|
301 |
-
]
|
302 |
-
},
|
303 |
-
"metadata": {},
|
304 |
-
"output_type": "display_data"
|
305 |
-
},
|
306 |
-
{
|
307 |
-
"data": {
|
308 |
-
"text/html": [
|
309 |
-
"<table border=\"1\" class=\"dataframe\">\n",
|
310 |
-
" <thead>\n",
|
311 |
-
" <tr style=\"text-align: left;\">\n",
|
312 |
-
" <th>epoch</th>\n",
|
313 |
-
" <th>train_loss</th>\n",
|
314 |
-
" <th>valid_loss</th>\n",
|
315 |
-
" <th>error_rate</th>\n",
|
316 |
-
" <th>time</th>\n",
|
317 |
-
" </tr>\n",
|
318 |
-
" </thead>\n",
|
319 |
-
" <tbody>\n",
|
320 |
-
" <tr>\n",
|
321 |
-
" <td>0</td>\n",
|
322 |
-
" <td>2.664093</td>\n",
|
323 |
-
" <td>1.748974</td>\n",
|
324 |
-
" <td>0.630952</td>\n",
|
325 |
-
" <td>00:27</td>\n",
|
326 |
-
" </tr>\n",
|
327 |
-
" </tbody>\n",
|
328 |
-
"</table>"
|
329 |
-
],
|
330 |
-
"text/plain": [
|
331 |
-
"<IPython.core.display.HTML object>"
|
332 |
-
]
|
333 |
-
},
|
334 |
-
"metadata": {},
|
335 |
-
"output_type": "display_data"
|
336 |
-
},
|
337 |
-
{
|
338 |
-
"name": "stderr",
|
339 |
-
"output_type": "stream",
|
340 |
-
"text": [
|
341 |
-
"/Users/briansigafoos/.pyenv/versions/3.9.15/lib/python3.9/site-packages/PIL/Image.py:979: UserWarning: Palette images with Transparency expressed in bytes should be converted to RGBA images\n",
|
342 |
-
" warnings.warn(\n"
|
343 |
-
]
|
344 |
-
},
|
345 |
-
{
|
346 |
-
"data": {
|
347 |
-
"text/html": [
|
348 |
-
"\n",
|
349 |
-
"<style>\n",
|
350 |
-
" /* Turns off some styling */\n",
|
351 |
-
" progress {\n",
|
352 |
-
" /* gets rid of default border in Firefox and Opera. */\n",
|
353 |
-
" border: none;\n",
|
354 |
-
" /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
|
355 |
-
" background-size: auto;\n",
|
356 |
-
" }\n",
|
357 |
-
" progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
|
358 |
-
" background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
|
359 |
-
" }\n",
|
360 |
-
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
|
361 |
-
" background: #F44336;\n",
|
362 |
-
" }\n",
|
363 |
-
"</style>\n"
|
364 |
-
],
|
365 |
-
"text/plain": [
|
366 |
-
"<IPython.core.display.HTML object>"
|
367 |
-
]
|
368 |
-
},
|
369 |
-
"metadata": {},
|
370 |
-
"output_type": "display_data"
|
371 |
-
},
|
372 |
-
{
|
373 |
-
"data": {
|
374 |
-
"text/html": [
|
375 |
-
"<table border=\"1\" class=\"dataframe\">\n",
|
376 |
-
" <thead>\n",
|
377 |
-
" <tr style=\"text-align: left;\">\n",
|
378 |
-
" <th>epoch</th>\n",
|
379 |
-
" <th>train_loss</th>\n",
|
380 |
-
" <th>valid_loss</th>\n",
|
381 |
-
" <th>error_rate</th>\n",
|
382 |
-
" <th>time</th>\n",
|
383 |
-
" </tr>\n",
|
384 |
-
" </thead>\n",
|
385 |
-
" <tbody>\n",
|
386 |
-
" <tr>\n",
|
387 |
-
" <td>0</td>\n",
|
388 |
-
" <td>1.634005</td>\n",
|
389 |
-
" <td>1.019112</td>\n",
|
390 |
-
" <td>0.404762</td>\n",
|
391 |
-
" <td>00:30</td>\n",
|
392 |
-
" </tr>\n",
|
393 |
-
" <tr>\n",
|
394 |
-
" <td>1</td>\n",
|
395 |
-
" <td>1.273253</td>\n",
|
396 |
-
" <td>0.574415</td>\n",
|
397 |
-
" <td>0.178571</td>\n",
|
398 |
-
" <td>00:31</td>\n",
|
399 |
-
" </tr>\n",
|
400 |
-
" <tr>\n",
|
401 |
-
" <td>2</td>\n",
|
402 |
-
" <td>0.994689</td>\n",
|
403 |
-
" <td>0.358244</td>\n",
|
404 |
-
" <td>0.130952</td>\n",
|
405 |
-
" <td>00:31</td>\n",
|
406 |
-
" </tr>\n",
|
407 |
-
" <tr>\n",
|
408 |
-
" <td>3</td>\n",
|
409 |
-
" <td>0.821999</td>\n",
|
410 |
-
" <td>0.284416</td>\n",
|
411 |
-
" <td>0.119048</td>\n",
|
412 |
-
" <td>00:30</td>\n",
|
413 |
-
" </tr>\n",
|
414 |
-
" <tr>\n",
|
415 |
-
" <td>4</td>\n",
|
416 |
-
" <td>0.692663</td>\n",
|
417 |
-
" <td>0.258062</td>\n",
|
418 |
-
" <td>0.107143</td>\n",
|
419 |
-
" <td>00:30</td>\n",
|
420 |
-
" </tr>\n",
|
421 |
-
" </tbody>\n",
|
422 |
-
"</table>"
|
423 |
-
],
|
424 |
-
"text/plain": [
|
425 |
-
"<IPython.core.display.HTML object>"
|
426 |
-
]
|
427 |
-
},
|
428 |
-
"metadata": {},
|
429 |
-
"output_type": "display_data"
|
430 |
-
}
|
431 |
-
],
|
432 |
"source": [
|
433 |
"learn = vision_learner(dls, resnet18, metrics=error_rate)\n",
|
434 |
-
"learn.fine_tune(5)"
|
435 |
]
|
436 |
},
|
437 |
{
|
438 |
"cell_type": "code",
|
439 |
-
"execution_count":
|
440 |
"metadata": {},
|
441 |
-
"outputs": [
|
442 |
-
{
|
443 |
-
"data": {
|
444 |
-
"text/html": [
|
445 |
-
"\n",
|
446 |
-
"<style>\n",
|
447 |
-
" /* Turns off some styling */\n",
|
448 |
-
" progress {\n",
|
449 |
-
" /* gets rid of default border in Firefox and Opera. */\n",
|
450 |
-
" border: none;\n",
|
451 |
-
" /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
|
452 |
-
" background-size: auto;\n",
|
453 |
-
" }\n",
|
454 |
-
" progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
|
455 |
-
" background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
|
456 |
-
" }\n",
|
457 |
-
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
|
458 |
-
" background: #F44336;\n",
|
459 |
-
" }\n",
|
460 |
-
"</style>\n"
|
461 |
-
],
|
462 |
-
"text/plain": [
|
463 |
-
"<IPython.core.display.HTML object>"
|
464 |
-
]
|
465 |
-
},
|
466 |
-
"metadata": {},
|
467 |
-
"output_type": "display_data"
|
468 |
-
},
|
469 |
-
{
|
470 |
-
"data": {
|
471 |
-
"text/html": [],
|
472 |
-
"text/plain": [
|
473 |
-
"<IPython.core.display.HTML object>"
|
474 |
-
]
|
475 |
-
},
|
476 |
-
"metadata": {},
|
477 |
-
"output_type": "display_data"
|
478 |
-
},
|
479 |
-
{
|
480 |
-
"data": {
|
481 |
-
"text/html": [
|
482 |
-
"\n",
|
483 |
-
"<style>\n",
|
484 |
-
" /* Turns off some styling */\n",
|
485 |
-
" progress {\n",
|
486 |
-
" /* gets rid of default border in Firefox and Opera. */\n",
|
487 |
-
" border: none;\n",
|
488 |
-
" /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
|
489 |
-
" background-size: auto;\n",
|
490 |
-
" }\n",
|
491 |
-
" progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
|
492 |
-
" background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
|
493 |
-
" }\n",
|
494 |
-
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
|
495 |
-
" background: #F44336;\n",
|
496 |
-
" }\n",
|
497 |
-
"</style>\n"
|
498 |
-
],
|
499 |
-
"text/plain": [
|
500 |
-
"<IPython.core.display.HTML object>"
|
501 |
-
]
|
502 |
-
},
|
503 |
-
"metadata": {},
|
504 |
-
"output_type": "display_data"
|
505 |
-
},
|
506 |
-
{
|
507 |
-
"data": {
|
508 |
-
"text/html": [],
|
509 |
-
"text/plain": [
|
510 |
-
"<IPython.core.display.HTML object>"
|
511 |
-
]
|
512 |
-
},
|
513 |
-
"metadata": {},
|
514 |
-
"output_type": "display_data"
|
515 |
-
},
|
516 |
-
{
|
517 |
-
"data": {
|
518 |
-
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAdAAAAHnCAYAAAAIIgwVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB1CklEQVR4nO3dd1gU59oG8HvpvYOAoiDEiiUWsAD22A32GrGLxhZjCVY0RmJMjNHEbmwxNmyxRiwo2I2KXcFCLCBYAAt95/uDjz1uFhRG2GGX+3dde53sO7Mz98t49tmZeWdGJgiCACIiIioUHakDEBERaSIWUCIiIhFYQImIiERgASUiIhKBBZSIiEgEFlAiIiIRWECJiIhEYAElIiISgQWUiIhIBBZQIlKyaNEiVKtWDcbGxpDJZFi4cGGxr9PV1RWurq7Fvp7SpGnTppDJZFLH0GosoEQSuXXrFkaPHg1PT09YWlrCwMAAzs7OaN++PVavXo309HS1Z9q8eTPGjh0LIyMjjBs3DjNnzkSDBg3UnoMAmUyGpk2bSh2D3kNP6gBEpdHs2bMxa9YsyOVyNGzYEAEBATAzM8PTp08RHh6OIUOGYOnSpbhw4YJac+3du1fxv87Ozmpb75EjR9S2rtJi/fr1ePv2rdQxtBoLKJGazZ07FzNnzoSLiwu2bdsGb29vlXn27t2Ln376Se3Znjx5AgBqLZ4A4O7urtb1lQbly5eXOoLW4yFcIjV68OABgoODoa+vj/379+dZPAGgQ4cOOHjwoEr71q1b4efnB0tLSxgbG6NGjRoICQnJ83Bv7nnFN2/eYOLEiShfvjwMDQ3h4eGBefPm4d0HMQUHB0Mmk+HYsWMAcg4f5r5yc8tkMgwYMCDPvHmdbxMEAevWrUOjRo1gb28PIyMjuLi4oHXr1tiyZUueWf8rPT0d33//PWrUqAETExNYWFjA19cXW7duVZn33YwPHjxAr169YGdnByMjI9SrV0+xd11QuYdQnz59ikGDBqFMmTIwNTVFo0aNEBERAQCKv22FChVgaGiI6tWrY9u2bSrLSk5Oxvz589G8eXOUK1cOBgYGsLe3R6dOnXD69GmledeuXav4Wx4/flxpWwQHB6v09c6dO+jZsyccHBygo6OD8PBwAKrbJCMjA/Xr14dMJsNff/2lkrF///6QyWT49ttvC/V3Ks24B0qkRmvWrEFmZiZ69eoFT0/P985raGio9H7KlCkICQmBnZ0d+vTpAzMzMxw4cABTpkzB33//jUOHDsHAwEDpM5mZmWjdujWePHmCtm3bQk9PD7t27cI333yDtLQ0zJw5EwAU59rWrl2L2NhYRfvHmDp1KkJCQuDm5oYePXrA0tIScXFxOH/+PLZt24aePXu+9/MZGRlo3bo1jh8/jipVquDLL7/E27dvERoaip49e+Ly5cuYO3euyudiY2Ph5eWFihUr4osvvsCLFy+wZcsWfP755zh8+DCaNWtW4D4kJSWhcePGMDc3R+/evfHixQts3rwZrVu3xunTpzF8+HC8ePECHTp0QGZmJjZt2oSePXvCxcVF6dzxzZs3MXXqVPj5+aF9+/awtrbGv//+i7/++gsHDhzAnj170KZNGwBA7dq1MXPmTMyaNQsVKlRQ+tHy33Oid+/ehbe3NypVqoS+ffsiNTUVFhYWefbFwMAAW7ZswaeffoqBAwfi8uXLcHFxAZDz73LDhg1o0aIFpk6dWuC/T6knEJHaNG/eXAAgrFy5slCfO3XqlABAcHFxEeLi4hTtmZmZQocOHQQAwnfffaf0mQoVKggAhLZt2wpv375VtD99+lSwtLQULC0thYyMDKXPNGnSRMjra+H+/fsCACEgICDPfHl9zsbGRihbtqzw5s0blfkTExNVslaoUEGpbe7cuYr8mZmZSvlz+3by5EmVjACE4OBgpWUdPHhQsayCyl3W8OHDhezsbEX7+vXrBQCCtbW10KFDByE1NVUx7cSJEwIAwd/fX2lZSUlJKn0WBEF4+PCh4OTkJFSpUiXP9Tdp0iTPbO/2NSgoKM958tuWW7ZsEQAIPj4+QlZWlnDjxg3BxMREcHBwUPq3RR/GAkqkRlWrVhUACAcOHCjU54YMGSIAEJYvX64y7fbt24KOjo7g5uam1J5bZKKjo1U+079/fwGAcPXqVaX2oi6grq6uQlpa2oe6l2cB9fDwEGQymXDz5k2V+VetWiUAEAYOHKiSsUKFCkJWVpbKZ8qXLy/Y2tp+MEsuAIKJiYmQkpKi1J6VlSXo6ekJAIS7d++qfM7V1VVwdXUt8HpGjx4tABBiY2NV1v+hAlqmTJl8/775bUtBEIThw4cLAISvv/5a8PT0FGQymfD3338XODPl4DlQIg1w8eJFAEDz5s1VplWqVAnlypXD/fv3kZycrDTN0tISHh4eKp/JPXT38uXLYkibo2/fvnjw4AGqVauGoKAgHDx4UCVffl69eoWYmBg4OzujSpUqKtNz/w6XLl1SmVa7dm3o6uqqtLu4uBS6v5UqVYK5ublSm66uLsqUKQMrKytUrFhR5TNly5bFo0ePVNpPnjyJHj16wMXFBYaGhorzmosXLwYAPH78uFDZAKBWrVoqh/oLYuHChahRowZ++uknXLt2Dd988w0+++yzQi+ntGMBJVIjJycnAIX/sswtPLmfz2+5SUlJSu1WVlZ5zq+nlzP8ITs7u1A5CuPnn3/Gzz//DDMzM3z//fdo27Yt7Ozs8PnnnyMmJua9nxXbX+D9fZbL5QXvAHJ+gOS3rPdNy8rKUmrbuXMn/Pz8sG/fPtStWxejRo3C9OnTMXPmTDRp0gQARF336+joWOjPAICRkRHat2+vyPvll1+KWk5pxwJKpEY+Pj4ACn/dY+6XdXx8fJ7T4+LilOYrajo6OV8V/y0MufIqZLq6uhg3bhyioqLw9OlTbN++HZ07d8Zff/2FNm3avLdgSN3fojZ9+nQYGBjgwoUL2LVrF3766SfMnj0bwcHBqFy5sujlir3TUGRkJObPnw87OztkZWVh0KBBSqOyqWBYQInUaODAgdDX18f27dtx48aN9877boH59NNPAUBxicK7YmJi8OjRI7i5ueW79/WxrK2tAQAPHz5UmZaSkoI7d+689/MODg7o0qULtm7diubNm+Pu3bu4du1avvObm5vD3d0djx8/RnR0tMr03Mtt6tSpU5huSCYmJgbVqlVD1apVldrlcjkiIyPz/IyOjk6xHCF4/vw5evfuDX19fRw9ehR9+/bFoUOHMG/evCJfl7ZjASVSI1dXVwQHByMjIwPt27fP905DBw8eRNu2bRXvBw0aBACYM2cOEhMTFe3Z2dmYMGEC5HI5Bg8eXGy5zc3NUaVKFZw8eVKp8GdnZ2P8+PFITU1Vmj89PR0nT55UWU5mZiZevHgBADAxMXnvOnP3iiZOnKhUSJ49e6a4VjH371LSubq6Ijo6WnGjCiDnOtng4OB8f0jZ2trm+YPlYw0cOBCPHj3Czz//jBo1amDp0qXw8PDA9OnTcerUqSJfnzbjdaBEajZlyhRkZWVh1qxZqF+/Pho1aoR69eopbuV34sQJREdHo169eorPNGrUCJMmTcIPP/wAT09PdOvWDaampjhw4ACuXbsGHx8fTJw4sVhzT5w4EYMHD0bjxo3RvXt3GBkZ4dixY8jMzEStWrUQFRWlmDc1NRU+Pj7w8PBA3bp1UaFCBaSlpSEsLAw3b95Ep06dVPbG/mvChAk4cOAAdu/ejVq1aqFdu3Z4+/Yttm3bhoSEBEyaNElxSLyk++qrrxAYGIhPP/0UXbt2hb6+vuLHSMeOHbFnzx6Vz7Ro0QKbN29Gx44dUadOHejr68PPzw9+fn6icyxcuBB79uxB165dERgYCCDnx9GWLVvQsGFD9O7dG5cvX1YccaAPkHgUMFGpdePGDWHUqFFC9erVBXNzc0FfX19wdHQU2rRpI6xatSrPyxM2bdokNG7cWDAzMxMMDQ2FatWqCXPmzFG6FjFXXpeG5Jo5c6YAQDh27JhS+/sufRCEnMtHqlWrJhgYGAhlypQRhg0bJjx79kzlcxkZGcK8efOENm3aCC4uLoKhoaFgZ2cneHt7C0uXLhXS09MLlDU1NVX47rvvhOrVqwtGRkaCmZmZ0LhxY+HPP/9UmVfMpTbvg/dcRvK+v21+61mzZo1Qq1YtwcTERLC1tRX8/f2FK1eu5Lstnj59KvTu3VtwcHAQdHR0BADCzJkzBUH4cF/zynHhwgXBwMBAqFChgvDy5UuV+X/55RcBgPD555/nu0xSJhMEnjkmIiIqLJ4DJSIiEoEFlIiISAQWUCIiIhFYQImIiERgASUiIhKBBZSIiEgE3kiB1EIul+PJkycwNzcXff9OIqLiJggCXr16BWdnZ8U9oPPDAkpq8eTJE8UjtIiISrqHDx+iXLly752HBZTUIveZip1/+Rv6xqYSp1GPHzpWkzoCUZExNlB9xqo2epWSAg83F5XnwOaFBZTUIvewrb6xKQyMzSROox4WFhZSRyAqMqWlgOYqyKkmDiIiIiISgQWUiIhIBBZQIiIiEVhAiYiIRGABJSIiEoEFlIiISAQWUCIiIhFYQImIiERgASUiIhKBBZSIiEgEFlAiIiIRWECJiIhEYAElIiISgQWUiIhIBBZQIiIiEVhAiYiIRGABJSIiEoEFlIiISAQWUCIiIhFYQEmjGerpoEvNMpjY3A1Lu1fHhn614FvRWmkeGQDfitb4qqkrFnauilW9PBHSoRI+93SAvo5MmuBF6PXr1wiZE4xun7dDxXL2sDHVw58b1kkdq9iwv9rd3/T0dEwNmgy38s6wNjeGbyNvHDkcJnWsPLGA0nsNGDAAZmZmUsfIl7mhLjrXdISzhRH+fZmW5zwGejoY1qg8zA31cDT6Of648AR3n6WiS01HTGheUc2Ji96L588wP2QO7ty+Bc8aNaWOU+zYX+02dPAALFq4AL1698WPC36Brq4u/Du2w8nISKmjqdCTOgDRx0hKzcKo0OtITsuCm40xZrerpDJPllzA7IPRiH72VtEWHvMCz95koGstR1R3NMP1+NfqjF2kyjg64ebdRyjj6IhLFy+ghW8DqSMVK/ZXe/t7/tw5bNuyGXPnzcdX4ycAAPp+0R91a3tiatAkhEeckjihMu6BkkbLkgtITst67zzZckGpeOa68DAZAOBsaVQs2dTF0NAQZRwdpY6hNuyv9tq5IxS6uroYPGSYos3IyAgDBg7G2TOn8fDhQwnTqWIBpVLLyijnAMyr9PcXYCJSj6jLl/BJpUqwsLBQaq9X3wsAcCXqsgSp8scCqoViY2MxcuRIVK5cGcbGxrC1tUX37t3x4MEDpfkyMzMxa9YsfPLJJzAyMoKtrS18fHwQFqZ6wv7x48fw9/eHmZkZ7O3tMWHCBGRnZ6upR8WjfXUHvM3IxpXHKVJHISIA8fFxcHR0UmnPbYt78kTdkd6L50C10Pnz53Hq1Cn06tUL5cqVw4MHD7B06VI0bdoUN27cgImJCQAgODgYISEhGDJkCLy8vJCSkoILFy7g4sWLaNWqlWJ52dnZaN26Nby9vfHjjz/i8OHD+Omnn+Du7o4RI0ZI1c2P0rG6AzydzLH27CO8zZRLHYeIAKSmpsLQ0FCl3cjISDG9JGEB1ULt27dHt27dlNo6duyIhg0bYvv27fjiiy8AAPv27UO7du2wYsWK9y4vLS0NPXv2xPTp0wEAgYGBqFOnDlavXp1vAU1PT0d6errifUpKydnL865ghW61HREe8xxHop9LHYeI/p+xsbHS90autLQ0xfSShIdwtdC7/8gyMzPx/PlzeHh4wMrKChcvXlRMs7KywvXr1xEdHf3BZQYGBiq99/X1xb179/KdPyQkBJaWloqXi4uLiJ4UPU9HMwxv5IKoxylYc/aR1HGI6B2Ojk6Ij49Tac9tc3J2Vnek92IB1UKpqamYMWMGXFxcYGhoCDs7O9jb2yMpKQnJycmK+WbPno2kpCRUqlQJNWrUwMSJE3HlyhWV5RkZGcHe3l6pzdraGi9fvsw3Q1BQEJKTkxWvkjB6zt3WBGObuOL+81QsjoiFXJA6ERG9q2at2oi+c0fliNX5c2cV00sSFlAtNHr0aHz33Xfo0aMHtm7dikOHDiEsLAy2traQy/93vs/Pzw93797F77//Dk9PT6xatQp16tTBqlWrlJanq6tb6AyGhoawsLBQeknJ2cIQXzdzw7M3Gfgp/D4ys1k9iUqazl26ITs7G6tX/e+0Unp6OtavW4P6Xt4l5khWLp4D1UKhoaEICAjATz/9pGhLS0tDUlKSyrw2NjYYOHAgBg4ciNevX8PPzw/BwcEYMmSIGhN/nJaVbGFqoAsrY30AwKflLGBjkvPfh24/gyAAE1tUhKmBLvbdSEDtsuZKn094lYGYPK4T1SQrl/2G5OQkxMflHOo6eGAvnjzJOUQ9LHAULCwtpYxX5Nhf7eyvl7c3unTrjhlTg5CYkAB3dw/8sWEdYh88wLIVq6WOp4IFVAvp6upCEJT3sBYvXqxy2cnz589ha2ureG9mZgYPD48Scbi1MNpVc4C9mYHiff3yVqhf3goAcPJ+zmFmO9Oc6b3qqJ5Dibj7QuML6K+/LMDDf2MV7/fu3om9u3cCAHr06qs1X7C52F/t7e/qNesxq/x0bNq4AS9fvoRnjZrYsXsvfHz9pI6mggVUC3Xo0AEbNmyApaUlqlWrhtOnT+Pw4cNKxRIAqlWrhqZNm6Ju3bqwsbHBhQsXEBoailGjRkmUXJzxu25+cJ4v/ohSQxLpRN28K3UEtWJ/tZeRkRFC5s1HyLz5Ukf5IBZQLfTLLzk3YN64cSPS0tLQuHFjHD58GK1bt1aab8yYMfjrr79w6NAhpKeno0KFCpgzZw4mTpwoUXIiIs0hE/57rI+oGKSkpMDS0hI9VkTCwLjkPt2lKC3q4il1BKIiY2xQ+MGEmiglJQVlbC2RnJz8wcGPHIVLREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYnAAkpERCQCCygREZEILKBEREQisIASERGJwAJKREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYnAAkpERCSCntQBqHRZ3LUGLCwspI6hFtb1R0kdQa1env9V6ghqlZqRLXUEtSot/S1MP7kHSkREJAILKBERkQgsoERERCKwgBIREYnAAkpERCQCCygREZEILKBEREQisIASERGJwAJKREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYnAAkpERCQCCygREZEILKBEREQisIASERGJwAJKREQkAgsoERGRCCygpJXS09MxNWgy3Mo7w9rcGL6NvHHkcJjUsT5K3Wrl8fPk7vgndCqenfoJd/bPxh/zBsGjvINiHplMhn4dvbFt4XBEH/gWz079hAvbpmDykNYwNNCTMH3R0cZt+z6vX79GyJxgdPu8HSqWs4eNqR7+3LBO6ljFRpP6ywJahNauXQuZTIYLFy5IHaXUGzp4ABYtXIBevfvixwW/QFdXF/4d2+FkZKTU0UT7emArfN6iNsLP3caE+aFYveMkGtfxwOlNk1HN3QkAYGKkj5Wzv4C9tRlWhkZi4vztuHAtFtMD22P3ryMl7kHR0MZt+z4vnj/D/JA5uHP7Fjxr1JQ6TrHTpP5qx0/SUm7JkiUwMTHBgAEDin1dN27cwNatWzFgwAC4uroW+/rEOH/uHLZt2Yy58+bjq/ETAAB9v+iPurU9MTVoEsIjTkmcUJxFfxxFQNBaZGZlK9pCD13Eha1TMGFgKwyath4ZmdloNuAnnIm6r5hnzc5TiI17jhkjOqCZd2UcO3tbivhFQlu37fuUcXTCzbuPUMbREZcuXkAL3wZSRypWmtRf7oFqgSVLlmDt2rVqWdeNGzcwa9YsPHjwQC3rE2PnjlDo6upi8JBhijYjIyMMGDgYZ8+cxsOHDyVMJ96ZqPtKxRMA7v6biBt341DZzREAkJmVrVQ8c/119AoAoMr/z6eptHXbvo+hoSHKOGr2disMTeovCyhpnajLl/BJpUqwsLBQaq9X3wsAcCXqsgSpik8ZW3M8T3rzgXly/hbPk16rI1KxKW3blko2FtBCevz4MQYPHgxnZ2cYGhrCzc0NI0aMQEZGhmKe9PR0jB8/Hvb29jA1NUXnzp2RmJiosqwDBw7A19cXpqamMDc3R/v27XH9+nWleeLj4zFw4ECUK1cOhoaGcHJywueff67YA3R1dcX169dx/PhxyGQyyGQyNG3aFMD/zsmePHnyg3lkMhmCg4NVMrq6uioODa9duxbdu3cHADRr1kyxvvDwcHF/zGISHx8HR0cnlfbctrgnT9Qdqdj0alcfZctYI/TQP++db/yAlkh+lYq/I2+oKVnxKE3blko+ngMthCdPnsDLywtJSUkYNmwYqlSpgsePHyM0NBRv375VzDd69GhYW1tj5syZePDgARYuXIhRo0Zhy5Ytink2bNiAgIAAtG7dGvPmzcPbt2+xdOlS+Pj44NKlS4rzi127dsX169cxevRouLq6IiEhAWFhYfj333/h6uqKhQsXYvTo0TAzM8PUqVMBAGXKlFHKXZA8BeHn54cxY8Zg0aJFmDJlCqpWrQoAiv8tKVJTU2FoaKjSbmRkpJiuDSq5lsHCb3rgTNQ9/LHnbL7zTRz0GVo0qIIxczcj+bVm9720bFvSDCyghRAUFIT4+HicPXsW9erVU7TPnj0bgiAo3tva2uLQoUOQyWQAALlcjkWLFiE5ORmWlpZ4/fo1xowZgyFDhmDFihWKzwUEBKBy5cqYO3cuVqxYgaSkJJw6dQrz58/HhAkTlHLk8vf3x7Rp02BnZ4d+/frlmftDeQqqYsWK8PX1xaJFi9CqVSvFnm5e0tPTkZ6ernifkpJS4PV8LGNjY6V150pLS1NM13RlbM2xc1EgUl6nos/E1ZDLhTzn6/ZZHQR/2QFrdp7Cym2aP0q1NGxb0hw8hFtAcrkcu3btQseOHZWKZ67c4gQAw4YNU3rv6+uL7OxsxMbGAgDCwsKQlJSE3r1749mzZ4qXrq4uvL29cezYMQA5XwYGBgYIDw/Hy5cvRWf/UJ7iEBISAktLS8XLxcWl2Nb1X46OToiPj1Npz21zcnZWW5biYGFmhF2/joSluQk6jVqCuMTkPOdr7l0Fq779AgcirmP0d5vVnLJ4aPu2Jc3CAlpAiYmJSElJgaen5wfnLV++vNJ7a2trAFAUwejoaABA8+bNYW9vr/Q6dOgQEhISAOSMRps3bx4OHDiAMmXKwM/PDz/88APi4+MLlf1DeYpDUFAQkpOTFS91jo6sWas2ou/cUdnrPX/urGK6pjI00MP2XwLxSQUHdB27DLfu5f1vob5nBWxZMBQXb/yLfpN/R3a2XM1Ji4c2b1vSPCygxUBXVzfP9tzDvHJ5zpfZhg0bEBYWpvLavXu34jPjxo3DnTt3EBISAiMjI0yfPh1Vq1bFpUuXiizP+2RnZ39wnrwYGhrCwsJC6aUunbt0Q3Z2Nlav+t/h8fT0dKxftwb1vbzVujdclHR0ZNgwbxC8a7ih76TVOHtF9XIVAKjsVgY7Fo1A7JPn6DJmGdLSM9WctPho67YlzcRzoAVkb28PCwsLXLt27aOX5e7uDgBwcHBAy5YtCzT/119/ja+//hrR0dGoXbs2fvrpJ/zxxx8AlA8fi2VtbY2kpCSltoyMDMTFKR8uK4p1FTcvb2906dYdM6YGITEhAe7uHvhjwzrEPniAZStWSx1PtHnju6Bj05rYe/wqrC1M0atdfaXpm/efh5mJIfb89iWsLUywcP1htPFVPmJy/9GzfAuvJtDWbfshK5f9huTkJMT///8fDx7YiydPHgEAhgWOgkUhxjJoAk3pLwtoAeno6MDf3x9//PEHLly4oHIetCB7c7lat24NCwsLzJ07F82aNYO+vr7S9MTERNjb2+Pt27fQ0dFRjDAEcoqpubm50kAKU1NTleJXWO7u7jhx4oRS24oVK1T2QE1NTQHgo9dX3FavWY9Z5adj08YNePnyJTxr1MSO3Xvh4+sndTTRalYuBwDo0KQGOjSpoTJ98/7zsLE0hYuTDQBgzlh/lXk2/HVGowsooJ3b9kN+/WUBHv77vzELe3fvxN7dOwEAPXr1LTEFpahoSn9ZQAth7ty5OHToEJo0aYJhw4ahatWqiIuLw7Zt2xBZiPtwWlhYYOnSpfjiiy9Qp04d9OrVC/b29vj333+xb98+NG7cGL/++ivu3LmDFi1aoEePHqhWrRr09PSwc+dOPH36FL169VIsr27duli6dCnmzJkDDw8PODg4oHnz5oXq25AhQxAYGIiuXbuiVatWiIqKwt9//w07Ozul+WrXrg1dXV3MmzcPycnJMDQ0RPPmzeHg4JDPkqVhZGSEkHnzETJvvtRRikzrob98cJ5/417A+NNRakgjHW3cth8SdfOu1BHUSlP6ywJaCGXLlsXZs2cxffp0bNy4ESkpKShbtizatm0LExOTQi2rT58+cHZ2xvfff4/58+cjPT0dZcuWha+vLwYOHAgAcHFxQe/evXHkyBFs2LABenp6qFKlCrZu3YquXbsqljVjxgzExsbihx9+wKtXr9CkSZNCF9ChQ4fi/v37WL16NQ4ePAhfX1+EhYWhRYsWSvM5Ojpi2bJlCAkJweDBg5GdnY1jx46VuAJKRFTcZEJhjj0SiZSSkgJLS0s8fZ6s1gFFUrKur917gv/18vyvUkdQq9QMcQPsqGRLSUmBq5MNkpM//F3FUbhEREQisIASERGJwAJKREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYnAAkpERCQCCygREZEILKBEREQisIASERGJwAJKREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCLoSR2ASFu9PP+r1BHUyqbX71JHUKsXmwdJHYGKQaaBboHn5R4oERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYlQoOtAZ8+eXegFy2QyTJ8+vdCfIyIi0gQFKqDBwcGFXjALKBERabMCFVC5XF7cOYiIiDQKz4ESERGJwAJKREQkguibyV+5cgWLFy/GxYsXkZycrHKYVyaT4e7dux8dkIiIqCQStQcaHh4OLy8v7N27F87Ozrh37x4qVqwIZ2dnxMbGwszMDH5+fkWdlYiIqMQQVUBnzJiBihUr4vbt21izZg0AYMqUKYiMjMSpU6fw6NEj9OjRo0iDEhERlSSiCujFixcxePBgWFhYQFc359lp2dnZAABvb28MHz6cl7AQEZFWE1VA9fT0YG5uDgCwsrKCvr4+EhISFNMrVqyIGzduFE1CIiKiEkhUAfXw8EB0dDSAnMFCVapUwc6dOxXT9+3bB0dHx6JJSEREVAKJKqDt2rXDpk2bkJWVBQAYP348duzYgU8++QSffPIJ/vrrLwwfPrxIgxIREZUkoi5jmT59OsaOHas4/xkQEABdXV1s374durq6mDp1KgYMGFCUOYmIiEoUUQVUX18ftra2Sm39+vVDv379iiQUERFRScc7EREREYkgqoA2b978g68WLVoUdVaiAktPT8fUoMlwK+8Ma3Nj+DbyxpHDYVLHKjba2l9TIz1M6/Epdk/9DI/W9MXb0EHo19Qjz3kD21TFxYVd8HJTAGKW98T3AV4wMRR9s7USQ1u3bX40qb+iCqhcLocgCEqvrKws3L17F+Hh4Xj06FGxP8HF1dVV9HlWV1dXdOjQoWgDiRQeHg6ZTIbQ0NAPzjtgwAC4uroqtclkMlGPm1u7di1kMhkuXLhQ6M9qgqGDB2DRwgXo1bsvflzwC3R1deHfsR1ORkZKHa1YaGt/bc2NMKXHp6hczgpXY1/kO9+3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ezI0NBShoaHIzMzEjBkzcO7cuRJ/pxoiIqKPIaqAAoCpqSlmzZqFq1ev4u3bt3j79i3Onz+P6tWro0+fPnBycirKnERERCWKqEO47xIEAUeOHMHGjRuxc+dOvHr1CnZ2dhy9SkREWk10Af3nn3+wceNGbN68GfHx8ZDJZOjVqxdGjRqFBg0aKN1snYiISNsUqoDeu3cPGzduxMaNGxEdHY2yZcuib9++8PLyQs+ePdG1a1c0bNiwuLISERGVGAUuoA0bNsS5c+dgZ2eHbt26YdWqVfDx8QEA3L17t9gCEhERlUQFLqBnz56Fm5sbFixYgPbt24t6XBkREZG2KPAo3F9//RVOTk7o3LkzHB0dMXz4cBw7doyXqxARUalU4AI6cuRIREZG4u7duxg3bhwiIiLQokULlC1bFjNmzIBMJuPAISIiKjUKfR2om5sbpk2bhhs3buD8+fPo1asXwsPDIQgCRo4ciWHDhimeXkJERKStRN9IAQDq1q2LBQsW4OHDhzh06BBat26NLVu2oFOnTu99WgsREZGm+6gCqliIjg5atmyJtWvX4unTp9i0aRNatGhRFIsmIiIqkYqkgL7LyMgIPXv2xO7du4t60URERCVGkRdQIiKi0oAXcxIVk9SMbKkjqNWLzYOkjqBW3X8/L3UEtdo2qL7UEUoc7oESERGJwAJKREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYnAAkpERCQCCygREZEILKBEREQisIASERGJwAJKREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYnAAkpERCQCCyhppfT0dEwNmgy38s6wNjeGbyNvHDkcJnWsYvH69WuEzAlGt8/boWI5e9iY6uHPDeukjlVstHnbGunpoE9dZwS3rYQ/+3+KPcPqo0UlW5X5Pqtih5AOlbG+X23sGFwXq3rVxNgmrnAwM5AgddHSpO2rlQV0wIABcHV1VWqTyWQIDg6WJI+mCA8Ph0wmQ3h4uNRRPtrQwQOwaOEC9OrdFz8u+AW6urrw79gOJyMjpY5W5F48f4b5IXNw5/YteNaoKXWcYqfN29bCSA+965aFi5UR7r94m+987ramePoqAzui4rAkMhbHYp6jrosVFnSuBhsTfTUmLnqatH31pA5A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5cuX8KxREzt274WP78f/ECxpSlNfc/36ywI8/Pd/p1/27t6Jvbt3AgB69OqrNQXU0r4MZDq6OLppJdJTX8PG0QXtBo9H056DofuB7z4plLxEauDr64vvvvsODx8+VCqUfn5+WL58OVxdXVGuXLmPXk+tWrUQEBCAFStWKA6Znjt3DuvWrYO/v79iNOy7uTZv3owaNWrA2jrnThx16tSBqakp7ty588Hzn4VZZ6NGjWBtbY2AgACMGTMGMpkMGzZsUCqoebGzs0NYWBh8fHzQsmVLREZGomzZsiL/QsUjdK/23lg8P0ZGRgiZNx8h8+ZLHaXYlaa+5oq6eVfqCGphV7YCRvykOTfKL1kHlNWkUaNG0NXVhbm5OWrVqqVof/dwblFZtWoVZs2ahfPnz2PcuHE4evQogoKCsHnzZpV5c9f77uhfPT09NGzYsFC5CrJOW1tb7N27F05OTpg2bRp+/PFHtGrVCj/88MMHl1+2bFkcPnwY6enpaNWqFZ49e1agXERE2kQmfGiXg6gIpKSkwNLSEjdjE2H+n9uwaStbM976UZulZnz4jl3aZP0//0odQS3S3rzCN21rITk5WeWWkf9VKvdAiYiIPhYLKBERkQgsoERERCKwgBIREYnAAkpERCQCCygREZEILKBEREQisIASERGJwAJKREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYnAAkpERCQCCygREZEILKBEREQisIASERGJoCd1ACodBEEAALx+9UriJOqjLzeQOgIVo9SMbKkjqFXam9Lx/920N68B/O87631YQEktXv1/4azvWVHiJEREH/bq1StYWlq+dx6ZUJAyS/SR5HI5njx5AnNzc8hkMrWtNyUlBS4uLnj48CEsLCzUtl6psL/aqzT1FZCuv4Ig4NWrV3B2doaOzvvPcnIPlNRCR0cH5cqVk2z9FhYWpeJLJxf7q71KU18Bafr7oT3PXBxEREREJAILKBERkQgsoKTVDA0NMXPmTBgaGkodRS3YX+1VmvoKaEZ/OYiIiIhIBO6BEhERicACSkREJAILKBERkQgsoERERCKwgBIRlXDJycnIztbee+/K5fIPzvPixQs1JCkcFlAiDXbixAkkJibmO/3Zs2c4ceKEGhMVv8zMTFy9ehWRkZE4ceKEyktbXLhwAW3a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MkKlSpUwatSoPO8OVFLt378fwcHBUscgLcCnsRBRocyePRtubm5IS0tDZGQkli5div379+PatWswMTFRWw4/Pz+kpqbCwMCgUJ/bv38/fvvtNxZR+mgsoERUKG3btkW9evUAAEOGDIGtrS0WLFiA3bt3o3fv3irzv3nzBqampkWeQ0dHB0ZGRkW+XKKC4iFcIvoozZs3BwDcv38fAwYMgJmZGe7evYt27drB3Nwcffv2BZBz96CFCxeievXqMDIyQpkyZTB8+HC8fPlSaXmCIGDOnDkoV64cTExM0KxZM1y/fl1lvfmdAz179izatWsHa2trmJqaombNmvjll18AAAMGDMBvv/0GAEqHo3MVdUbSbtwDJaKPcvfuXQCAra0tACArKwutW7eGj48PfvzxR8Vh3eHDh2Pt2rUYOHAgxowZg/v37+PXX3/FpUuXcPLkSejr6wMAZsyYgTlz5qBdu3Zo164dLl68iM8++wwZGRkfzBIWFoYOHTrAyckJY8eOhaOjI27evIm9e/di7NixGD58OJ48eYKwsDBs2LBB5fPqyEhaRCAiKoA1a9YIAITDhw8LiYmJwsOHD4XNmzcLtra2grGxsfDo0SMhICBAACB88803Sp+NiIgQAAgbN25Uaj948KBSe0JCgmBgYCC0b99ekMvlivmmTJkiABACAgIUbceOHRMACMeOHRMEQRCysrIENzc3oUKFCsLLly+V1vPusr788kshr6++4shI2o2HcImoUFq2bAl7e3u4uLigV69eMDMzw86dO1G2bFnFPCNGjFD6zLZt22BpaYlWrVrh2bNnilfdunVhZmaGY8eOAQAOHz6MjIwMjB49WunQ6rhx4z6Y69KlS7h//z7GjRsHKysrpWnvLis/6shI2oWHcImoUH777TdUqlQJenp6KFOmDCpXrqz0NBQ9PT2UK1dO6TPR0dFITk6Gg4NDnsvMfbJKbGwsAOCTTz5Rmm5vbw9ra+v35so9lOzp6Vm4DqkxI2kXFlAiKhQvLy/FKNy8GBoaqjxeTC6Xw8HBARs3bszzM/b29kWaUQxNyEglCwsoERU7d3d3HD58GI0bN4axsXG+81WoUAFAzt5gxYoVFe2JiYkqI2HzWgcAXLt2DS1btsx3vvwO56ojI2kXngMlomLXo0cPZGdn49tvv1WZlpWVhaSkJAA551f19fWxePFiCO88qnjhwoUfXEedOnXg5uaGhQsXKpaX691l5V6T+t951JGRtAv3QImo2DVp0gTDhw9HSEgILl++jM8++wz6+vqIjo7Gtm3b8Msvv6Bbt26wt7fHhAkTEBISgg4dOqBdu3a4dOkSDhw4ADs7u/euQ0dHB0uXLkXHjh1Ru3ZtDBw4EE5OTrh16xauX7+Ov//+GwBQt25dAMCYMWPQunVr6OrqolevXmrJSFpG4lHARKQhci9jOX/+fL7zBAQECKampvlOX7FihVC3bl3B2NhYMDc3F2rUqCFMmjRJePLkiWKe7OxsYdasWYKTk5NgbGwsNG3aVLh27ZpQoUKF917GkisyMlJo1aqVYG5uLpiamgo1a9YUFi9erJielZUljB49WrC3txdkMpnKJS1FmZG0m0wQ3jkGQURERAXCc6BEREQisIASERGJwAJKREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYnAAkpERCQCCygREZEI/wdbmbzBQDCL3QAAAABJRU5ErkJggg==",
|
519 |
-
"text/plain": [
|
520 |
-
"<Figure size 640x480 with 1 Axes>"
|
521 |
-
]
|
522 |
-
},
|
523 |
-
"metadata": {},
|
524 |
-
"output_type": "display_data"
|
525 |
-
}
|
526 |
-
],
|
527 |
"source": [
|
528 |
"interp = ClassificationInterpretation.from_learner(learn)\n",
|
529 |
"interp.plot_confusion_matrix()"
|
@@ -540,98 +211,9 @@
|
|
540 |
},
|
541 |
{
|
542 |
"cell_type": "code",
|
543 |
-
"execution_count":
|
544 |
"metadata": {},
|
545 |
-
"outputs": [
|
546 |
-
{
|
547 |
-
"data": {
|
548 |
-
"text/html": [
|
549 |
-
"\n",
|
550 |
-
"<style>\n",
|
551 |
-
" /* Turns off some styling */\n",
|
552 |
-
" progress {\n",
|
553 |
-
" /* gets rid of default border in Firefox and Opera. */\n",
|
554 |
-
" border: none;\n",
|
555 |
-
" /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
|
556 |
-
" background-size: auto;\n",
|
557 |
-
" }\n",
|
558 |
-
" progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
|
559 |
-
" background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
|
560 |
-
" }\n",
|
561 |
-
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
|
562 |
-
" background: #F44336;\n",
|
563 |
-
" }\n",
|
564 |
-
"</style>\n"
|
565 |
-
],
|
566 |
-
"text/plain": [
|
567 |
-
"<IPython.core.display.HTML object>"
|
568 |
-
]
|
569 |
-
},
|
570 |
-
"metadata": {},
|
571 |
-
"output_type": "display_data"
|
572 |
-
},
|
573 |
-
{
|
574 |
-
"data": {
|
575 |
-
"text/html": [],
|
576 |
-
"text/plain": [
|
577 |
-
"<IPython.core.display.HTML object>"
|
578 |
-
]
|
579 |
-
},
|
580 |
-
"metadata": {},
|
581 |
-
"output_type": "display_data"
|
582 |
-
},
|
583 |
-
{
|
584 |
-
"data": {
|
585 |
-
"text/html": [
|
586 |
-
"\n",
|
587 |
-
"<style>\n",
|
588 |
-
" /* Turns off some styling */\n",
|
589 |
-
" progress {\n",
|
590 |
-
" /* gets rid of default border in Firefox and Opera. */\n",
|
591 |
-
" border: none;\n",
|
592 |
-
" /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
|
593 |
-
" background-size: auto;\n",
|
594 |
-
" }\n",
|
595 |
-
" progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
|
596 |
-
" background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
|
597 |
-
" }\n",
|
598 |
-
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
|
599 |
-
" background: #F44336;\n",
|
600 |
-
" }\n",
|
601 |
-
"</style>\n"
|
602 |
-
],
|
603 |
-
"text/plain": [
|
604 |
-
"<IPython.core.display.HTML object>"
|
605 |
-
]
|
606 |
-
},
|
607 |
-
"metadata": {},
|
608 |
-
"output_type": "display_data"
|
609 |
-
},
|
610 |
-
{
|
611 |
-
"data": {
|
612 |
-
"text/html": [],
|
613 |
-
"text/plain": [
|
614 |
-
"<IPython.core.display.HTML object>"
|
615 |
-
]
|
616 |
-
},
|
617 |
-
"metadata": {},
|
618 |
-
"output_type": "display_data"
|
619 |
-
},
|
620 |
-
{
|
621 |
-
"data": {
|
622 |
-
"application/vnd.jupyter.widget-view+json": {
|
623 |
-
"model_id": "8f05f558f0424dc2a87d4e4c68263e39",
|
624 |
-
"version_major": 2,
|
625 |
-
"version_minor": 0
|
626 |
-
},
|
627 |
-
"text/plain": [
|
628 |
-
"VBox(children=(Dropdown(options=('ash', 'chestnut', 'ginkgo biloba', 'silver maple', 'willow oak'), value='ash…"
|
629 |
-
]
|
630 |
-
},
|
631 |
-
"metadata": {},
|
632 |
-
"output_type": "display_data"
|
633 |
-
}
|
634 |
-
],
|
635 |
"source": [
|
636 |
"cleaner = ImageClassifierCleaner(learn)\n",
|
637 |
"cleaner"
|
@@ -639,7 +221,7 @@
|
|
639 |
},
|
640 |
{
|
641 |
"cell_type": "code",
|
642 |
-
"execution_count":
|
643 |
"metadata": {},
|
644 |
"outputs": [],
|
645 |
"source": [
|
@@ -664,7 +246,7 @@
|
|
664 |
},
|
665 |
{
|
666 |
"cell_type": "code",
|
667 |
-
"execution_count":
|
668 |
"metadata": {},
|
669 |
"outputs": [],
|
670 |
"source": [
|
@@ -673,28 +255,17 @@
|
|
673 |
},
|
674 |
{
|
675 |
"cell_type": "code",
|
676 |
-
"execution_count":
|
677 |
"metadata": {},
|
678 |
-
"outputs": [
|
679 |
-
{
|
680 |
-
"data": {
|
681 |
-
"text/plain": [
|
682 |
-
"(#1) [Path('model.pkl')]"
|
683 |
-
]
|
684 |
-
},
|
685 |
-
"execution_count": 21,
|
686 |
-
"metadata": {},
|
687 |
-
"output_type": "execute_result"
|
688 |
-
}
|
689 |
-
],
|
690 |
"source": [
|
691 |
"path = Path()\n",
|
692 |
-
"path.ls(file_exts='.pkl')"
|
693 |
]
|
694 |
},
|
695 |
{
|
696 |
"cell_type": "code",
|
697 |
-
"execution_count":
|
698 |
"metadata": {},
|
699 |
"outputs": [],
|
700 |
"source": [
|
@@ -703,89 +274,21 @@
|
|
703 |
},
|
704 |
{
|
705 |
"cell_type": "code",
|
706 |
-
"execution_count":
|
707 |
"metadata": {},
|
708 |
-
"outputs": [
|
709 |
-
{
|
710 |
-
"data": {
|
711 |
-
"text/html": [
|
712 |
-
"\n",
|
713 |
-
"<style>\n",
|
714 |
-
" /* Turns off some styling */\n",
|
715 |
-
" progress {\n",
|
716 |
-
" /* gets rid of default border in Firefox and Opera. */\n",
|
717 |
-
" border: none;\n",
|
718 |
-
" /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
|
719 |
-
" background-size: auto;\n",
|
720 |
-
" }\n",
|
721 |
-
" progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
|
722 |
-
" background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
|
723 |
-
" }\n",
|
724 |
-
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
|
725 |
-
" background: #F44336;\n",
|
726 |
-
" }\n",
|
727 |
-
"</style>\n"
|
728 |
-
],
|
729 |
-
"text/plain": [
|
730 |
-
"<IPython.core.display.HTML object>"
|
731 |
-
]
|
732 |
-
},
|
733 |
-
"metadata": {},
|
734 |
-
"output_type": "display_data"
|
735 |
-
},
|
736 |
-
{
|
737 |
-
"data": {
|
738 |
-
"text/html": [],
|
739 |
-
"text/plain": [
|
740 |
-
"<IPython.core.display.HTML object>"
|
741 |
-
]
|
742 |
-
},
|
743 |
-
"metadata": {},
|
744 |
-
"output_type": "display_data"
|
745 |
-
},
|
746 |
-
{
|
747 |
-
"data": {
|
748 |
-
"text/plain": [
|
749 |
-
"('ash',\n",
|
750 |
-
" TensorBase(0),\n",
|
751 |
-
" TensorBase([7.8849e-01, 1.4656e-03, 4.6224e-04, 6.6382e-03, 2.0294e-01]))"
|
752 |
-
]
|
753 |
-
},
|
754 |
-
"execution_count": 23,
|
755 |
-
"metadata": {},
|
756 |
-
"output_type": "execute_result"
|
757 |
-
}
|
758 |
-
],
|
759 |
"source": [
|
760 |
"learn_inf.predict('images/ash.jpg')"
|
761 |
]
|
762 |
},
|
763 |
{
|
764 |
"cell_type": "code",
|
765 |
-
"execution_count":
|
766 |
"metadata": {},
|
767 |
-
"outputs": [
|
768 |
-
{
|
769 |
-
"data": {
|
770 |
-
"text/plain": [
|
771 |
-
"['ash', 'chestnut', 'ginkgo biloba', 'silver maple', 'willow oak']"
|
772 |
-
]
|
773 |
-
},
|
774 |
-
"execution_count": 24,
|
775 |
-
"metadata": {},
|
776 |
-
"output_type": "execute_result"
|
777 |
-
}
|
778 |
-
],
|
779 |
"source": [
|
780 |
"learn_inf.dls.vocab"
|
781 |
]
|
782 |
-
},
|
783 |
-
{
|
784 |
-
"cell_type": "code",
|
785 |
-
"execution_count": null,
|
786 |
-
"metadata": {},
|
787 |
-
"outputs": [],
|
788 |
-
"source": []
|
789 |
}
|
790 |
],
|
791 |
"metadata": {
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
+
"execution_count": null,
|
6 |
"metadata": {},
|
7 |
"outputs": [],
|
8 |
"source": [
|
14 |
},
|
15 |
{
|
16 |
"cell_type": "code",
|
17 |
+
"execution_count": null,
|
18 |
"metadata": {},
|
19 |
"outputs": [],
|
20 |
"source": [
|
24 |
},
|
25 |
{
|
26 |
"cell_type": "code",
|
27 |
+
"execution_count": null,
|
28 |
"metadata": {},
|
29 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
"source": [
|
31 |
"ims = search_images_ddg('gingko biloba tree leaf', max_images=10)\n",
|
32 |
"len(ims)"
|
34 |
},
|
35 |
{
|
36 |
"cell_type": "code",
|
37 |
+
"execution_count": null,
|
38 |
"metadata": {},
|
39 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
"source": [
|
41 |
"dest = 'images/tree.jpg'\n",
|
42 |
"download_url(ims[0], dest)"
|
54 |
},
|
55 |
{
|
56 |
"cell_type": "code",
|
57 |
+
"execution_count": null,
|
58 |
"metadata": {},
|
59 |
"outputs": [],
|
60 |
"source": [
|
64 |
},
|
65 |
{
|
66 |
"cell_type": "code",
|
67 |
+
"execution_count": null,
|
68 |
"metadata": {},
|
69 |
"outputs": [],
|
70 |
"source": [
|
89 |
},
|
90 |
{
|
91 |
"cell_type": "code",
|
92 |
+
"execution_count": null,
|
93 |
"metadata": {},
|
94 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
95 |
"source": [
|
96 |
"failed = verify_images(fns)\n",
|
97 |
"failed"
|
99 |
},
|
100 |
{
|
101 |
"cell_type": "code",
|
102 |
+
"execution_count": null,
|
103 |
"metadata": {},
|
104 |
"outputs": [],
|
105 |
"source": [
|
115 |
},
|
116 |
{
|
117 |
"cell_type": "code",
|
118 |
+
"execution_count": null,
|
119 |
"metadata": {},
|
120 |
"outputs": [],
|
121 |
"source": [
|
122 |
+
"trees = DataBlock(blocks=(ImageBlock, CategoryBlock),\n",
|
123 |
+
" get_items=get_image_files,\n",
|
124 |
+
" splitter=RandomSplitter(valid_pct=0.2, seed=42),\n",
|
125 |
+
" get_y=parent_label,\n",
|
126 |
+
" item_tfms=Resize(128))\n"
|
|
|
|
|
127 |
]
|
128 |
},
|
129 |
{
|
130 |
"cell_type": "code",
|
131 |
+
"execution_count": null,
|
132 |
"metadata": {},
|
133 |
"outputs": [],
|
134 |
"source": [
|
159 |
"source": [
|
160 |
"trees = trees.new(item_tfms=Resize(128), batch_tfms=aug_transforms(mult=2))\n",
|
161 |
"dls = trees.dataloaders(path)\n",
|
162 |
+
"dls.train.show_batch(max_n=8, nrows=2, unique=True)\n"
|
163 |
]
|
164 |
},
|
165 |
{
|
171 |
},
|
172 |
{
|
173 |
"cell_type": "code",
|
174 |
+
"execution_count": null,
|
175 |
"metadata": {},
|
176 |
"outputs": [],
|
177 |
"source": [
|
178 |
+
"trees = trees.new(item_tfms=RandomResizedCrop(224, min_scale=0.5),\n",
|
179 |
+
" batch_tfms=aug_transforms())\n",
|
180 |
+
"dls = trees.dataloaders(path)\n"
|
|
|
|
|
181 |
]
|
182 |
},
|
183 |
{
|
184 |
"cell_type": "code",
|
185 |
+
"execution_count": null,
|
186 |
"metadata": {},
|
187 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
188 |
"source": [
|
189 |
"learn = vision_learner(dls, resnet18, metrics=error_rate)\n",
|
190 |
+
"learn.fine_tune(5)\n"
|
191 |
]
|
192 |
},
|
193 |
{
|
194 |
"cell_type": "code",
|
195 |
+
"execution_count": null,
|
196 |
"metadata": {},
|
197 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
198 |
"source": [
|
199 |
"interp = ClassificationInterpretation.from_learner(learn)\n",
|
200 |
"interp.plot_confusion_matrix()"
|
211 |
},
|
212 |
{
|
213 |
"cell_type": "code",
|
214 |
+
"execution_count": null,
|
215 |
"metadata": {},
|
216 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
217 |
"source": [
|
218 |
"cleaner = ImageClassifierCleaner(learn)\n",
|
219 |
"cleaner"
|
221 |
},
|
222 |
{
|
223 |
"cell_type": "code",
|
224 |
+
"execution_count": null,
|
225 |
"metadata": {},
|
226 |
"outputs": [],
|
227 |
"source": [
|
246 |
},
|
247 |
{
|
248 |
"cell_type": "code",
|
249 |
+
"execution_count": null,
|
250 |
"metadata": {},
|
251 |
"outputs": [],
|
252 |
"source": [
|
255 |
},
|
256 |
{
|
257 |
"cell_type": "code",
|
258 |
+
"execution_count": null,
|
259 |
"metadata": {},
|
260 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
261 |
"source": [
|
262 |
"path = Path()\n",
|
263 |
+
"path.ls(file_exts='.pkl')\n"
|
264 |
]
|
265 |
},
|
266 |
{
|
267 |
"cell_type": "code",
|
268 |
+
"execution_count": null,
|
269 |
"metadata": {},
|
270 |
"outputs": [],
|
271 |
"source": [
|
274 |
},
|
275 |
{
|
276 |
"cell_type": "code",
|
277 |
+
"execution_count": null,
|
278 |
"metadata": {},
|
279 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
280 |
"source": [
|
281 |
"learn_inf.predict('images/ash.jpg')"
|
282 |
]
|
283 |
},
|
284 |
{
|
285 |
"cell_type": "code",
|
286 |
+
"execution_count": null,
|
287 |
"metadata": {},
|
288 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
289 |
"source": [
|
290 |
"learn_inf.dls.vocab"
|
291 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
292 |
}
|
293 |
],
|
294 |
"metadata": {
|