mateocontreras commited on
Commit
74fa69a
·
1 Parent(s): a504cb5
Files changed (8) hide show
  1. app.py +14 -0
  2. dogs_v_cats.ipynb +469 -0
  3. gato.jpeg +0 -0
  4. gato_perro.jpeg +0 -0
  5. gato_perro_2.jpg +0 -0
  6. model.pkl +3 -0
  7. perro.jpg +0 -0
  8. requirements.txt +5 -0
app.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastai.vision.all import *
2
+ import gradio as gr
3
+ def is_cat(x): return x[0].isupper()
4
+ learner = load_learner('model.pkl')
5
+ categorias = ("Perro", "Gato")
6
+ def clasificar_imagen(img):
7
+ prediccion, indice, probabilidades = learner.predict(img)
8
+ return dict(zip(categorias, map(float,probabilidades)))
9
+ imagen = gr.inputs.Image(shape=(192,192))
10
+ etiqueta = gr.outputs.Label()
11
+ ejemplos = ['perro.jpg','gato.jpeg','gato_perro.jpeg','gato_perro_2.jpg']
12
+
13
+ interfaz = gr.Interface(fn=clasificar_imagen,inputs=imagen,outputs=etiqueta, examples=ejemplos)
14
+ interfaz.launch(inline=False)
dogs_v_cats.ipynb ADDED
@@ -0,0 +1,469 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 9,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "#!pip install nbconvert\n"
10
+ ]
11
+ },
12
+ {
13
+ "cell_type": "code",
14
+ "execution_count": 10,
15
+ "metadata": {},
16
+ "outputs": [],
17
+ "source": [
18
+ "#exportar\n",
19
+ "from fastai.vision.all import *\n",
20
+ "import gradio as gr\n",
21
+ "def is_cat(x): return x[0].isupper()\n",
22
+ "\n",
23
+ "import pathlib\n",
24
+ "temp = pathlib.PosixPath\n",
25
+ "pathlib.PosixPath = pathlib.WindowsPath"
26
+ ]
27
+ },
28
+ {
29
+ "cell_type": "code",
30
+ "execution_count": 11,
31
+ "metadata": {},
32
+ "outputs": [
33
+ {
34
+ "data": {
35
+ "image/png": "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",
36
+ "text/plain": [
37
+ "PILImage mode=RGB size=89x192"
38
+ ]
39
+ },
40
+ "execution_count": 11,
41
+ "metadata": {},
42
+ "output_type": "execute_result"
43
+ }
44
+ ],
45
+ "source": [
46
+ "im = PILImage.create(\"gato.jpeg\")\n",
47
+ "im.thumbnail((192,192))\n",
48
+ "im"
49
+ ]
50
+ },
51
+ {
52
+ "cell_type": "code",
53
+ "execution_count": 12,
54
+ "metadata": {},
55
+ "outputs": [],
56
+ "source": [
57
+ "#exportar\n",
58
+ "learner = load_learner('model.pkl')\n"
59
+ ]
60
+ },
61
+ {
62
+ "cell_type": "code",
63
+ "execution_count": 13,
64
+ "metadata": {},
65
+ "outputs": [
66
+ {
67
+ "data": {
68
+ "text/html": [
69
+ "\n",
70
+ "<style>\n",
71
+ " /* Turns off some styling */\n",
72
+ " progress {\n",
73
+ " /* gets rid of default border in Firefox and Opera. */\n",
74
+ " border: none;\n",
75
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
76
+ " background-size: auto;\n",
77
+ " }\n",
78
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
79
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
80
+ " }\n",
81
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
82
+ " background: #F44336;\n",
83
+ " }\n",
84
+ "</style>\n"
85
+ ],
86
+ "text/plain": [
87
+ "<IPython.core.display.HTML object>"
88
+ ]
89
+ },
90
+ "metadata": {},
91
+ "output_type": "display_data"
92
+ },
93
+ {
94
+ "data": {
95
+ "text/html": [
96
+ "\n",
97
+ " <div>\n",
98
+ " <progress value='0' class='' max='1' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
99
+ " 0.00% [0/1 00:00&lt;?]\n",
100
+ " </div>\n",
101
+ " "
102
+ ],
103
+ "text/plain": [
104
+ "<IPython.core.display.HTML object>"
105
+ ]
106
+ },
107
+ "metadata": {},
108
+ "output_type": "display_data"
109
+ },
110
+ {
111
+ "data": {
112
+ "text/plain": [
113
+ "('True', tensor(1), tensor([1.1888e-17, 1.0000e+00]))"
114
+ ]
115
+ },
116
+ "execution_count": 13,
117
+ "metadata": {},
118
+ "output_type": "execute_result"
119
+ }
120
+ ],
121
+ "source": [
122
+ "learner.predict(im)"
123
+ ]
124
+ },
125
+ {
126
+ "cell_type": "code",
127
+ "execution_count": 14,
128
+ "metadata": {},
129
+ "outputs": [],
130
+ "source": [
131
+ "#exportar\n",
132
+ "categorias = (\"Perro\", \"Gato\")\n",
133
+ "def clasificar_imagen(img):\n",
134
+ " prediccion, indice, probabilidades = learner.predict(img)\n",
135
+ " return dict(zip(categorias, map(float,probabilidades)))\n"
136
+ ]
137
+ },
138
+ {
139
+ "cell_type": "code",
140
+ "execution_count": null,
141
+ "metadata": {},
142
+ "outputs": [],
143
+ "source": []
144
+ },
145
+ {
146
+ "cell_type": "code",
147
+ "execution_count": 15,
148
+ "metadata": {},
149
+ "outputs": [
150
+ {
151
+ "data": {
152
+ "text/html": [
153
+ "\n",
154
+ "<style>\n",
155
+ " /* Turns off some styling */\n",
156
+ " progress {\n",
157
+ " /* gets rid of default border in Firefox and Opera. */\n",
158
+ " border: none;\n",
159
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
160
+ " background-size: auto;\n",
161
+ " }\n",
162
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
163
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
164
+ " }\n",
165
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
166
+ " background: #F44336;\n",
167
+ " }\n",
168
+ "</style>\n"
169
+ ],
170
+ "text/plain": [
171
+ "<IPython.core.display.HTML object>"
172
+ ]
173
+ },
174
+ "metadata": {},
175
+ "output_type": "display_data"
176
+ },
177
+ {
178
+ "data": {
179
+ "text/html": [],
180
+ "text/plain": [
181
+ "<IPython.core.display.HTML object>"
182
+ ]
183
+ },
184
+ "metadata": {},
185
+ "output_type": "display_data"
186
+ },
187
+ {
188
+ "data": {
189
+ "text/plain": [
190
+ "{'Perro': 1.1887927089340569e-17, 'Gato': 1.0}"
191
+ ]
192
+ },
193
+ "execution_count": 15,
194
+ "metadata": {},
195
+ "output_type": "execute_result"
196
+ }
197
+ ],
198
+ "source": [
199
+ "clasificar_imagen(im)"
200
+ ]
201
+ },
202
+ {
203
+ "cell_type": "code",
204
+ "execution_count": null,
205
+ "metadata": {},
206
+ "outputs": [
207
+ {
208
+ "name": "stderr",
209
+ "output_type": "stream",
210
+ "text": [
211
+ "C:\\Users\\Mateo\\AppData\\Local\\Temp\\ipykernel_3488\\3452659319.py:2: GradioDeprecationWarning: Usage of gradio.inputs is deprecated, and will not be supported in the future, please import your component from gradio.components\n",
212
+ " imagen = gr.inputs.Image(shape=(192,192))\n",
213
+ "C:\\Users\\Mateo\\AppData\\Local\\Temp\\ipykernel_3488\\3452659319.py:2: GradioDeprecationWarning: `optional` parameter is deprecated, and it has no effect\n",
214
+ " imagen = gr.inputs.Image(shape=(192,192))\n",
215
+ "C:\\Users\\Mateo\\AppData\\Local\\Temp\\ipykernel_3488\\3452659319.py:3: GradioDeprecationWarning: Usage of gradio.outputs is deprecated, and will not be supported in the future, please import your components from gradio.components\n",
216
+ " etiqueta = gr.outputs.Label()\n",
217
+ "C:\\Users\\Mateo\\AppData\\Local\\Temp\\ipykernel_3488\\3452659319.py:3: GradioUnusedKwargWarning: You have unused kwarg parameters in Label, please remove them: {'type': 'auto'}\n",
218
+ " etiqueta = gr.outputs.Label()\n"
219
+ ]
220
+ },
221
+ {
222
+ "name": "stdout",
223
+ "output_type": "stream",
224
+ "text": [
225
+ "Running on local URL: http://127.0.0.1:7861\n",
226
+ "\n",
227
+ "To create a public link, set `share=True` in `launch()`.\n"
228
+ ]
229
+ },
230
+ {
231
+ "data": {
232
+ "text/html": [
233
+ "<div><iframe src=\"http://127.0.0.1:7861/\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
234
+ ],
235
+ "text/plain": [
236
+ "<IPython.core.display.HTML object>"
237
+ ]
238
+ },
239
+ "metadata": {},
240
+ "output_type": "display_data"
241
+ },
242
+ {
243
+ "data": {
244
+ "text/plain": []
245
+ },
246
+ "execution_count": 16,
247
+ "metadata": {},
248
+ "output_type": "execute_result"
249
+ },
250
+ {
251
+ "data": {
252
+ "text/html": [
253
+ "\n",
254
+ "<style>\n",
255
+ " /* Turns off some styling */\n",
256
+ " progress {\n",
257
+ " /* gets rid of default border in Firefox and Opera. */\n",
258
+ " border: none;\n",
259
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
260
+ " background-size: auto;\n",
261
+ " }\n",
262
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
263
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
264
+ " }\n",
265
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
266
+ " background: #F44336;\n",
267
+ " }\n",
268
+ "</style>\n"
269
+ ],
270
+ "text/plain": [
271
+ "<IPython.core.display.HTML object>"
272
+ ]
273
+ },
274
+ "metadata": {},
275
+ "output_type": "display_data"
276
+ },
277
+ {
278
+ "data": {
279
+ "text/html": [],
280
+ "text/plain": [
281
+ "<IPython.core.display.HTML object>"
282
+ ]
283
+ },
284
+ "metadata": {},
285
+ "output_type": "display_data"
286
+ },
287
+ {
288
+ "data": {
289
+ "text/html": [
290
+ "\n",
291
+ "<style>\n",
292
+ " /* Turns off some styling */\n",
293
+ " progress {\n",
294
+ " /* gets rid of default border in Firefox and Opera. */\n",
295
+ " border: none;\n",
296
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
297
+ " background-size: auto;\n",
298
+ " }\n",
299
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
300
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
301
+ " }\n",
302
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
303
+ " background: #F44336;\n",
304
+ " }\n",
305
+ "</style>\n"
306
+ ],
307
+ "text/plain": [
308
+ "<IPython.core.display.HTML object>"
309
+ ]
310
+ },
311
+ "metadata": {},
312
+ "output_type": "display_data"
313
+ },
314
+ {
315
+ "data": {
316
+ "text/html": [],
317
+ "text/plain": [
318
+ "<IPython.core.display.HTML object>"
319
+ ]
320
+ },
321
+ "metadata": {},
322
+ "output_type": "display_data"
323
+ },
324
+ {
325
+ "data": {
326
+ "text/html": [
327
+ "\n",
328
+ "<style>\n",
329
+ " /* Turns off some styling */\n",
330
+ " progress {\n",
331
+ " /* gets rid of default border in Firefox and Opera. */\n",
332
+ " border: none;\n",
333
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
334
+ " background-size: auto;\n",
335
+ " }\n",
336
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
337
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
338
+ " }\n",
339
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
340
+ " background: #F44336;\n",
341
+ " }\n",
342
+ "</style>\n"
343
+ ],
344
+ "text/plain": [
345
+ "<IPython.core.display.HTML object>"
346
+ ]
347
+ },
348
+ "metadata": {},
349
+ "output_type": "display_data"
350
+ },
351
+ {
352
+ "data": {
353
+ "text/html": [],
354
+ "text/plain": [
355
+ "<IPython.core.display.HTML object>"
356
+ ]
357
+ },
358
+ "metadata": {},
359
+ "output_type": "display_data"
360
+ },
361
+ {
362
+ "data": {
363
+ "text/html": [
364
+ "\n",
365
+ "<style>\n",
366
+ " /* Turns off some styling */\n",
367
+ " progress {\n",
368
+ " /* gets rid of default border in Firefox and Opera. */\n",
369
+ " border: none;\n",
370
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
371
+ " background-size: auto;\n",
372
+ " }\n",
373
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
374
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
375
+ " }\n",
376
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
377
+ " background: #F44336;\n",
378
+ " }\n",
379
+ "</style>\n"
380
+ ],
381
+ "text/plain": [
382
+ "<IPython.core.display.HTML object>"
383
+ ]
384
+ },
385
+ "metadata": {},
386
+ "output_type": "display_data"
387
+ },
388
+ {
389
+ "data": {
390
+ "text/html": [],
391
+ "text/plain": [
392
+ "<IPython.core.display.HTML object>"
393
+ ]
394
+ },
395
+ "metadata": {},
396
+ "output_type": "display_data"
397
+ },
398
+ {
399
+ "data": {
400
+ "text/html": [
401
+ "\n",
402
+ "<style>\n",
403
+ " /* Turns off some styling */\n",
404
+ " progress {\n",
405
+ " /* gets rid of default border in Firefox and Opera. */\n",
406
+ " border: none;\n",
407
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
408
+ " background-size: auto;\n",
409
+ " }\n",
410
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
411
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
412
+ " }\n",
413
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
414
+ " background: #F44336;\n",
415
+ " }\n",
416
+ "</style>\n"
417
+ ],
418
+ "text/plain": [
419
+ "<IPython.core.display.HTML object>"
420
+ ]
421
+ },
422
+ "metadata": {},
423
+ "output_type": "display_data"
424
+ },
425
+ {
426
+ "data": {
427
+ "text/html": [],
428
+ "text/plain": [
429
+ "<IPython.core.display.HTML object>"
430
+ ]
431
+ },
432
+ "metadata": {},
433
+ "output_type": "display_data"
434
+ }
435
+ ],
436
+ "source": [
437
+ "#exportar\n",
438
+ "imagen = gr.inputs.Image(shape=(192,192))\n",
439
+ "etiqueta = gr.outputs.Label()\n",
440
+ "ejemplos = ['perro.jpg','gato.jpeg','gato_perro.jpeg','gato_perro_2.jpg'] \n",
441
+ "\n",
442
+ "interfaz = gr.Interface(fn=clasificar_imagen,inputs=imagen,outputs=etiqueta, examples=ejemplos)\n",
443
+ "interfaz.launch(inline=False)"
444
+ ]
445
+ }
446
+ ],
447
+ "metadata": {
448
+ "kernelspec": {
449
+ "display_name": "base",
450
+ "language": "python",
451
+ "name": "python3"
452
+ },
453
+ "language_info": {
454
+ "codemirror_mode": {
455
+ "name": "ipython",
456
+ "version": 3
457
+ },
458
+ "file_extension": ".py",
459
+ "mimetype": "text/x-python",
460
+ "name": "python",
461
+ "nbconvert_exporter": "python",
462
+ "pygments_lexer": "ipython3",
463
+ "version": "3.9.7"
464
+ },
465
+ "orig_nbformat": 4
466
+ },
467
+ "nbformat": 4,
468
+ "nbformat_minor": 2
469
+ }
gato.jpeg ADDED
gato_perro.jpeg ADDED
gato_perro_2.jpg ADDED
model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:badf31a9c1f02f838bcb615293fa270c006b6baf5892f3dc6b1fa0e7df839e95
3
+ size 47213009
perro.jpg ADDED
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ fastai
2
+ torch
3
+ gradio
4
+ numpy
5
+ pandas