thescripterr commited on
Commit
5d85dbc
·
1 Parent(s): d77ad65

Changed app.py to nb auto generated code

Browse files
Files changed (4) hide show
  1. .ipynb_checkpoints/app-checkpoint.ipynb +245 -0
  2. app.ipynb +922 -0
  3. app.py +20 -7
  4. app_2.py +23 -0
.ipynb_checkpoints/app-checkpoint.ipynb ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 2,
6
+ "id": "c5b9a2d9-e80e-4403-aaef-699ae62a674c",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "#|default_exp app"
11
+ ]
12
+ },
13
+ {
14
+ "cell_type": "markdown",
15
+ "id": "206a72c3-6024-4f2f-9dc1-5eaea0aaf2b4",
16
+ "metadata": {},
17
+ "source": [
18
+ "## Dog vs Cat"
19
+ ]
20
+ },
21
+ {
22
+ "cell_type": "code",
23
+ "execution_count": 4,
24
+ "id": "da75dbb1-afe6-4be2-bcb4-cf93f3232b2f",
25
+ "metadata": {},
26
+ "outputs": [],
27
+ "source": [
28
+ "#|export\n",
29
+ "import gradio as gr\n",
30
+ "from fastai.vision.all import *\n",
31
+ "\n",
32
+ "def is_cat(x): return x[0].isupper() "
33
+ ]
34
+ },
35
+ {
36
+ "cell_type": "code",
37
+ "execution_count": 7,
38
+ "id": "044e2714-f758-4376-a023-db7aed76df9b",
39
+ "metadata": {},
40
+ "outputs": [
41
+ {
42
+ "data": {
43
+ "image/png": "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\n",
44
+ "text/plain": [
45
+ "PILImage mode=RGB size=185x123"
46
+ ]
47
+ },
48
+ "execution_count": 7,
49
+ "metadata": {},
50
+ "output_type": "execute_result"
51
+ }
52
+ ],
53
+ "source": [
54
+ "img = PILImage.create('puppy.jpeg')\n",
55
+ "img.thumbnail((192, 192))\n",
56
+ "img "
57
+ ]
58
+ },
59
+ {
60
+ "cell_type": "code",
61
+ "execution_count": 8,
62
+ "id": "686a17b6-a4a0-480e-9f84-0f2c14f47a8c",
63
+ "metadata": {},
64
+ "outputs": [],
65
+ "source": [
66
+ "#|export\n",
67
+ "learn = load_learner('model.pkl')"
68
+ ]
69
+ },
70
+ {
71
+ "cell_type": "code",
72
+ "execution_count": 12,
73
+ "id": "fb6a1c33-de42-44ed-98c6-51b79b7ddd84",
74
+ "metadata": {},
75
+ "outputs": [
76
+ {
77
+ "data": {
78
+ "text/html": [
79
+ "\n",
80
+ "<style>\n",
81
+ " /* Turns off some styling */\n",
82
+ " progress {\n",
83
+ " /* gets rid of default border in Firefox and Opera. */\n",
84
+ " border: none;\n",
85
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
86
+ " background-size: auto;\n",
87
+ " }\n",
88
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
89
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
90
+ " }\n",
91
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
92
+ " background: #F44336;\n",
93
+ " }\n",
94
+ "</style>\n"
95
+ ],
96
+ "text/plain": [
97
+ "<IPython.core.display.HTML object>"
98
+ ]
99
+ },
100
+ "metadata": {},
101
+ "output_type": "display_data"
102
+ },
103
+ {
104
+ "data": {
105
+ "text/html": [],
106
+ "text/plain": [
107
+ "<IPython.core.display.HTML object>"
108
+ ]
109
+ },
110
+ "metadata": {},
111
+ "output_type": "display_data"
112
+ },
113
+ {
114
+ "name": "stdout",
115
+ "output_type": "stream",
116
+ "text": [
117
+ "CPU times: user 1.71 s, sys: 477 ms, total: 2.18 s\n",
118
+ "Wall time: 342 ms\n"
119
+ ]
120
+ },
121
+ {
122
+ "data": {
123
+ "text/plain": [
124
+ "('False', tensor(0), tensor([9.9999e-01, 1.3130e-05]))"
125
+ ]
126
+ },
127
+ "execution_count": 12,
128
+ "metadata": {},
129
+ "output_type": "execute_result"
130
+ }
131
+ ],
132
+ "source": [
133
+ "%time learn.predict(img)"
134
+ ]
135
+ },
136
+ {
137
+ "cell_type": "code",
138
+ "execution_count": 11,
139
+ "id": "0cf1d03f-30b7-4451-9a21-f01943afa7c5",
140
+ "metadata": {},
141
+ "outputs": [],
142
+ "source": [
143
+ "#|export\n",
144
+ "categories = ('Dog', 'Cat')\n",
145
+ "\n",
146
+ "def classify_image(img):\n",
147
+ " pred,pred_idx,probs = learn.predict(img)\n",
148
+ " return dict(zip(categories, map(float, probs)))\n",
149
+ " # return {labels[i]: float(probs[i]) for i in range(len(labels))}"
150
+ ]
151
+ },
152
+ {
153
+ "cell_type": "code",
154
+ "execution_count": 13,
155
+ "id": "4a7dcc01-6fe8-421e-8896-6ba8e286a13c",
156
+ "metadata": {},
157
+ "outputs": [
158
+ {
159
+ "data": {
160
+ "text/html": [
161
+ "\n",
162
+ "<style>\n",
163
+ " /* Turns off some styling */\n",
164
+ " progress {\n",
165
+ " /* gets rid of default border in Firefox and Opera. */\n",
166
+ " border: none;\n",
167
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
168
+ " background-size: auto;\n",
169
+ " }\n",
170
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
171
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
172
+ " }\n",
173
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
174
+ " background: #F44336;\n",
175
+ " }\n",
176
+ "</style>\n"
177
+ ],
178
+ "text/plain": [
179
+ "<IPython.core.display.HTML object>"
180
+ ]
181
+ },
182
+ "metadata": {},
183
+ "output_type": "display_data"
184
+ },
185
+ {
186
+ "data": {
187
+ "text/html": [],
188
+ "text/plain": [
189
+ "<IPython.core.display.HTML object>"
190
+ ]
191
+ },
192
+ "metadata": {},
193
+ "output_type": "display_data"
194
+ },
195
+ {
196
+ "data": {
197
+ "text/plain": [
198
+ "{'Dog': 0.9999868869781494, 'Cat': 1.3129938452038914e-05}"
199
+ ]
200
+ },
201
+ "execution_count": 13,
202
+ "metadata": {},
203
+ "output_type": "execute_result"
204
+ }
205
+ ],
206
+ "source": [
207
+ "classify_image(img)"
208
+ ]
209
+ },
210
+ {
211
+ "cell_type": "code",
212
+ "execution_count": null,
213
+ "id": "8131d659-f862-4294-b683-c5c9ee1d111d",
214
+ "metadata": {},
215
+ "outputs": [],
216
+ "source": [
217
+ "#|export\n",
218
+ "image = gr.inputs.Image(shape=(512, 512))\n",
219
+ "label = outputs=gr.outputs.Label()\n",
220
+ "examples=[]"
221
+ ]
222
+ }
223
+ ],
224
+ "metadata": {
225
+ "kernelspec": {
226
+ "display_name": "Python 3 (ipykernel)",
227
+ "language": "python",
228
+ "name": "python3"
229
+ },
230
+ "language_info": {
231
+ "codemirror_mode": {
232
+ "name": "ipython",
233
+ "version": 3
234
+ },
235
+ "file_extension": ".py",
236
+ "mimetype": "text/x-python",
237
+ "name": "python",
238
+ "nbconvert_exporter": "python",
239
+ "pygments_lexer": "ipython3",
240
+ "version": "3.10.8"
241
+ }
242
+ },
243
+ "nbformat": 4,
244
+ "nbformat_minor": 5
245
+ }
app.ipynb ADDED
@@ -0,0 +1,922 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 2,
6
+ "id": "c5b9a2d9-e80e-4403-aaef-699ae62a674c",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "#|default_exp app"
11
+ ]
12
+ },
13
+ {
14
+ "cell_type": "markdown",
15
+ "id": "206a72c3-6024-4f2f-9dc1-5eaea0aaf2b4",
16
+ "metadata": {},
17
+ "source": [
18
+ "## Dog vs Cat"
19
+ ]
20
+ },
21
+ {
22
+ "cell_type": "code",
23
+ "execution_count": 4,
24
+ "id": "da75dbb1-afe6-4be2-bcb4-cf93f3232b2f",
25
+ "metadata": {},
26
+ "outputs": [],
27
+ "source": [
28
+ "#|export\n",
29
+ "import gradio as gr\n",
30
+ "from fastai.vision.all import *\n",
31
+ "\n",
32
+ "def is_cat(x): return x[0].isupper() "
33
+ ]
34
+ },
35
+ {
36
+ "cell_type": "code",
37
+ "execution_count": 7,
38
+ "id": "044e2714-f758-4376-a023-db7aed76df9b",
39
+ "metadata": {},
40
+ "outputs": [
41
+ {
42
+ "data": {
43
+ "image/png": "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\n",
44
+ "text/plain": [
45
+ "PILImage mode=RGB size=185x123"
46
+ ]
47
+ },
48
+ "execution_count": 7,
49
+ "metadata": {},
50
+ "output_type": "execute_result"
51
+ }
52
+ ],
53
+ "source": [
54
+ "img = PILImage.create('puppy.jpeg')\n",
55
+ "img.thumbnail((192, 192))\n",
56
+ "img "
57
+ ]
58
+ },
59
+ {
60
+ "cell_type": "code",
61
+ "execution_count": 8,
62
+ "id": "686a17b6-a4a0-480e-9f84-0f2c14f47a8c",
63
+ "metadata": {},
64
+ "outputs": [],
65
+ "source": [
66
+ "#|export\n",
67
+ "learn = load_learner('model.pkl')"
68
+ ]
69
+ },
70
+ {
71
+ "cell_type": "code",
72
+ "execution_count": 12,
73
+ "id": "fb6a1c33-de42-44ed-98c6-51b79b7ddd84",
74
+ "metadata": {},
75
+ "outputs": [
76
+ {
77
+ "data": {
78
+ "text/html": [
79
+ "\n",
80
+ "<style>\n",
81
+ " /* Turns off some styling */\n",
82
+ " progress {\n",
83
+ " /* gets rid of default border in Firefox and Opera. */\n",
84
+ " border: none;\n",
85
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
86
+ " background-size: auto;\n",
87
+ " }\n",
88
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
89
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
90
+ " }\n",
91
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
92
+ " background: #F44336;\n",
93
+ " }\n",
94
+ "</style>\n"
95
+ ],
96
+ "text/plain": [
97
+ "<IPython.core.display.HTML object>"
98
+ ]
99
+ },
100
+ "metadata": {},
101
+ "output_type": "display_data"
102
+ },
103
+ {
104
+ "data": {
105
+ "text/html": [],
106
+ "text/plain": [
107
+ "<IPython.core.display.HTML object>"
108
+ ]
109
+ },
110
+ "metadata": {},
111
+ "output_type": "display_data"
112
+ },
113
+ {
114
+ "name": "stdout",
115
+ "output_type": "stream",
116
+ "text": [
117
+ "CPU times: user 1.71 s, sys: 477 ms, total: 2.18 s\n",
118
+ "Wall time: 342 ms\n"
119
+ ]
120
+ },
121
+ {
122
+ "data": {
123
+ "text/plain": [
124
+ "('False', tensor(0), tensor([9.9999e-01, 1.3130e-05]))"
125
+ ]
126
+ },
127
+ "execution_count": 12,
128
+ "metadata": {},
129
+ "output_type": "execute_result"
130
+ }
131
+ ],
132
+ "source": [
133
+ "%time learn.predict(img)"
134
+ ]
135
+ },
136
+ {
137
+ "cell_type": "code",
138
+ "execution_count": 11,
139
+ "id": "0cf1d03f-30b7-4451-9a21-f01943afa7c5",
140
+ "metadata": {},
141
+ "outputs": [],
142
+ "source": [
143
+ "#|export\n",
144
+ "categories = ('Dog', 'Cat')\n",
145
+ "\n",
146
+ "def classify_image(img):\n",
147
+ " pred,pred_idx,probs = learn.predict(img)\n",
148
+ " return dict(zip(categories, map(float, probs)))\n",
149
+ " # return {labels[i]: float(probs[i]) for i in range(len(labels))}"
150
+ ]
151
+ },
152
+ {
153
+ "cell_type": "code",
154
+ "execution_count": 13,
155
+ "id": "4a7dcc01-6fe8-421e-8896-6ba8e286a13c",
156
+ "metadata": {},
157
+ "outputs": [
158
+ {
159
+ "data": {
160
+ "text/html": [
161
+ "\n",
162
+ "<style>\n",
163
+ " /* Turns off some styling */\n",
164
+ " progress {\n",
165
+ " /* gets rid of default border in Firefox and Opera. */\n",
166
+ " border: none;\n",
167
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
168
+ " background-size: auto;\n",
169
+ " }\n",
170
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
171
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
172
+ " }\n",
173
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
174
+ " background: #F44336;\n",
175
+ " }\n",
176
+ "</style>\n"
177
+ ],
178
+ "text/plain": [
179
+ "<IPython.core.display.HTML object>"
180
+ ]
181
+ },
182
+ "metadata": {},
183
+ "output_type": "display_data"
184
+ },
185
+ {
186
+ "data": {
187
+ "text/html": [],
188
+ "text/plain": [
189
+ "<IPython.core.display.HTML object>"
190
+ ]
191
+ },
192
+ "metadata": {},
193
+ "output_type": "display_data"
194
+ },
195
+ {
196
+ "data": {
197
+ "text/plain": [
198
+ "{'Dog': 0.9999868869781494, 'Cat': 1.3129938452038914e-05}"
199
+ ]
200
+ },
201
+ "execution_count": 13,
202
+ "metadata": {},
203
+ "output_type": "execute_result"
204
+ }
205
+ ],
206
+ "source": [
207
+ "classify_image(img)"
208
+ ]
209
+ },
210
+ {
211
+ "cell_type": "code",
212
+ "execution_count": 15,
213
+ "id": "8131d659-f862-4294-b683-c5c9ee1d111d",
214
+ "metadata": {},
215
+ "outputs": [
216
+ {
217
+ "name": "stderr",
218
+ "output_type": "stream",
219
+ "text": [
220
+ "/Users/abrahampelema/anaconda3/lib/python3.10/site-packages/gradio/deprecation.py:40: UserWarning: `enable_queue` is deprecated in `Interface()`, please use it within `launch()` instead.\n",
221
+ " warnings.warn(value)\n"
222
+ ]
223
+ },
224
+ {
225
+ "name": "stdout",
226
+ "output_type": "stream",
227
+ "text": [
228
+ "Running on local URL: http://127.0.0.1:7860\n",
229
+ "\n",
230
+ "To create a public link, set `share=True` in `launch()`.\n"
231
+ ]
232
+ },
233
+ {
234
+ "data": {
235
+ "text/html": [
236
+ "<div><iframe src=\"http://127.0.0.1:7860/\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
237
+ ],
238
+ "text/plain": [
239
+ "<IPython.core.display.HTML object>"
240
+ ]
241
+ },
242
+ "metadata": {},
243
+ "output_type": "display_data"
244
+ },
245
+ {
246
+ "data": {
247
+ "text/plain": []
248
+ },
249
+ "execution_count": 15,
250
+ "metadata": {},
251
+ "output_type": "execute_result"
252
+ },
253
+ {
254
+ "data": {
255
+ "text/html": [
256
+ "\n",
257
+ "<style>\n",
258
+ " /* Turns off some styling */\n",
259
+ " progress {\n",
260
+ " /* gets rid of default border in Firefox and Opera. */\n",
261
+ " border: none;\n",
262
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
263
+ " background-size: auto;\n",
264
+ " }\n",
265
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
266
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
267
+ " }\n",
268
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
269
+ " background: #F44336;\n",
270
+ " }\n",
271
+ "</style>\n"
272
+ ],
273
+ "text/plain": [
274
+ "<IPython.core.display.HTML object>"
275
+ ]
276
+ },
277
+ "metadata": {},
278
+ "output_type": "display_data"
279
+ },
280
+ {
281
+ "data": {
282
+ "text/html": [],
283
+ "text/plain": [
284
+ "<IPython.core.display.HTML object>"
285
+ ]
286
+ },
287
+ "metadata": {},
288
+ "output_type": "display_data"
289
+ },
290
+ {
291
+ "data": {
292
+ "text/html": [
293
+ "\n",
294
+ "<style>\n",
295
+ " /* Turns off some styling */\n",
296
+ " progress {\n",
297
+ " /* gets rid of default border in Firefox and Opera. */\n",
298
+ " border: none;\n",
299
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
300
+ " background-size: auto;\n",
301
+ " }\n",
302
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
303
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
304
+ " }\n",
305
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
306
+ " background: #F44336;\n",
307
+ " }\n",
308
+ "</style>\n"
309
+ ],
310
+ "text/plain": [
311
+ "<IPython.core.display.HTML object>"
312
+ ]
313
+ },
314
+ "metadata": {},
315
+ "output_type": "display_data"
316
+ },
317
+ {
318
+ "data": {
319
+ "text/html": [],
320
+ "text/plain": [
321
+ "<IPython.core.display.HTML object>"
322
+ ]
323
+ },
324
+ "metadata": {},
325
+ "output_type": "display_data"
326
+ },
327
+ {
328
+ "data": {
329
+ "text/html": [
330
+ "\n",
331
+ "<style>\n",
332
+ " /* Turns off some styling */\n",
333
+ " progress {\n",
334
+ " /* gets rid of default border in Firefox and Opera. */\n",
335
+ " border: none;\n",
336
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
337
+ " background-size: auto;\n",
338
+ " }\n",
339
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
340
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
341
+ " }\n",
342
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
343
+ " background: #F44336;\n",
344
+ " }\n",
345
+ "</style>\n"
346
+ ],
347
+ "text/plain": [
348
+ "<IPython.core.display.HTML object>"
349
+ ]
350
+ },
351
+ "metadata": {},
352
+ "output_type": "display_data"
353
+ },
354
+ {
355
+ "data": {
356
+ "text/html": [],
357
+ "text/plain": [
358
+ "<IPython.core.display.HTML object>"
359
+ ]
360
+ },
361
+ "metadata": {},
362
+ "output_type": "display_data"
363
+ },
364
+ {
365
+ "data": {
366
+ "text/html": [
367
+ "\n",
368
+ "<style>\n",
369
+ " /* Turns off some styling */\n",
370
+ " progress {\n",
371
+ " /* gets rid of default border in Firefox and Opera. */\n",
372
+ " border: none;\n",
373
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
374
+ " background-size: auto;\n",
375
+ " }\n",
376
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
377
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
378
+ " }\n",
379
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
380
+ " background: #F44336;\n",
381
+ " }\n",
382
+ "</style>\n"
383
+ ],
384
+ "text/plain": [
385
+ "<IPython.core.display.HTML object>"
386
+ ]
387
+ },
388
+ "metadata": {},
389
+ "output_type": "display_data"
390
+ },
391
+ {
392
+ "data": {
393
+ "text/html": [],
394
+ "text/plain": [
395
+ "<IPython.core.display.HTML object>"
396
+ ]
397
+ },
398
+ "metadata": {},
399
+ "output_type": "display_data"
400
+ },
401
+ {
402
+ "data": {
403
+ "text/html": [
404
+ "\n",
405
+ "<style>\n",
406
+ " /* Turns off some styling */\n",
407
+ " progress {\n",
408
+ " /* gets rid of default border in Firefox and Opera. */\n",
409
+ " border: none;\n",
410
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
411
+ " background-size: auto;\n",
412
+ " }\n",
413
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
414
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
415
+ " }\n",
416
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
417
+ " background: #F44336;\n",
418
+ " }\n",
419
+ "</style>\n"
420
+ ],
421
+ "text/plain": [
422
+ "<IPython.core.display.HTML object>"
423
+ ]
424
+ },
425
+ "metadata": {},
426
+ "output_type": "display_data"
427
+ },
428
+ {
429
+ "data": {
430
+ "text/html": [],
431
+ "text/plain": [
432
+ "<IPython.core.display.HTML object>"
433
+ ]
434
+ },
435
+ "metadata": {},
436
+ "output_type": "display_data"
437
+ },
438
+ {
439
+ "data": {
440
+ "text/html": [
441
+ "\n",
442
+ "<style>\n",
443
+ " /* Turns off some styling */\n",
444
+ " progress {\n",
445
+ " /* gets rid of default border in Firefox and Opera. */\n",
446
+ " border: none;\n",
447
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
448
+ " background-size: auto;\n",
449
+ " }\n",
450
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
451
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
452
+ " }\n",
453
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
454
+ " background: #F44336;\n",
455
+ " }\n",
456
+ "</style>\n"
457
+ ],
458
+ "text/plain": [
459
+ "<IPython.core.display.HTML object>"
460
+ ]
461
+ },
462
+ "metadata": {},
463
+ "output_type": "display_data"
464
+ },
465
+ {
466
+ "data": {
467
+ "text/html": [],
468
+ "text/plain": [
469
+ "<IPython.core.display.HTML object>"
470
+ ]
471
+ },
472
+ "metadata": {},
473
+ "output_type": "display_data"
474
+ },
475
+ {
476
+ "data": {
477
+ "text/html": [
478
+ "\n",
479
+ "<style>\n",
480
+ " /* Turns off some styling */\n",
481
+ " progress {\n",
482
+ " /* gets rid of default border in Firefox and Opera. */\n",
483
+ " border: none;\n",
484
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
485
+ " background-size: auto;\n",
486
+ " }\n",
487
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
488
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
489
+ " }\n",
490
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
491
+ " background: #F44336;\n",
492
+ " }\n",
493
+ "</style>\n"
494
+ ],
495
+ "text/plain": [
496
+ "<IPython.core.display.HTML object>"
497
+ ]
498
+ },
499
+ "metadata": {},
500
+ "output_type": "display_data"
501
+ },
502
+ {
503
+ "data": {
504
+ "text/html": [],
505
+ "text/plain": [
506
+ "<IPython.core.display.HTML object>"
507
+ ]
508
+ },
509
+ "metadata": {},
510
+ "output_type": "display_data"
511
+ },
512
+ {
513
+ "data": {
514
+ "text/html": [
515
+ "\n",
516
+ "<style>\n",
517
+ " /* Turns off some styling */\n",
518
+ " progress {\n",
519
+ " /* gets rid of default border in Firefox and Opera. */\n",
520
+ " border: none;\n",
521
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
522
+ " background-size: auto;\n",
523
+ " }\n",
524
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
525
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
526
+ " }\n",
527
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
528
+ " background: #F44336;\n",
529
+ " }\n",
530
+ "</style>\n"
531
+ ],
532
+ "text/plain": [
533
+ "<IPython.core.display.HTML object>"
534
+ ]
535
+ },
536
+ "metadata": {},
537
+ "output_type": "display_data"
538
+ },
539
+ {
540
+ "data": {
541
+ "text/html": [],
542
+ "text/plain": [
543
+ "<IPython.core.display.HTML object>"
544
+ ]
545
+ },
546
+ "metadata": {},
547
+ "output_type": "display_data"
548
+ },
549
+ {
550
+ "data": {
551
+ "text/html": [
552
+ "\n",
553
+ "<style>\n",
554
+ " /* Turns off some styling */\n",
555
+ " progress {\n",
556
+ " /* gets rid of default border in Firefox and Opera. */\n",
557
+ " border: none;\n",
558
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
559
+ " background-size: auto;\n",
560
+ " }\n",
561
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
562
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
563
+ " }\n",
564
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
565
+ " background: #F44336;\n",
566
+ " }\n",
567
+ "</style>\n"
568
+ ],
569
+ "text/plain": [
570
+ "<IPython.core.display.HTML object>"
571
+ ]
572
+ },
573
+ "metadata": {},
574
+ "output_type": "display_data"
575
+ },
576
+ {
577
+ "data": {
578
+ "text/html": [],
579
+ "text/plain": [
580
+ "<IPython.core.display.HTML object>"
581
+ ]
582
+ },
583
+ "metadata": {},
584
+ "output_type": "display_data"
585
+ },
586
+ {
587
+ "data": {
588
+ "text/html": [
589
+ "\n",
590
+ "<style>\n",
591
+ " /* Turns off some styling */\n",
592
+ " progress {\n",
593
+ " /* gets rid of default border in Firefox and Opera. */\n",
594
+ " border: none;\n",
595
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
596
+ " background-size: auto;\n",
597
+ " }\n",
598
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
599
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
600
+ " }\n",
601
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
602
+ " background: #F44336;\n",
603
+ " }\n",
604
+ "</style>\n"
605
+ ],
606
+ "text/plain": [
607
+ "<IPython.core.display.HTML object>"
608
+ ]
609
+ },
610
+ "metadata": {},
611
+ "output_type": "display_data"
612
+ },
613
+ {
614
+ "data": {
615
+ "text/html": [],
616
+ "text/plain": [
617
+ "<IPython.core.display.HTML object>"
618
+ ]
619
+ },
620
+ "metadata": {},
621
+ "output_type": "display_data"
622
+ },
623
+ {
624
+ "data": {
625
+ "text/html": [
626
+ "\n",
627
+ "<style>\n",
628
+ " /* Turns off some styling */\n",
629
+ " progress {\n",
630
+ " /* gets rid of default border in Firefox and Opera. */\n",
631
+ " border: none;\n",
632
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
633
+ " background-size: auto;\n",
634
+ " }\n",
635
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
636
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
637
+ " }\n",
638
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
639
+ " background: #F44336;\n",
640
+ " }\n",
641
+ "</style>\n"
642
+ ],
643
+ "text/plain": [
644
+ "<IPython.core.display.HTML object>"
645
+ ]
646
+ },
647
+ "metadata": {},
648
+ "output_type": "display_data"
649
+ },
650
+ {
651
+ "data": {
652
+ "text/html": [],
653
+ "text/plain": [
654
+ "<IPython.core.display.HTML object>"
655
+ ]
656
+ },
657
+ "metadata": {},
658
+ "output_type": "display_data"
659
+ },
660
+ {
661
+ "data": {
662
+ "text/html": [
663
+ "\n",
664
+ "<style>\n",
665
+ " /* Turns off some styling */\n",
666
+ " progress {\n",
667
+ " /* gets rid of default border in Firefox and Opera. */\n",
668
+ " border: none;\n",
669
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
670
+ " background-size: auto;\n",
671
+ " }\n",
672
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
673
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
674
+ " }\n",
675
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
676
+ " background: #F44336;\n",
677
+ " }\n",
678
+ "</style>\n"
679
+ ],
680
+ "text/plain": [
681
+ "<IPython.core.display.HTML object>"
682
+ ]
683
+ },
684
+ "metadata": {},
685
+ "output_type": "display_data"
686
+ },
687
+ {
688
+ "data": {
689
+ "text/html": [],
690
+ "text/plain": [
691
+ "<IPython.core.display.HTML object>"
692
+ ]
693
+ },
694
+ "metadata": {},
695
+ "output_type": "display_data"
696
+ },
697
+ {
698
+ "data": {
699
+ "text/html": [
700
+ "\n",
701
+ "<style>\n",
702
+ " /* Turns off some styling */\n",
703
+ " progress {\n",
704
+ " /* gets rid of default border in Firefox and Opera. */\n",
705
+ " border: none;\n",
706
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
707
+ " background-size: auto;\n",
708
+ " }\n",
709
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
710
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
711
+ " }\n",
712
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
713
+ " background: #F44336;\n",
714
+ " }\n",
715
+ "</style>\n"
716
+ ],
717
+ "text/plain": [
718
+ "<IPython.core.display.HTML object>"
719
+ ]
720
+ },
721
+ "metadata": {},
722
+ "output_type": "display_data"
723
+ },
724
+ {
725
+ "data": {
726
+ "text/html": [],
727
+ "text/plain": [
728
+ "<IPython.core.display.HTML object>"
729
+ ]
730
+ },
731
+ "metadata": {},
732
+ "output_type": "display_data"
733
+ },
734
+ {
735
+ "data": {
736
+ "text/html": [
737
+ "\n",
738
+ "<style>\n",
739
+ " /* Turns off some styling */\n",
740
+ " progress {\n",
741
+ " /* gets rid of default border in Firefox and Opera. */\n",
742
+ " border: none;\n",
743
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
744
+ " background-size: auto;\n",
745
+ " }\n",
746
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
747
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
748
+ " }\n",
749
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
750
+ " background: #F44336;\n",
751
+ " }\n",
752
+ "</style>\n"
753
+ ],
754
+ "text/plain": [
755
+ "<IPython.core.display.HTML object>"
756
+ ]
757
+ },
758
+ "metadata": {},
759
+ "output_type": "display_data"
760
+ },
761
+ {
762
+ "data": {
763
+ "text/html": [],
764
+ "text/plain": [
765
+ "<IPython.core.display.HTML object>"
766
+ ]
767
+ },
768
+ "metadata": {},
769
+ "output_type": "display_data"
770
+ },
771
+ {
772
+ "data": {
773
+ "text/html": [
774
+ "\n",
775
+ "<style>\n",
776
+ " /* Turns off some styling */\n",
777
+ " progress {\n",
778
+ " /* gets rid of default border in Firefox and Opera. */\n",
779
+ " border: none;\n",
780
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
781
+ " background-size: auto;\n",
782
+ " }\n",
783
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
784
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
785
+ " }\n",
786
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
787
+ " background: #F44336;\n",
788
+ " }\n",
789
+ "</style>\n"
790
+ ],
791
+ "text/plain": [
792
+ "<IPython.core.display.HTML object>"
793
+ ]
794
+ },
795
+ "metadata": {},
796
+ "output_type": "display_data"
797
+ },
798
+ {
799
+ "data": {
800
+ "text/html": [],
801
+ "text/plain": [
802
+ "<IPython.core.display.HTML object>"
803
+ ]
804
+ },
805
+ "metadata": {},
806
+ "output_type": "display_data"
807
+ },
808
+ {
809
+ "data": {
810
+ "text/html": [
811
+ "\n",
812
+ "<style>\n",
813
+ " /* Turns off some styling */\n",
814
+ " progress {\n",
815
+ " /* gets rid of default border in Firefox and Opera. */\n",
816
+ " border: none;\n",
817
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
818
+ " background-size: auto;\n",
819
+ " }\n",
820
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
821
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
822
+ " }\n",
823
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
824
+ " background: #F44336;\n",
825
+ " }\n",
826
+ "</style>\n"
827
+ ],
828
+ "text/plain": [
829
+ "<IPython.core.display.HTML object>"
830
+ ]
831
+ },
832
+ "metadata": {},
833
+ "output_type": "display_data"
834
+ },
835
+ {
836
+ "data": {
837
+ "text/html": [],
838
+ "text/plain": [
839
+ "<IPython.core.display.HTML object>"
840
+ ]
841
+ },
842
+ "metadata": {},
843
+ "output_type": "display_data"
844
+ }
845
+ ],
846
+ "source": [
847
+ "#|export\n",
848
+ "image = gr.inputs.Image(shape=(512, 512))\n",
849
+ "label = outputs=gr.outputs.Label()\n",
850
+ "examples = ['puppy.jpeg']\n",
851
+ "\n",
852
+ "title = \"Dog vs Cat Classifier\"\n",
853
+ "description = \"A Dog vs Cat classifier trained on the Oxford Pets dataset with fastai.\"\n",
854
+ "article=\"<p style='text-align: center'><a href='https://sirgil.org' target='_blank'>Sirgil Home</a></p>\"\n",
855
+ "interpretation='default'\n",
856
+ "enable_queue=True\n",
857
+ "\n",
858
+ "gr.Interface(fn=classify_image,inputs=image,outputs=label,title=title,description=description,article=article,examples=examples,interpretation=interpretation,enable_queue=enable_queue).launch()\n"
859
+ ]
860
+ },
861
+ {
862
+ "cell_type": "markdown",
863
+ "id": "c623df24-4e7d-46ff-a000-8c3bdd38aba9",
864
+ "metadata": {},
865
+ "source": [
866
+ "## Export"
867
+ ]
868
+ },
869
+ {
870
+ "cell_type": "code",
871
+ "execution_count": 19,
872
+ "id": "6408f105-dba8-4250-a92f-bcba29792d08",
873
+ "metadata": {},
874
+ "outputs": [
875
+ {
876
+ "ename": "ImportError",
877
+ "evalue": "cannot import name 'notebook2script' from 'nbdev.export' (/Users/abrahampelema/anaconda3/lib/python3.10/site-packages/nbdev/export.py)",
878
+ "output_type": "error",
879
+ "traceback": [
880
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
881
+ "\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)",
882
+ "Cell \u001b[0;32mIn[19], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnbdev\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mexport\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m notebook2script\n\u001b[1;32m 2\u001b[0m notebook2script(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mapp.ipynb\u001b[39m\u001b[38;5;124m'\u001b[39m)\n",
883
+ "\u001b[0;31mImportError\u001b[0m: cannot import name 'notebook2script' from 'nbdev.export' (/Users/abrahampelema/anaconda3/lib/python3.10/site-packages/nbdev/export.py)"
884
+ ]
885
+ }
886
+ ],
887
+ "source": [
888
+ "from nbdev.export import notebook2script\n",
889
+ "notebook2script('app.ipynb')"
890
+ ]
891
+ },
892
+ {
893
+ "cell_type": "code",
894
+ "execution_count": null,
895
+ "id": "1eab9693-12e7-416f-ac26-bf3945c86e1d",
896
+ "metadata": {},
897
+ "outputs": [],
898
+ "source": []
899
+ }
900
+ ],
901
+ "metadata": {
902
+ "kernelspec": {
903
+ "display_name": "Python 3 (ipykernel)",
904
+ "language": "python",
905
+ "name": "python3"
906
+ },
907
+ "language_info": {
908
+ "codemirror_mode": {
909
+ "name": "ipython",
910
+ "version": 3
911
+ },
912
+ "file_extension": ".py",
913
+ "mimetype": "text/x-python",
914
+ "name": "python",
915
+ "nbconvert_exporter": "python",
916
+ "pygments_lexer": "ipython3",
917
+ "version": "3.10.8"
918
+ }
919
+ },
920
+ "nbformat": 4,
921
+ "nbformat_minor": 5
922
+ }
app.py CHANGED
@@ -1,23 +1,36 @@
 
 
 
 
 
 
 
