Spaces:
Sleeping
Sleeping
save
Browse files- .gitignore +1 -0
- 04_increasing_size_resnet.ipynb +84 -67
- 06_inference_and_deployment.ipynb +11 -28
- CNAME +1 -0
- README.md → README.MD +3 -2
- docs/index.html +133 -0
.gitignore
CHANGED
@@ -13,3 +13,4 @@
|
|
13 |
/.idea/misc.xml
|
14 |
/.idea/modules.xml
|
15 |
/.idea/vcs.xml
|
|
|
|
13 |
/.idea/misc.xml
|
14 |
/.idea/modules.xml
|
15 |
/.idea/vcs.xml
|
16 |
+
/models/tmpihzbonsc/_tmp.pth
|
04_increasing_size_resnet.ipynb
CHANGED
@@ -51,7 +51,7 @@
|
|
51 |
},
|
52 |
{
|
53 |
"cell_type": "code",
|
54 |
-
"execution_count":
|
55 |
"metadata": {},
|
56 |
"outputs": [
|
57 |
{
|
@@ -91,19 +91,27 @@
|
|
91 |
"metadata": {},
|
92 |
"output_type": "display_data"
|
93 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
94 |
{
|
95 |
"data": {
|
96 |
"text/plain": [
|
97 |
-
"SuggestedLRs(valley=0.
|
98 |
]
|
99 |
},
|
100 |
-
"execution_count":
|
101 |
"metadata": {},
|
102 |
"output_type": "execute_result"
|
103 |
},
|
104 |
{
|
105 |
"data": {
|
106 |
-
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAG1CAYAAAARLUsBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAWyJJREFUeJzt3Xd4lfX9//HnOdl7kklI2CuEDYJQUBAUioCzSEWt1WppC/rFn9Jq3YDbtlaLuC0UBRcqioggIiB7Q5ghgSwgZJN1zvn9EXIwshJyTu6TnNfjus5lz537nPM+nyJ5+Zkmm81mQ0RERMSNmI0uQERERKSxKQCJiIiI21EAEhEREbejACQiIiJuRwFIRERE3I4CkIiIiLgdBSARERFxOwpAIiIi4nY8jS6gsVmtVjIzMwkKCsJkMhldjoiIiNSBzWajqKiIuLg4zOaG99+4XQDKzMwkISHB6DJERETkEmRkZNCyZcsGv4/bBaCgoCCgugGDg4MNrkZERETqorCwkISEBPvv8YZyuwBUM+wVHBysACQiItLEOGr6iiZBi4iIiNtRABIRERG343ZDYCIiIpfKYrFQWVlpdBnNlre3t0NWeNWFApCIiMhF2Gw2srOzyc/PN7qUZs1sNtO6dWu8vb2d/lkKQCIiIhdRE36ioqLw9/fXPnJOULNPX1ZWFq1atXJ6GysAiYiIXIDFYrGHn4iICKPLadZatGhBZmYmVVVVeHl5OfWzNAlaRETkAmrm/Pj7+xtcSfNXM/RlsVic/lkKQCIiInWgYS/na8w2VgASERERt6MAJCIiIm5HAUhERKQxWC1w6AfYvrD6n1bnz3NpqKSkJF5++WX7c5PJxKeffmpYPY6kVWAiIiLOtmsRfP0gFGaeuRYcB1c/A12uNa4uN6YeIAfZmVnAXe9t4P8+3Gp0KSIi4kp2LYIPJ9UOPwCFWdXXdy0ypi43pwDkIFUWG0t35fDDvmNGlyIiIq7Caqnu+cF2jh+evvb1Q04ZDnv99deJi4vDarXWuj527Fh+97vfceDAAcaOHUt0dDSBgYH07duXb7/9tl6fkZGRwU033URoaCjh4eGMHTuWtLQ0AFauXImXlxfZ2dm1XjN16lQGDx7coO/mCApADpIYUb0/RG5ROaUVVQZXIyIiLuHw6rN7fmqxQeHR6vsc7MYbb+TEiRMsX77cfi0vL4+vv/6aiRMnUlxczKhRo1i2bBmbN2/m6quvZsyYMaSnp9fp/SsrKxk5ciRBQUH88MMP/PjjjwQGBnL11VdTUVHBr371K9q0acP7779f6zVz587ld7/7ncO/b30pADlIqL83wb7VU6rS80oNrkZERFxCcY5j76uHsLAwrrnmGubNm2e/tnDhQiIjI7niiivo3r07f/jDH0hOTqZ9+/Y8+eSTtG3blkWL6jYk98EHH2C1WnnjjTfo1q0bnTt35u233yY9PZ0VK1YAcOedd/L222/bX/P5559TVlbGTTfd5NDveikUgBwoMSIAgMMnFIBERAQIjHbsffU0ceJEPvroI8rLywGYO3cuv/nNbzCbzRQXFzNt2jQ6d+5MaGgogYGB7N69u849QFu3bmX//v0EBQURGBhIYGAg4eHhlJWVceDAAQBuv/129u/fz9q1awF45513uOmmmwgICHDK960PrQJzoFYR/mw/WkC6ApCIiAAkDqxe7VWYxbnnAZmqf5440CkfP2bMGGw2G19++SV9+/blhx9+4KWXXgJg2rRpLF26lOeff5527drh5+fHDTfcQEVFRZ3eu7i4mN69ezN37tyzftaiRQsAoqKiGDNmDG+//TatW7fmq6++svcOGc3QHqDHHnsMk8lU69GpU6cLvmbBggV06tQJX19funXrxuLFixup2otLOj0P6HBeicGViIiISzB7VC91B+CXxzycfn71rOr7nMDX15frrruOuXPn8r///Y+OHTvSq1cvAH788Uduv/12xo8fT7du3YiJibFPYK6LXr16sW/fPqKiomjXrl2tR0hIiP2+3//+93zwwQe8/vrrtG3blssvv9zRX/OSGD4E1rVrV7KysuyPVatWnffe1atXM2HCBO688042b97MuHHjGDduHDt27GjEis8vMVxDYCIi8gtdroWb3oPg2NrXg+Oqrzt5H6CJEyfy5Zdf8tZbbzFx4kT79fbt2/Pxxx+zZcsWtm7dyi233HLWirGLvW9kZCRjx47lhx9+4NChQ6xYsYK//OUvHDlyxH7fyJEjCQ4O5qmnnuKOO+5w6HdrCMMDkKenJzExMfZHZGTkee/9xz/+wdVXX80DDzxA586defLJJ+nVqxevvPJKI1Z8fq1qeoAUgERE5Oe6XAtTd8BtX8D1b1b/c+r2RtkE8corryQ8PJzU1FRuueUW+/UXX3yR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Jk3i9ddfd/p3ulSN1RZNkSPapsFsckGA7ZNPPql1rV+/frbJkyfbn1ssFltcXJxt5syZ9Xrv9957zzZx4kRHlNkonNEWq1evto0YMcL+/Nlnn7U9++yzDqnXmZz556LGtGnTbG+//XYDqmwczmiLhx56yNayZUtbYmKiLSIiwhYcHGx7/PHHHVm20zTGn417773XtmDBgoaU2Sic1RZlZWW2wYMH29577z1Hlep0zvxzsXz5ctv111/viDINcSlt8+OPP9rGjRtn//mUKVNsc+fOrdfnqgeonioqKti4cSPDhw+3XzObzQwfPpw1a9bU671cffjrYhzRFn379iU3N5eTJ09itVpZuXIlnTt3dlbJTuOItigpKaGoqAionhz/3Xff0bVrV6fU60yOaIuZM2eSkZFBWloazz//PHfddRd///vfnVWyUzmiPXJycux/NgoKCli5ciUdO3Z0Sr3O5Ii2sNls3H777Vx55ZXceuutzirV6Rz5u6S5qUvb9OvXjx07dnD06FGKi4v56quvGDlyZL0+R7NN6+n48eNYLBaio6NrXY+OjmbPnj11fp+CggLWrVvHRx995OgSG40j2sLT05MZM2bwq1/9CpvNxogRI/j1r3/tjHKdyhFtkZOTw/jx44HqVT933XUXffv2dXitzuaof0eaC0e0x+HDh7n77rvtk5///Oc/061bN2eU61SOaIsff/yRDz74gJSUFPu8kffff7/JtYej/j0ZPnw4W7dupaSkhJYtW7JgwQIGDBjg6HIbVV3axtPTkxdeeIErrrgCq9XK//t//6/eqyIVgAwSEhLismP4je2aa67RSh+gTZs2bN261egyXM7tt99udAmG69evH1u2bDG6DJcwaNAgrFar0WW4jG+//dboEgxz7bXXcu21117y6zUEVk+RkZF4eHicFV5ycnKIiYkxqCpjqC3OUFucobaoTe1xhtriDLXF+TVW2ygA1ZO3tze9e/dm2bJl9mtWq5Vly5Y1+W7H+lJbnKG2OENtUZva4wy1xRlqi/NrrLbRENg5FBcXs3//fvvzQ4cOsWXLFsLDw2nVqhX3338/t912G3369KFfv368/PLLlJSUcMcddxhYtXOoLc5QW5yhtqhN7XGG2uIMtcX5uUTbXNqiteZt+fLlNuCsx2233Wa/51//+petVatWNm9vb1u/fv1sa9euNa5gJ1JbnKG2OENtUZva4wy1xRlqi/NzhbbRWWAiIiLidjQHSERERNyOApCIiIi4HQUgERERcTsKQCIiIuJ2FIBERETE7SgAiYiIiNtRABIRERG3owAkIiIibkcBSESalKSkJF5++WWjyxCRJk4BSETOcvvttzNu3Dijyzin9evXc/fddzv9c5KSkjCZTJhMJvz9/enWrRtvvPFGvd/HZDLx6aefOr5AEWkQBSARcQmVlZV1uq9Fixb4+/s7uZpqTzzxBFlZWezYsYPf/va33HXXXXz11VeN8tki4lwKQCJSbzt27OCaa64hMDCQ6Ohobr31Vo4fP27/+ddff82gQYMIDQ0lIiKCX//61xw4cMD+87S0NEwmEx988AFDhgzB19eXuXPn2nuenn/+eWJjY4mIiGDy5Mm1wtEvh8BMJhNvvPEG48ePx9/fn/bt27No0aJa9S5atIj27dvj6+vLFVdcwbvvvovJZCI/P/+C3zMoKIiYmBjatGnDgw8+SHh4OEuXLrX/fP369Vx11VVERkYSEhLCkCFD2LRpU61aAcaPH4/JZLI/B/jss8/o1asXvr6+tGnThscff5yqqqq6NL+IOIACkIjUS35+PldeeSU9e/Zkw4YNfP311+Tk5HDTTTfZ7ykpKeH+++9nw4YNLFu2DLPZzPjx47FarbXe66GHHmLKlCns3r2bkSNHArB8+XIOHDjA8uXLeffdd3nnnXd45513LljT448/zk033cS2bdsYNWoUEydOJC8vD4BDhw5xww03MG7cOLZu3cof/vAH/va3v9XrO1utVj766CNOnjyJt7e3/XpRURG33XYbq1atYu3atbRv355Ro0ZRVFQEVAckgLfffpusrCz78x9++IFJkyYxZcoUdu3axezZs3nnnXd4+umn61WXiDSAQ8+WF5Fm4bbbbrONHTv2nD978sknbSNGjKh1LSMjwwbYUlNTz/maY8eO2QDb9u3bbTabzXbo0CEbYHv55ZfP+tzExERbVVWV/dqNN95ou/nmm+3PExMTbS+99JL9OWB7+OGH7c+Li4ttgO2rr76y2Ww224MPPmhLTk6u9Tl/+9vfbIDt5MmT526A05/j7e1tCwgIsHl6etoAW3h4uG3fvn3nfY3FYrEFBQXZPv/881r1ffLJJ7XuGzZsmG3GjBm1rr3//vu22NjY8763iDiWeoBEpF62bt3K8uXLCQwMtD86deoEYB/m2rdvHxMmTKBNmzYEBwfbh37S09NrvVefPn3Oev+uXbvi4eFhfx4bG0tubu4Fa0pJSbH/74CAAIKDg+2vSU1NpW/fvrXu79evX52+6wMPPMCWLVv47rvv6N+/Py+99BLt2rWz/zwnJ4e77rqL9u3bExISQnBwMMXFxWd9z1/aunUrTzzxRK02vOuuu8jKyqK0tLROtYlIw3gaXYCINC3FxcWMGTOGZ5555qyfxcbGAjBmzBgSExOZM2cOcXFxWK1WkpOTqaioqHV/QEDAWe/h5eVV67nJZDpr6MwRr6mLyMhI2rVrR7t27ViwYAHdunWjT58+dOnSBYDbbruNEydO8I9//IPExER8fHwYMGDAWd/zl4qLi3n88ce57rrrzvqZr69vg+sWkYtTABKReunVqxcfffQRSUlJeHqe/VfIiRMnSE1NZc6cOQwePBiAVatWNXaZdh07dmTx4sW1rtXMxamPhIQEbr75ZqZPn85nn30GwI8//sirr77KqFGjAMjIyKg1GRyqw5nFYql1rVevXqSmptbqTRKRxqUhMBE5p4KCArZs2VLrkZGRweTJk8nLy2PChAmsX7+eAwcOsGTJEu644w4sFgthYWFERETw+uuvs3//fr777jvuv/9+w77HH/7wB/bs2cODDz7I3r17+fDDD+2Tqk0mU73ea8qUKXz++eds2LABgPbt2/P++++ze/dufvrpJyZOnIifn1+t1yQlJbFs2TKys7M5efIkAH//+9957733ePzxx9m5cye7d+9m/vz5PPzwww3/wiJSJwpAInJOK1asoGfPnrUejz/+OHFxcfz4449YLBZGjBhBt27dmDp1KqGhoZjNZsxmM/Pnz2fjxo0kJydz33338dxzzxn2PVq3bs3ChQv5+OOPSUlJ4bXXXrOvAvPx8anXe3Xp0oURI0bw97//HYA333yTkydP0qtXL2699Vb+8pe/EBUVVes1L7zwAkuXLiUhIYGePXsCMHLkSL744gu++eYb+vbty2WXXcZLL71EYmKiA76xiNSFyWaz2YwuQkSkMT399NP85z//ISMjw+hSRMQgmgMkIs3eq6++St++fYmIiODHH3/kueee409/+pPRZYmIgRSARKTZ27dvH0899RR5eXm0atWK//u//2P69OlGlyUiBtIQmIiIiLgdTYIWERERt6MAJCIiIm5HAUhERETcjgKQiIiIuB0FIBEREXE7CkAiIiLidhSARERExO0oAImIiIjbUQASERERt/P/AXc5ua+1yW1OAAAAAElFTkSuQmCC",
|
107 |
"text/plain": [
|
108 |
"<Figure size 640x480 with 1 Axes>"
|
109 |
]
|
@@ -135,7 +143,7 @@
|
|
135 |
},
|
136 |
{
|
137 |
"cell_type": "code",
|
138 |
-
"execution_count":
|
139 |
"metadata": {},
|
140 |
"outputs": [
|
141 |
{
|
@@ -181,10 +189,10 @@
|
|
181 |
" <tbody>\n",
|
182 |
" <tr>\n",
|
183 |
" <td>0</td>\n",
|
184 |
-
" <td>4.
|
185 |
-
" <td>
|
186 |
-
" <td>0.
|
187 |
-
" <td>00:
|
188 |
" </tr>\n",
|
189 |
" </tbody>\n",
|
190 |
"</table>"
|
@@ -239,142 +247,142 @@
|
|
239 |
" <tbody>\n",
|
240 |
" <tr>\n",
|
241 |
" <td>0</td>\n",
|
242 |
-
" <td>
|
243 |
-
" <td>2.
|
244 |
-
" <td>0.
|
245 |
" <td>00:03</td>\n",
|
246 |
" </tr>\n",
|
247 |
" <tr>\n",
|
248 |
" <td>1</td>\n",
|
249 |
-
" <td>3.
|
250 |
-
" <td>2.
|
251 |
-
" <td>0.
|
252 |
" <td>00:03</td>\n",
|
253 |
" </tr>\n",
|
254 |
" <tr>\n",
|
255 |
" <td>2</td>\n",
|
256 |
-
" <td>3.
|
257 |
-
" <td>
|
258 |
-
" <td>0.
|
259 |
" <td>00:03</td>\n",
|
260 |
" </tr>\n",
|
261 |
" <tr>\n",
|
262 |
" <td>3</td>\n",
|
263 |
-
" <td>
|
264 |
-
" <td>1.
|
265 |
-
" <td>0.
|
266 |
" <td>00:03</td>\n",
|
267 |
" </tr>\n",
|
268 |
" <tr>\n",
|
269 |
" <td>4</td>\n",
|
270 |
-
" <td>
|
271 |
-
" <td>1.
|
272 |
-
" <td>0.
|
273 |
" <td>00:03</td>\n",
|
274 |
" </tr>\n",
|
275 |
" <tr>\n",
|
276 |
" <td>5</td>\n",
|
277 |
-
" <td>2.
|
278 |
-
" <td>1.
|
279 |
-
" <td>0.
|
280 |
" <td>00:03</td>\n",
|
281 |
" </tr>\n",
|
282 |
" <tr>\n",
|
283 |
" <td>6</td>\n",
|
284 |
-
" <td>2.
|
285 |
-
" <td>
|
286 |
-
" <td>0.
|
287 |
" <td>00:03</td>\n",
|
288 |
" </tr>\n",
|
289 |
" <tr>\n",
|
290 |
" <td>7</td>\n",
|
291 |
-
" <td>
|
292 |
-
" <td>
|
293 |
-
" <td>0.
|
294 |
" <td>00:03</td>\n",
|
295 |
" </tr>\n",
|
296 |
" <tr>\n",
|
297 |
" <td>8</td>\n",
|
298 |
-
" <td>
|
299 |
-
" <td>
|
300 |
-
" <td>0.
|
301 |
" <td>00:03</td>\n",
|
302 |
" </tr>\n",
|
303 |
" <tr>\n",
|
304 |
" <td>9</td>\n",
|
305 |
-
" <td>
|
306 |
-
" <td>0.
|
307 |
-
" <td>0.
|
308 |
" <td>00:03</td>\n",
|
309 |
" </tr>\n",
|
310 |
" <tr>\n",
|
311 |
" <td>10</td>\n",
|
312 |
-
" <td>1.
|
313 |
-
" <td>0.
|
314 |
-
" <td>0.
|
315 |
" <td>00:03</td>\n",
|
316 |
" </tr>\n",
|
317 |
" <tr>\n",
|
318 |
" <td>11</td>\n",
|
319 |
-
" <td>1.
|
320 |
-
" <td>0.
|
321 |
-
" <td>0.
|
322 |
" <td>00:03</td>\n",
|
323 |
" </tr>\n",
|
324 |
" <tr>\n",
|
325 |
" <td>12</td>\n",
|
326 |
-
" <td>1.
|
327 |
-
" <td>0.
|
328 |
-
" <td>0.
|
329 |
" <td>00:03</td>\n",
|
330 |
" </tr>\n",
|
331 |
" <tr>\n",
|
332 |
" <td>13</td>\n",
|
333 |
-
" <td>1.
|
334 |
-
" <td>0.
|
335 |
-
" <td>0.
|
336 |
" <td>00:03</td>\n",
|
337 |
" </tr>\n",
|
338 |
" <tr>\n",
|
339 |
" <td>14</td>\n",
|
340 |
-
" <td>
|
341 |
-
" <td>0.
|
342 |
-
" <td>0.
|
343 |
" <td>00:03</td>\n",
|
344 |
" </tr>\n",
|
345 |
" <tr>\n",
|
346 |
" <td>15</td>\n",
|
347 |
-
" <td>
|
348 |
-
" <td>0.
|
349 |
-
" <td>0.
|
350 |
" <td>00:03</td>\n",
|
351 |
" </tr>\n",
|
352 |
" <tr>\n",
|
353 |
" <td>16</td>\n",
|
354 |
-
" <td>
|
355 |
-
" <td>0.
|
356 |
" <td>0.795122</td>\n",
|
357 |
" <td>00:03</td>\n",
|
358 |
" </tr>\n",
|
359 |
" <tr>\n",
|
360 |
" <td>17</td>\n",
|
361 |
-
" <td>
|
362 |
-
" <td>0.
|
363 |
" <td>0.795122</td>\n",
|
364 |
" <td>00:03</td>\n",
|
365 |
" </tr>\n",
|
366 |
" <tr>\n",
|
367 |
" <td>18</td>\n",
|
368 |
-
" <td>
|
369 |
-
" <td>0.
|
370 |
" <td>0.800000</td>\n",
|
371 |
" <td>00:03</td>\n",
|
372 |
" </tr>\n",
|
373 |
" <tr>\n",
|
374 |
" <td>19</td>\n",
|
375 |
-
" <td>
|
376 |
-
" <td>0.
|
377 |
-
" <td>0.
|
378 |
" <td>00:03</td>\n",
|
379 |
" </tr>\n",
|
380 |
" </tbody>\n",
|
@@ -389,7 +397,16 @@
|
|
389 |
}
|
390 |
],
|
391 |
"source": [
|
392 |
-
"learn_better.fine_tune(20,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
393 |
]
|
394 |
},
|
395 |
{
|
|
|
51 |
},
|
52 |
{
|
53 |
"cell_type": "code",
|
54 |
+
"execution_count": 4,
|
55 |
"metadata": {},
|
56 |
"outputs": [
|
57 |
{
|
|
|
91 |
"metadata": {},
|
92 |
"output_type": "display_data"
|
93 |
},
|
94 |
+
{
|
95 |
+
"name": "stderr",
|
96 |
+
"output_type": "stream",
|
97 |
+
"text": [
|
98 |
+
"/home/dominik/Documents/code/fastai/fastbook/.venv/lib/python3.12/site-packages/fastai/learner.py:53: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.\n",
|
99 |
+
" state = torch.load(file, map_location=device, **torch_load_kwargs)\n"
|
100 |
+
]
|
101 |
+
},
|
102 |
{
|
103 |
"data": {
|
104 |
"text/plain": [
|
105 |
+
"SuggestedLRs(valley=0.0008317637839354575)"
|
106 |
]
|
107 |
},
|
108 |
+
"execution_count": 4,
|
109 |
"metadata": {},
|
110 |
"output_type": "execute_result"
|
111 |
},
|
112 |
{
|
113 |
"data": {
|
114 |
+
"image/png": "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",
|
115 |
"text/plain": [
|
116 |
"<Figure size 640x480 with 1 Axes>"
|
117 |
]
|
|
|
143 |
},
|
144 |
{
|
145 |
"cell_type": "code",
|
146 |
+
"execution_count": 5,
|
147 |
"metadata": {},
|
148 |
"outputs": [
|
149 |
{
|
|
|
189 |
" <tbody>\n",
|
190 |
" <tr>\n",
|
191 |
" <td>0</td>\n",
|
192 |
+
" <td>4.542337</td>\n",
|
193 |
+
" <td>3.085513</td>\n",
|
194 |
+
" <td>0.146341</td>\n",
|
195 |
+
" <td>00:02</td>\n",
|
196 |
" </tr>\n",
|
197 |
" </tbody>\n",
|
198 |
"</table>"
|
|
|
247 |
" <tbody>\n",
|
248 |
" <tr>\n",
|
249 |
" <td>0</td>\n",
|
250 |
+
" <td>4.000002</td>\n",
|
251 |
+
" <td>2.851287</td>\n",
|
252 |
+
" <td>0.180488</td>\n",
|
253 |
" <td>00:03</td>\n",
|
254 |
" </tr>\n",
|
255 |
" <tr>\n",
|
256 |
" <td>1</td>\n",
|
257 |
+
" <td>3.854214</td>\n",
|
258 |
+
" <td>2.640312</td>\n",
|
259 |
+
" <td>0.214634</td>\n",
|
260 |
" <td>00:03</td>\n",
|
261 |
" </tr>\n",
|
262 |
" <tr>\n",
|
263 |
" <td>2</td>\n",
|
264 |
+
" <td>3.678350</td>\n",
|
265 |
+
" <td>2.329466</td>\n",
|
266 |
+
" <td>0.321951</td>\n",
|
267 |
" <td>00:03</td>\n",
|
268 |
" </tr>\n",
|
269 |
" <tr>\n",
|
270 |
" <td>3</td>\n",
|
271 |
+
" <td>3.460999</td>\n",
|
272 |
+
" <td>1.959772</td>\n",
|
273 |
+
" <td>0.409756</td>\n",
|
274 |
" <td>00:03</td>\n",
|
275 |
" </tr>\n",
|
276 |
" <tr>\n",
|
277 |
" <td>4</td>\n",
|
278 |
+
" <td>3.187331</td>\n",
|
279 |
+
" <td>1.625292</td>\n",
|
280 |
+
" <td>0.536585</td>\n",
|
281 |
" <td>00:03</td>\n",
|
282 |
" </tr>\n",
|
283 |
" <tr>\n",
|
284 |
" <td>5</td>\n",
|
285 |
+
" <td>2.932109</td>\n",
|
286 |
+
" <td>1.408548</td>\n",
|
287 |
+
" <td>0.604878</td>\n",
|
288 |
" <td>00:03</td>\n",
|
289 |
" </tr>\n",
|
290 |
" <tr>\n",
|
291 |
" <td>6</td>\n",
|
292 |
+
" <td>2.674737</td>\n",
|
293 |
+
" <td>1.244989</td>\n",
|
294 |
+
" <td>0.668293</td>\n",
|
295 |
" <td>00:03</td>\n",
|
296 |
" </tr>\n",
|
297 |
" <tr>\n",
|
298 |
" <td>7</td>\n",
|
299 |
+
" <td>2.424846</td>\n",
|
300 |
+
" <td>1.146155</td>\n",
|
301 |
+
" <td>0.663415</td>\n",
|
302 |
" <td>00:03</td>\n",
|
303 |
" </tr>\n",
|
304 |
" <tr>\n",
|
305 |
" <td>8</td>\n",
|
306 |
+
" <td>2.201131</td>\n",
|
307 |
+
" <td>1.025524</td>\n",
|
308 |
+
" <td>0.707317</td>\n",
|
309 |
" <td>00:03</td>\n",
|
310 |
" </tr>\n",
|
311 |
" <tr>\n",
|
312 |
" <td>9</td>\n",
|
313 |
+
" <td>2.034413</td>\n",
|
314 |
+
" <td>0.931238</td>\n",
|
315 |
+
" <td>0.726829</td>\n",
|
316 |
" <td>00:03</td>\n",
|
317 |
" </tr>\n",
|
318 |
" <tr>\n",
|
319 |
" <td>10</td>\n",
|
320 |
+
" <td>1.865840</td>\n",
|
321 |
+
" <td>0.851306</td>\n",
|
322 |
+
" <td>0.756098</td>\n",
|
323 |
" <td>00:03</td>\n",
|
324 |
" </tr>\n",
|
325 |
" <tr>\n",
|
326 |
" <td>11</td>\n",
|
327 |
+
" <td>1.716559</td>\n",
|
328 |
+
" <td>0.824157</td>\n",
|
329 |
+
" <td>0.741463</td>\n",
|
330 |
" <td>00:03</td>\n",
|
331 |
" </tr>\n",
|
332 |
" <tr>\n",
|
333 |
" <td>12</td>\n",
|
334 |
+
" <td>1.578321</td>\n",
|
335 |
+
" <td>0.804028</td>\n",
|
336 |
+
" <td>0.770732</td>\n",
|
337 |
" <td>00:03</td>\n",
|
338 |
" </tr>\n",
|
339 |
" <tr>\n",
|
340 |
" <td>13</td>\n",
|
341 |
+
" <td>1.461851</td>\n",
|
342 |
+
" <td>0.793212</td>\n",
|
343 |
+
" <td>0.775610</td>\n",
|
344 |
" <td>00:03</td>\n",
|
345 |
" </tr>\n",
|
346 |
" <tr>\n",
|
347 |
" <td>14</td>\n",
|
348 |
+
" <td>1.359122</td>\n",
|
349 |
+
" <td>0.781659</td>\n",
|
350 |
+
" <td>0.795122</td>\n",
|
351 |
" <td>00:03</td>\n",
|
352 |
" </tr>\n",
|
353 |
" <tr>\n",
|
354 |
" <td>15</td>\n",
|
355 |
+
" <td>1.279223</td>\n",
|
356 |
+
" <td>0.774161</td>\n",
|
357 |
+
" <td>0.795122</td>\n",
|
358 |
" <td>00:03</td>\n",
|
359 |
" </tr>\n",
|
360 |
" <tr>\n",
|
361 |
" <td>16</td>\n",
|
362 |
+
" <td>1.229434</td>\n",
|
363 |
+
" <td>0.775929</td>\n",
|
364 |
" <td>0.795122</td>\n",
|
365 |
" <td>00:03</td>\n",
|
366 |
" </tr>\n",
|
367 |
" <tr>\n",
|
368 |
" <td>17</td>\n",
|
369 |
+
" <td>1.166556</td>\n",
|
370 |
+
" <td>0.768999</td>\n",
|
371 |
" <td>0.795122</td>\n",
|
372 |
" <td>00:03</td>\n",
|
373 |
" </tr>\n",
|
374 |
" <tr>\n",
|
375 |
" <td>18</td>\n",
|
376 |
+
" <td>1.123601</td>\n",
|
377 |
+
" <td>0.767946</td>\n",
|
378 |
" <td>0.800000</td>\n",
|
379 |
" <td>00:03</td>\n",
|
380 |
" </tr>\n",
|
381 |
" <tr>\n",
|
382 |
" <td>19</td>\n",
|
383 |
+
" <td>1.104936</td>\n",
|
384 |
+
" <td>0.771056</td>\n",
|
385 |
+
" <td>0.790244</td>\n",
|
386 |
" <td>00:03</td>\n",
|
387 |
" </tr>\n",
|
388 |
" </tbody>\n",
|
|
|
397 |
}
|
398 |
],
|
399 |
"source": [
|
400 |
+
"learn_better.fine_tune(20, 8.3e-4)"
|
401 |
+
]
|
402 |
+
},
|
403 |
+
{
|
404 |
+
"cell_type": "code",
|
405 |
+
"execution_count": 6,
|
406 |
+
"metadata": {},
|
407 |
+
"outputs": [],
|
408 |
+
"source": [
|
409 |
+
"learn_better.export('resnet.pkl')"
|
410 |
]
|
411 |
},
|
412 |
{
|
06_inference_and_deployment.ipynb
CHANGED
@@ -22,16 +22,16 @@
|
|
22 |
},
|
23 |
{
|
24 |
"cell_type": "code",
|
25 |
-
"execution_count":
|
26 |
"metadata": {},
|
27 |
"outputs": [],
|
28 |
"source": [
|
29 |
"from fastai.learner import load_learner\n",
|
30 |
"\n",
|
31 |
"# Load the FastAI Learner\n",
|
32 |
-
"learn_inf_tiny = load_learner(\"tiny.pkl\")\n",
|
33 |
-
"learn_inf_base= load_learner(\"
|
34 |
-
"learn_inf_resnet = load_learner(\"resnet.pkl\")"
|
35 |
]
|
36 |
},
|
37 |
{
|
@@ -257,23 +257,6 @@
|
|
257 |
"Due to different preprocessing in fast.ai and the manual preprocessing there can be some differences.\n"
|
258 |
]
|
259 |
},
|
260 |
-
{
|
261 |
-
"cell_type": "code",
|
262 |
-
"execution_count": 178,
|
263 |
-
"metadata": {},
|
264 |
-
"outputs": [
|
265 |
-
{
|
266 |
-
"name": "stdout",
|
267 |
-
"output_type": "stream",
|
268 |
-
"text": [
|
269 |
-
"torch.Size([32, 3, 224, 224])\n"
|
270 |
-
]
|
271 |
-
}
|
272 |
-
],
|
273 |
-
"source": [
|
274 |
-
"print(learn_convnext_tiny.dls.one_batch()[0].shape) # Get input shape from DataLoader\n"
|
275 |
-
]
|
276 |
-
},
|
277 |
{
|
278 |
"cell_type": "code",
|
279 |
"execution_count": 1,
|
@@ -298,7 +281,7 @@
|
|
298 |
},
|
299 |
{
|
300 |
"cell_type": "code",
|
301 |
-
"execution_count":
|
302 |
"metadata": {},
|
303 |
"outputs": [],
|
304 |
"source": [
|
@@ -307,12 +290,12 @@
|
|
307 |
},
|
308 |
{
|
309 |
"cell_type": "code",
|
310 |
-
"execution_count":
|
311 |
"metadata": {},
|
312 |
"outputs": [],
|
313 |
"source": [
|
314 |
"model = learn_inf_resnet.model\n",
|
315 |
-
"dummy_input = torch.randn(1, 3,
|
316 |
"torch.onnx.export(\n",
|
317 |
" model, \n",
|
318 |
" dummy_input, \n",
|
@@ -379,7 +362,7 @@
|
|
379 |
},
|
380 |
{
|
381 |
"cell_type": "code",
|
382 |
-
"execution_count":
|
383 |
"metadata": {},
|
384 |
"outputs": [
|
385 |
{
|
@@ -397,14 +380,14 @@
|
|
397 |
},
|
398 |
{
|
399 |
"cell_type": "code",
|
400 |
-
"execution_count":
|
401 |
"metadata": {},
|
402 |
"outputs": [
|
403 |
{
|
404 |
"name": "stdout",
|
405 |
"output_type": "stream",
|
406 |
"text": [
|
407 |
-
"Predicted Class: Cantal (Confidence: 0.
|
408 |
]
|
409 |
}
|
410 |
],
|
@@ -419,7 +402,7 @@
|
|
419 |
"# Preprocessing function\n",
|
420 |
"def preprocess_image(image_path):\n",
|
421 |
" transform = transforms.Compose([\n",
|
422 |
-
" transforms.Resize((
|
423 |
" transforms.ToTensor(),\n",
|
424 |
" transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n",
|
425 |
" ])\n",
|
|
|
22 |
},
|
23 |
{
|
24 |
"cell_type": "code",
|
25 |
+
"execution_count": 3,
|
26 |
"metadata": {},
|
27 |
"outputs": [],
|
28 |
"source": [
|
29 |
"from fastai.learner import load_learner\n",
|
30 |
"\n",
|
31 |
"# Load the FastAI Learner\n",
|
32 |
+
"learn_inf_tiny = load_learner(\"models/tiny.pkl\")\n",
|
33 |
+
"learn_inf_base= load_learner(\"models/base.pkl\")\n",
|
34 |
+
"learn_inf_resnet = load_learner(\"models/resnet.pkl\")"
|
35 |
]
|
36 |
},
|
37 |
{
|
|
|
257 |
"Due to different preprocessing in fast.ai and the manual preprocessing there can be some differences.\n"
|
258 |
]
|
259 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
260 |
{
|
261 |
"cell_type": "code",
|
262 |
"execution_count": 1,
|
|
|
281 |
},
|
282 |
{
|
283 |
"cell_type": "code",
|
284 |
+
"execution_count": 6,
|
285 |
"metadata": {},
|
286 |
"outputs": [],
|
287 |
"source": [
|
|
|
290 |
},
|
291 |
{
|
292 |
"cell_type": "code",
|
293 |
+
"execution_count": 7,
|
294 |
"metadata": {},
|
295 |
"outputs": [],
|
296 |
"source": [
|
297 |
"model = learn_inf_resnet.model\n",
|
298 |
+
"dummy_input = torch.randn(1, 3, 256, 256) # Use batch size 1 for export\n",
|
299 |
"torch.onnx.export(\n",
|
300 |
" model, \n",
|
301 |
" dummy_input, \n",
|
|
|
362 |
},
|
363 |
{
|
364 |
"cell_type": "code",
|
365 |
+
"execution_count": 8,
|
366 |
"metadata": {},
|
367 |
"outputs": [
|
368 |
{
|
|
|
380 |
},
|
381 |
{
|
382 |
"cell_type": "code",
|
383 |
+
"execution_count": 10,
|
384 |
"metadata": {},
|
385 |
"outputs": [
|
386 |
{
|
387 |
"name": "stdout",
|
388 |
"output_type": "stream",
|
389 |
"text": [
|
390 |
+
"Predicted Class: Cantal (Confidence: 0.971699)\n"
|
391 |
]
|
392 |
}
|
393 |
],
|
|
|
402 |
"# Preprocessing function\n",
|
403 |
"def preprocess_image(image_path):\n",
|
404 |
" transform = transforms.Compose([\n",
|
405 |
+
" transforms.Resize((256, 256)),\n",
|
406 |
" transforms.ToTensor(),\n",
|
407 |
" transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n",
|
408 |
" ])\n",
|
CNAME
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
cheese.storymelange.com
|
README.md → README.MD
RENAMED
@@ -20,10 +20,11 @@ The models must be added with git-lfs as huggingface has a 10MB file size limit.
|
|
20 |
## Javascript app
|
21 |
In addition there is a javascript app, which can be run at:
|
22 |
|
23 |
-
https://www.storymelange.com/cheese_classifier/
|
24 |
|
25 |
|
26 |
-
To run with github pages the model must be added to git without git lfs.
|
|
|
27 |
|
28 |
Github has a 100MB file size limit.
|
29 |
|
|
|
20 |
## Javascript app
|
21 |
In addition there is a javascript app, which can be run at:
|
22 |
|
23 |
+
https://www.storymelange.com/cheese_classifier/
|
24 |
|
25 |
|
26 |
+
To run with github pages the model must be added to git without git lfs and in binary mode.
|
27 |
+
Check `.gitattributes`.
|
28 |
|
29 |
Github has a 100MB file size limit.
|
30 |
|
docs/index.html
ADDED
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html lang="en">
|
3 |
+
<head>
|
4 |
+
<meta charset="UTF-8">
|
5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
+
<title>Cheese Classification with ONNX</title>
|
7 |
+
<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web/dist/ort.min.js"></script>
|
8 |
+
</head>
|
9 |
+
<body>
|
10 |
+
<h1>Webcam Classification with ONNX</h1>
|
11 |
+
|
12 |
+
<p>Inference Time: <span id="inferenceTime">0</span> ms</p>
|
13 |
+
<p>Prediction: <span id="prediction">Waiting...</span></p>
|
14 |
+
|
15 |
+
<video id="webcam" autoplay playsinline width="256" height="256"></video>
|
16 |
+
|
17 |
+
<script>
|
18 |
+
let FRAME_SKIP = 1; // Dynamically adjust frame skipping
|
19 |
+
let frameCounter = 0;
|
20 |
+
const TARGET_FPS = 30; // Desired FPS
|
21 |
+
let session;
|
22 |
+
|
23 |
+
const classNames = [
|
24 |
+
"Camembert", "Roquefort", "Comté", "Époisses de Bourgogne",
|
25 |
+
"Tomme de Savoie", "Bleu d’Auvergne", "Brie de Meaux", "Mimolette",
|
26 |
+
"Munster", "Livarot", "Pont-l’Évêque", "Reblochon", "Chabichou du Poitou",
|
27 |
+
"Valençay", "Pélardon", "Fourme d’Ambert", "Selles-sur-Cher",
|
28 |
+
"Cantal", "Neufchâtel", "Banon", "Gruyere"
|
29 |
+
];
|
30 |
+
|
31 |
+
async function loadModel() {
|
32 |
+
session = await ort.InferenceSession.create("resnet.onnx");
|
33 |
+
}
|
34 |
+
|
35 |
+
async function classifyFrame() {
|
36 |
+
const startTime = performance.now();
|
37 |
+
|
38 |
+
// Capture a frame from the video
|
39 |
+
const video = document.getElementById("webcam");
|
40 |
+
const tempCanvas = document.createElement("canvas");
|
41 |
+
const ctx = tempCanvas.getContext("2d");
|
42 |
+
|
43 |
+
tempCanvas.width = 256;
|
44 |
+
tempCanvas.height = 256;
|
45 |
+
ctx.drawImage(video, 0, 0, 256, 256);
|
46 |
+
const imageData = ctx.getImageData(0, 0, 256, 256);
|
47 |
+
|
48 |
+
// Convert to ONNX tensor format
|
49 |
+
const tensor = preprocessImage(imageData);
|
50 |
+
|
51 |
+
// Run ONNX inference
|
52 |
+
const output = await session.run({ input: tensor });
|
53 |
+
const probabilities = softmax(output["output"]["cpuData"]);
|
54 |
+
|
55 |
+
// Get highest probability index
|
56 |
+
const predictedIdx = probabilities.indexOf(Math.max(...probabilities));
|
57 |
+
const predictedLabel = classNames[predictedIdx] || "Unknown";
|
58 |
+
|
59 |
+
// Measure inference time
|
60 |
+
const inferenceTime = Math.round(performance.now() - startTime);
|
61 |
+
document.getElementById("inferenceTime").innerText = inferenceTime + " ms";
|
62 |
+
document.getElementById("prediction").innerText = predictedLabel;
|
63 |
+
|
64 |
+
// Adjust FRAME_SKIP dynamically based on inference time
|
65 |
+
if (inferenceTime > (1000 / TARGET_FPS)) {
|
66 |
+
FRAME_SKIP = Math.min(FRAME_SKIP + 1, TARGET_FPS);
|
67 |
+
} else {
|
68 |
+
FRAME_SKIP = Math.max(FRAME_SKIP - 1, 1);
|
69 |
+
}
|
70 |
+
}
|
71 |
+
|
72 |
+
function preprocessImage(imageData) {
|
73 |
+
const tensor = new Float32Array(1 * 3 * 256 * 256);
|
74 |
+
const mean = [0.485, 0.456, 0.406];
|
75 |
+
const std = [0.229, 0.224, 0.225];
|
76 |
+
|
77 |
+
for (let i = 0; i < imageData.data.length; i += 4) {
|
78 |
+
let r = (imageData.data[i] / 255 - mean[0]) / std[0];
|
79 |
+
let g = (imageData.data[i + 1] / 255 - mean[1]) / std[1];
|
80 |
+
let b = (imageData.data[i + 2] / 255 - mean[2]) / std[2];
|
81 |
+
|
82 |
+
let index = (i / 4) % (256 * 256);
|
83 |
+
tensor[index] = r;
|
84 |
+
tensor[index + 256 * 256] = g;
|
85 |
+
tensor[index + 2 * 256 * 256] = b;
|
86 |
+
}
|
87 |
+
|
88 |
+
return new ort.Tensor("float32", tensor, [1, 3, 256, 256]);
|
89 |
+
}
|
90 |
+
|
91 |
+
function softmax(logits) {
|
92 |
+
if (!logits) {
|
93 |
+
console.error("Error: logits is undefined.");
|
94 |
+
return [];
|
95 |
+
}
|
96 |
+
const maxLogit = Math.max(...logits);
|
97 |
+
const expLogits = logits.map(l => Math.exp(l - maxLogit));
|
98 |
+
const sumExp = expLogits.reduce((a, b) => a + b, 0);
|
99 |
+
return expLogits.map(e => e / sumExp);
|
100 |
+
}
|
101 |
+
|
102 |
+
async function main() {
|
103 |
+
await loadModel();
|
104 |
+
|
105 |
+
const video = document.getElementById("webcam");
|
106 |
+
|
107 |
+
function isMobile() {
|
108 |
+
return /Android|iPhone|iPad|iPod/i.test(navigator.userAgent);
|
109 |
+
}
|
110 |
+
// Access the webcam
|
111 |
+
navigator.mediaDevices.getUserMedia({
|
112 |
+
video: isMobile() ? { width: 256, height: 256, facingMode: { exact: "environment" } }
|
113 |
+
: { width: 256, height: 256 } // Default for desktops
|
114 |
+
})
|
115 |
+
.then(stream => {
|
116 |
+
video.srcObject = stream;
|
117 |
+
});
|
118 |
+
|
119 |
+
async function processFrame() {
|
120 |
+
if (frameCounter % FRAME_SKIP === 0) {
|
121 |
+
await classifyFrame();
|
122 |
+
}
|
123 |
+
frameCounter++;
|
124 |
+
requestAnimationFrame(processFrame);
|
125 |
+
}
|
126 |
+
|
127 |
+
requestAnimationFrame(processFrame);
|
128 |
+
}
|
129 |
+
|
130 |
+
main();
|
131 |
+
</script>
|
132 |
+
</body>
|
133 |
+
</html>
|