Spaces:
Sleeping
Sleeping
Commit
·
5d85dbc
1
Parent(s):
d77ad65
Changed app.py to nb auto generated code
Browse files- .ipynb_checkpoints/app-checkpoint.ipynb +245 -0
- app.ipynb +922 -0
- app.py +20 -7
- 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 |
-
|
10 |
-
|
11 |
-
|
|
|
12 |
pred,pred_idx,probs = learn.predict(img)
|
13 |
-
return
|
|
|
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=
|
|
|
|
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()
|