1
  import gradio as gr
2
  from fastai.vision.all import *
3
- import skimage
4
 
5
  def is_cat(x): return x[0].isupper()
6
 
 
7
  learn = load_learner('model.pkl')
8
 
9
- labels = learn.dls.vocab
10
- def predict(img):
11
- img = PILImage.create(img)
 
12
  pred,pred_idx,probs = learn.predict(img)
13
- return {labels[i]: float(probs[i]) for i in range(len(labels))}
 
14
 
 
 
 
 
15
 
16
  title = "Dog vs Cat Classifier"
17
  description = "A Dog vs Cat classifier trained on the Oxford Pets dataset with fastai."
18
  article="<p style='text-align: center'><a href='https://sirgil.org' target='_blank'>Sirgil Home</a></p>"
19
- examples = ['puppy.jpeg']
20
  interpretation='default'
21
  enable_queue=True
22
 
23
- gr.Interface(fn=predict,inputs=gr.inputs.Image(shape=(512, 512)),outputs=gr.outputs.Label(num_top_classes=3),title=title,description=description,article=article,examples=examples,interpretation=interpretation,enable_queue=enable_queue).launch()
 
 
1
+ # AUTOGENERATED! DO NOT EDIT! File to edit: app.ipynb.
2
+
3
+ # %% auto 0
4
+ __all__ = ['learn', 'categories', 'image', 'label', 'outputs', 'examples', 'title', 'description', 'article', 'interpretation',
5
+ 'enable_queue', 'is_cat', 'classify_image']
6
+
7
+ # %% app.ipynb 2
8
  import gradio as gr
9
  from fastai.vision.all import *
 
10
 
11
  def is_cat(x): return x[0].isupper()
12
 
13
+ # %% app.ipynb 4
14
  learn = load_learner('model.pkl')
15
 
16
+ # %% app.ipynb 6
17
+ categories = ('Dog', 'Cat')
18
+
19
+ def classify_image(img):
20
  pred,pred_idx,probs = learn.predict(img)
21
+ return dict(zip(categories, map(float, probs)))
22
+ # return {labels[i]: float(probs[i]) for i in range(len(labels))}
23
 
24
+ # %% app.ipynb 8
25
+ image = gr.inputs.Image(shape=(512, 512))
26
+ label = outputs=gr.outputs.Label()
27
+ examples = ['puppy.jpeg']
28
 
29
  title = "Dog vs Cat Classifier"
30
  description = "A Dog vs Cat classifier trained on the Oxford Pets dataset with fastai."
31
  article="<p style='text-align: center'><a href='https://sirgil.org' target='_blank'>Sirgil Home</a></p>"
 
32
  interpretation='default'
33
  enable_queue=True
34
 
35
+ gr.Interface(fn=classify_image,inputs=image,outputs=label,title=title,description=description,article=article,examples=examples,interpretation=interpretation,enable_queue=enable_queue).launch()
36
+
app_2.py ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from fastai.vision.all import *
3
+ import skimage
4
+
5
+ def is_cat(x): return x[0].isupper()
6
+
7
+ learn = load_learner('model.pkl')
8
+
9
+ labels = learn.dls.vocab
10
+ def predict(img):
11
+ img = PILImage.create(img)
12
+ pred,pred_idx,probs = learn.predict(img)
13
+ return {labels[i]: float(probs[i]) for i in range(len(labels))}
14
+
15
+
16
+ title = "Dog vs Cat Classifier"
17
+ description = "A Dog vs Cat classifier trained on the Oxford Pets dataset with fastai."
18
+ article="<p style='text-align: center'><a href='https://sirgil.org' target='_blank'>Sirgil Home</a></p>"
19
+ examples = ['puppy.jpeg']
20
+ interpretation='default'
21
+ enable_queue=True
22
+
23
+ gr.Interface(fn=predict,inputs=gr.inputs.Image(shape=(512, 512)),outputs=gr.outputs.Label(num_top_classes=3),title=title,description=description,article=article,examples=examples,interpretation=interpretation,enable_queue=enable_queue).launch()