Spaces:
Runtime error
Runtime error
Add application file
Browse files- 0.jpg +0 -0
- 1.jpg +0 -0
- 2.jpg +0 -0
- 4.jpg +0 -0
- 7.jpg +0 -0
- app.py +21 -0
- flagged/img/tmpdio8pdis.jpg +0 -0
- flagged/img/tmpn5_zbthp.jpg +0 -0
- flagged/log.csv +3 -0
- flagged/output/tmp5mcq163y.json +1 -0
- flagged/output/tmpiv1wkyq8.json +1 -0
- model.pkl +3 -0
- train.ipynb +299 -0
- utils.py +49 -0
0.jpg
ADDED
1.jpg
ADDED
2.jpg
ADDED
4.jpg
ADDED
7.jpg
ADDED
app.py
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from fastai.vision.all import *
|
2 |
+
import gradio as gr
|
3 |
+
import pathlib
|
4 |
+
|
5 |
+
plt = platform.system()
|
6 |
+
if plt == 'Linux': pathlib.WindowsPath = pathlib.PosixPath
|
7 |
+
|
8 |
+
modelPath = Path('model.pkl')
|
9 |
+
learn = load_learner(modelPath)
|
10 |
+
categories = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
|
11 |
+
|
12 |
+
def classify_image(img):
|
13 |
+
pred,idx,probs = learn.predict(img)
|
14 |
+
return dict(zip(categories, map(float, probs)))
|
15 |
+
|
16 |
+
image = gr.inputs.Image(shape=(28,28))
|
17 |
+
label = gr.outputs.Label()
|
18 |
+
examples = ['0.jpg', '1.jpg', '2.jpg', '4.jpg', '7.jpg']
|
19 |
+
|
20 |
+
intf = gr.Interface(fn=classify_image, inputs=image, outputs=label, examples=examples)
|
21 |
+
intf.launch(inline=False)
|
flagged/img/tmpdio8pdis.jpg
ADDED
flagged/img/tmpn5_zbthp.jpg
ADDED
flagged/log.csv
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
img,output,flag,username,timestamp
|
2 |
+
C:\Users\xuyax\Desktop\小项目\手写数字识别\HandwrittenDigits\flagged\img\tmpdio8pdis.jpg,C:\Users\xuyax\Desktop\小项目\手写数字识别\HandwrittenDigits\flagged\output\tmpiv1wkyq8.json,,,2023-01-05 17:34:23.035192
|
3 |
+
C:\Users\xuyax\Desktop\小项目\手写数字识别\HandwrittenDigits\flagged\img\tmpn5_zbthp.jpg,C:\Users\xuyax\Desktop\小项目\手写数字识别\HandwrittenDigits\flagged\output\tmp5mcq163y.json,,,2023-01-05 17:34:24.248790
|
flagged/output/tmp5mcq163y.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"label": "0", "confidences": [{"label": "0", "confidence": 0.9940950870513916}, {"label": "6", "confidence": 0.0046813031658530235}, {"label": "5", "confidence": 0.0003212250885553658}, {"label": "9", "confidence": 0.0002872416516765952}, {"label": "8", "confidence": 0.000251215387834236}, {"label": "1", "confidence": 0.00014719778846483678}, {"label": "3", "confidence": 9.254053293261677e-05}, {"label": "2", "confidence": 5.134829552844167e-05}, {"label": "4", "confidence": 3.9181362808449194e-05}, {"label": "7", "confidence": 3.3574375265743583e-05}]}
|
flagged/output/tmpiv1wkyq8.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"label": "0", "confidences": [{"label": "0", "confidence": 0.9940950870513916}, {"label": "6", "confidence": 0.0046813031658530235}, {"label": "5", "confidence": 0.0003212250885553658}, {"label": "9", "confidence": 0.0002872416516765952}, {"label": "8", "confidence": 0.000251215387834236}, {"label": "1", "confidence": 0.00014719778846483678}, {"label": "3", "confidence": 9.254053293261677e-05}, {"label": "2", "confidence": 5.134829552844167e-05}, {"label": "4", "confidence": 3.9181362808449194e-05}, {"label": "7", "confidence": 3.3574375265743583e-05}]}
|
model.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:ffa8a27770de4a732e5a56932fd399dbfe48c9ac1bfa1fabc089dcb554c86411
|
3 |
+
size 88236753
|
train.ipynb
ADDED
@@ -0,0 +1,299 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 1,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [],
|
8 |
+
"source": [
|
9 |
+
"import fastbook\n",
|
10 |
+
"fastbook.setup_book()"
|
11 |
+
]
|
12 |
+
},
|
13 |
+
{
|
14 |
+
"cell_type": "code",
|
15 |
+
"execution_count": 2,
|
16 |
+
"metadata": {},
|
17 |
+
"outputs": [],
|
18 |
+
"source": [
|
19 |
+
"from fastbook import *\n",
|
20 |
+
"from fastai.vision.all import *\n",
|
21 |
+
"import os"
|
22 |
+
]
|
23 |
+
},
|
24 |
+
{
|
25 |
+
"cell_type": "code",
|
26 |
+
"execution_count": 13,
|
27 |
+
"metadata": {},
|
28 |
+
"outputs": [
|
29 |
+
{
|
30 |
+
"data": {
|
31 |
+
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAswAAALgCAYAAACAvyFXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABIeUlEQVR4nO3de/hVdZ0v8A9xEQUURM0LJnhBQyN1PDmC3LLIS2kXJ2sEK2Yqu1gem/GSxWWczlRq2vUwds7RUrOLR03TEFMCL6k5qaOGlzBGPYWmgSYJ/FDOHz42k/n9rB9rsdm//eP1ep7zPGd4z17ru9de37U/sx9802fdunXrAgAAeEWvavcCAACgJzMwAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAwsDcYS699NI44YQTYsKECbHllltGnz59Ytq0ae1eFtDAKaecEoccckjsvPPOsfnmm8fWW28d++23X8yZMyeeeuqpdi8PqGHkyJHRp0+fV/x/22+/fbuXx3rqs27dunXtXgTdt++++8bdd98dgwcPjhEjRsT9998fxx57bFx00UXtXhpQ04ABA2L//fePMWPGxHbbbRcrV66MW2+9Ne64447Ycccd49Zbb42dd9653csE1sPIkSNjxYoVceKJJ/5FNnjw4PiHf/iHjb8oauvX7gWwfs4555wYMWJE7L777rFw4cKYMmVKu5cENPTMM8/EwIED/+LPTz/99Pgf/+N/xL/8y7/EN77xjTasDGhi6NChMXv27HYvgw3AX8noMFOmTIk99tgj+vTp0+6lABvIKw3LERHvfve7IyLioYce2pjLAeBl/MIM0ENdddVVERExduzYNq8EqGP16tVx0UUXxSOPPBKDBg2KsWPHxsSJE6Nv377tXhrrycAM0EOcddZZ8eyzz8bTTz8dd9xxR9x0000xduzYOPXUU9u9NKCGZcuWxfTp0//sz0aNGhXnn39+TJo0qU2rog4DM0APcdZZZ8Xjjz/+p//50EMPjQsuuCC23XbbNq4KqOMDH/hATJgwIfbee+8YMmRIPPzww/G1r30tzjvvvDjssMPiZz/7Wbz+9a9v9zLpJn+HGaCHWLZsWaxbty6WLVsWl112WTz88MOx3377xS9+8Yt2Lw1YT7NmzYo3vvGN8epXvzq22GKL2GeffWLu3Llx0kknxXPPPec/BuwwBmaAHubVr351vOMd74j58+fHU089Fccdd1y7lwRsIMcff3xERCxatKjNK2F9GJgBeqhddtklxowZE/fdd188+eST7V4OsAG89FesVq5c2eaVsD4MzAA92G9+85uICP9VPfQSt956a0RE7Lrrrm1eCevDwAzQRg8++GA8/fTTf/HnL7zwQpx++unxxBNPxLhx42LYsGFtWB1Qx+LFi1/xF+SlS5fGxz/+8YiImDZt2sZeFg1oyegwV1xxRVxxxRUR8eJ/IBQR8bOf/Sze//73R0TENttsE2eddVabVgesr2uuuSZOO+20OPjgg2PUqFExfPjwePzxx2PhwoXx8MMPx/bbbx/f/OY3271MYD1873vfi7PPPjsmTpwYu+yySwwZMiSWLFkSV199daxatSoOP/xw/zR2h+mzbt26de1eBN03e/bsmDNnTjHfZZddYunSpRtvQUAj9957b8ydOzduuummeOyxx2LFihUxaNCgGD16dBxxxBHxiU98Irbeeut2LxNYDwsXLoy5c+fGnXfeGcuWLYuVK1fG0KFDY999943p06fH9OnT/Yu9HcbADAAACX+HGQAAEgZmAABIGJgBACBhYAYAgISBGQAAEgZmAABIGJgBACDR7X/pT8H2i1pxHaqqsF/1qvL/XfPCCy/Uel3VazPZNai6Ptk5s9f27ds3Pe7atWvTfGPrlHrz7B5p1X2Zfc5NrluT49bd103WW/f6Val7HZo82zrlfm+qU95nv37lr/bnn3++9nGz53B23Kp7K9sLTdbbCr1pn2T3SUT979VWzR6t0t3PxS/MAACQMDADAEDCwAwAAAkDMwAAJAzMAACQMDADAECiz7pu9mlsKrVyVfVldStuelqFVKvWVHWftKpWp1XXt66eVh9U0qRWrhVaVXPUKv379y9mXV1dG3El3VO3ErLJHsqeqVXH7Wn7qKetpyT7LJtUfvW052yVut+PrdrXTer+svW2qu4vO2eTe6HueltFrRwAAGwABmYAAEgYmAEAIGFgBgCAhIEZAAASBmYAAEgYmAEAIKGHeT1lPYqt6oite+2bdIY26XfO9LT+xVbpDX2tTV6bdXQ2+Zxb1Y/ajn7iunusqkc3e22n3Jc9Vadcv+weqdrzrehTrvr3DbJz9rRr3qS7uFXfqz1Nq/49i1bRwwwAABuAgRkAABIGZgAASBiYAQAgYWAGAICEgRkAABJq5XqAqpqoVtT8tEqT95K9tpOuQUTnVARl+7od1UBNztmqysJWVUG1o2Kq7h5rUqXVjirOVumUfZ19zlXvoTc9hzN1nxdVz6js+mbXr+q4mWy9Te6Fuvd7k3mxHXtMrRwAAGwABmYAAEgYmAEAIGFgBgCAhIEZAAASBmYAAEiolVtPdatoWlUhtdVWWxWzK6+8Mn3txIkTi9luu+1WzJYuXVrMmtQO9aY6o06pn8ruyyZVYlX1giVVn3Pde6RqPdl7bUV9XtU5O62urlV62nvplOvX5Pu67muz1zV5fjd5RmX7vtMqDetq1R7aFL+v/cIMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACT6tXsBnaZuXUqT+pasyi6rhjvooIPS42bvZd68ecXsgx/8YDG7+eab03NmmtT89KaKm42pbk1ilex+b7IX6lbHNbkH+vfvX8xOP/30YrZw4cL0uAsWLChmM2fOLGZvetOb0uNOmDAhzUuuv/76Yva5z30ufW32XjJVdX/2bj1Nqtiya163Oq5JzV2TZ0mTqsk6x4yI2H333YvZq1/96mJWtW/32WefYnbssccWs+waVX3nZt8P9957bzE75ZRT0uNm80VP5hdmAABIGJgBACBhYAYAgISBGQAAEgZmAABIGJgBACBhYAYAgESfdd0sRW3So9hJqt5ndrmy1zbpnh0wYEAxy7pTx40bV/ucWUflW97ylmI2f/782udsVSdwOzT5vDemJn2trdgLWedxRERXV1cxmzx5cjGr6gm+8cYbi1nWZ96vX7nKvuoeaMczNdtH2f6r0qr30tOeCb1hXzfRqs8jW++73/3uYrZ69er0uHvuuWetc2b7Ous8jogYPnx4Mdt6662LWVUvdHbv1e2bbtU5f/GLX6THzf79iFWrVqWvbYXu7mu/MAMAQMLADAAACQMzAAAkDMwAAJAwMAMAQMLADAAAiXJ3yiaqSW1Q3SqtqgqgqVOnFrP/9t/+W61zVqn72qqamqyKph3XnrJ23D9ZbVxExBlnnFHMTj/99FrnjIgYP358Mau6p0uq9nXdirdsD0Xk661bHVd1zky2nqrjdlqdZCdoUheZfR5NPuesiu2SSy5JX5upu8ea1C9m1y+7Rr/73e/S42YVstlrR4wYkR43k90rzz33XDH78pe/nB63HdVxG4JfmAEAIGFgBgCAhIEZAAASBmYAAEgYmAEAIGFgBgCAhFq5l2lSuVP12jrHrMrr1kRF5BU3raoPyrSjxoyyJnuhVfdIdl9m621SxZa9z+y4VXuz7jnr1txF1K/LanLOJs9M+7qeJjWb7ajoXLFiRTHbf//9i9ns2bPT4x555JHFbOXKlcXsRz/6UTG7884703Pedtttxey+++4rZmvWrEmP+8wzzxSzus8S+2v9+IUZAAASBmYAAEgYmAEAIGFgBgCAhIEZAAASBmYAAEgYmAEAIKGH+WWa9BJmHaeZfv3yjyHrZ8xe29XVVWs9ERELFy4sZosWLSpmVX2tWW9tk2vfju7Q3iDr3q26n+t2LWefVVUvb90+4KrXrV27tphleyy7fj/96U/Tc06dOrWYjR8/vphVfS7Z/qzb217VY92q/dfk/tyUNbnmdfv56+75iHz/3XPPPcXs1FNPTY97+OGHF7O77767mE2bNq2YNbnvWtVPX/e1Vc+Dur33vfU71y/MAACQMDADAEDCwAwAAAkDMwAAJAzMAACQMDADAEBCrdzLVNXfZHUpdWtWskqdiIgdd9yxmGXVcXUrpCIiVq9eXStrUo2TafK5UNakIim75nXrwKo+x2yvZPdeVa1c3XrGz3/+88Vs5syZ6TkzWSVdVvkYkV/fJs+Euqr2bkZ1XD1N6stacc3bdQ/079+/mGVrarKHsmdYdu2rjlu3krVuTWBE/lysmlt6I78wAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJtXIvU1Vr1aSup6SqTuYzn/lMrfVUVcZkr7300ktrHzeTVflkWdW1bcXnsinIrlvVXqhbn9TEP//zPxezbB9VrWfBggXF7Oabb6593Ex2v2fVcQcddFB63FZUx1XV8ql17Fla9XnUrYus2ifZXqi69zLZeet+j1Vd27r1lq36Xm3yjKq7pibPi578LPELMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQUCu3nlpRl1VV3dLV1VXMspqfrGomIq9+ufHGG9PX1j1nq+pkenIVTU/W5H6uWzHVRLbeWbNm1T5u3VrC7H6fMmVKes6ZM2cWs4MPPrjWOavU3X9nnHFGety690JVBV6r7qPeLvssqyq/WlHFVqXufdnk+2b48OHFbN999y1mo0aNSs+Zya7tU089lb42q7es+3lXXb+6n3dvrXL1CzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAQg/zesp6C+t2Ab/vfe9L86z3Mes7rFpP9tpW9Sj261e+5dauXVv7uHqYN7z+/funedYPXleTXtWsb7Tq/vjsZz9ba01Zl3LVe8nu9ybds9nerergratuX2vV61r1vNiUNenxbtU5665pzZo1aZ71fI8ZM6aYZZ3HAwYMSM+ZvZdsPVXv5cknnyxm3/72t4vZueeeW8wef/zx9Jx1nxdV80Mr5qiNwS/MAACQMDADAEDCwAwAAAkDMwAAJAzMAACQMDADAECiz7pudni0o4qmN8nqke688870tXvuuWcxy2pqqiqb5s2bV8yOPvroYpZVxjSpemryXpq8thV6cjXOf5VVx1V9ltlrs3sk+zya1MplFi1alOYHHXRQMcvurWy9Te7ZTJN7K1tvkzq6bE1vfvObi9mCBQvS47aq3rKuTtnXTb6vs9fWrQNr1XXLquEiIv793/+9mLVqprnkkkuK2eTJk4vZTjvtlB43q53Lqu4efvjhYnbyySen57ziiiuKWfZ8q3pedOq+9gszAAAkDMwAAJAwMAMAQMLADAAACQMzAAAkDMwAAJAod53xirIqra6urmKWVXTtvffetdeTHTersouIePDBBzf4OatkVVpNqmbaUR3XGzT5LLP7vR2yKqOq91m1V+qoqlbKZPdz3Tq6iLw+qcl6s+N++tOfLmZVtXJ1a8w2da26bnWf0U0q3LL1Vq0nu6ezNT3zzDPF7PWvf316zqVLl6Z5nfVERBx77LHF7NRTTy1m2Xzx/e9/Pz3npEmTitlNN91UzJp8Lj2tcu6/8gszAAAkDMwAAJAwMAMAQMLADAAACQMzAAAkDMwAAJAwMAMAQKLPum6WMjbpUexN6vZbZq9r0oWb9RlWdRO3onuWF3VKR6x9/aKFCxcWs4MPPrjWMZv0GmfPhJ/97GfpaydOnFjM/umf/qmYjRs3rpgdcsgh6TnrmjJlSpr/9Kc/bcl567Kve5YxY8ak+T333FPruHPnzi1mH/vYx9LXZtc+y5r0Dw8ePLiYPfTQQ8Vs+PDh6XH/9V//tZiddNJJxayndfRX6e6+9gszAAAkDMwAAJAwMAMAQMLADAAACQMzAAAkDMwAAJBQK7cB9e3bt5hlFW9VdTJZnp3zrrvuSo+73377pTn1qZ/qLJMmTSpmZ5xxRjGbMGFC7XNm1Uuf//zni9n111+fHnfRokXFLLsvJ0+eXPucWYVe3brNiLz6sqo2sxXs655l4MCBaf7JT36ymB100EHF7Mwzzyxmt912W3rOJjWxmbqVtlOnTi1m1157bXrObPZ485vfXMyyZ1BE665RXWrlAABgAzAwAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAotzZwyvK6pOymqNhw4YVs6oKoKzaJTvnt771rfS4sKmo2mMLFy4sZp/+9KeL2Y033ljMFixYkJ4zq2XKNKlTy2ooTz/99GKWPfeqZNc+u+4R7amOo3OsWrUqzb/whS9spJX8p2yv1K2G605ecsMNNxSzW265JX3tuHHjiln2/MrO2cn8wgwAAAkDMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJNTKraes4i0zZ86cYlZVndSvX/ljWrZsWTG7/vrrqxcGm4CqSqZFixYVs4MPPriYnXHGGcVs5syZ1Quroaoib8KECcUsew5Nnjy57pLS52JWs5Vd94hmNVz0fllNYkT9WsLsO3ft2rXpa+vuharZomrflwwaNKiYbbPNNulr6+6xqs8lO27dGWtj8AszAAAkDMwAAJAwMAMAQMLADAAACQMzAAAkDMwAAJAwMAMAQEIP88tUdR1m/YFjxowpZh/96EeLWdbNWHXOH/3oR8Xs3nvvTY8LvCjbY9kz4bOf/WytrF2qOmTrqtvX2qquajYNdXuWI/Lv3Sb7pG7XcpPZI/O+972vmG255Zbpa7M1Pfnkk8WsyefSk/mFGQAAEgZmAABIGJgBACBhYAYAgISBGQAAEgZmAABIqJV7mbrVLRER//AP/1DM+vbtW8yqKliyapcf/OAHxazJe4HepKqy6YYbbihmEydOLGZN6qf69Ss/fpvUT2Wvzc5Z95gR+fPtkEMOqXXOquP21uoqNpxp06YVs+zeuuyyy4rZH/7wh/ScVXulpGpvjh8/vpidfvrpxWzSpEnFLLsGEREPPPBAMbv44ouLWasq8trNL8wAAJAwMAMAQMLADAAACQMzAAAkDMwAAJAwMAMAQKLPum72e1TVhBBxzTXXFLM3velNxayq2uWOO+4oZocffngxW758eXrcuvU3VOuU2pxNZV+/6lX5bwPZXvjpT39azLLKpip175Emn1nd+rwvfOEL6XGvv/76YrZgwYJi1mn1Uz1tPSWbyr7eeeed0/wXv/hFMdtmm22K2fe///1idskll6Tn3HLLLYvZ0UcfXcyGDh2aHjerlctk9+z555+fvvaMM84oZo888kgxq5ppsudtO/ZYd8/pF2YAAEgYmAEAIGFgBgCAhIEZAAASBmYAAEgYmAEAIGFgBgCARL92L6DTjBkzppjtueeexaxfv/Klfv7559NzPv7448Xs97//fTHrlM5QaLWqzvGst3by5MnFLOtorjrnlClTilm2d7NzRkQsXLiwVpYdt1XPkk7rYaZnWblyZZo/88wzxWzYsGHF7N3vfncxe+c735meM+sgzu7nJt3Zjz76aDE7/vjji9m1116bHjdbbzbTrF27Nj1up/ILMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQ6LOum709TSpPYFPTKXVY9vWLsiqoqtrHkqw2LiLihhtuKGZZxVvVcWkd+7qzvO51rytmH//4x4vZMcccU8wGDx6cnjN7ltx7773F7Etf+lJ63MWLFxezX/3qV8XsySefLGatqnXstLrI7q7HL8wAAJAwMAMAQMLADAAACQMzAAAkDMwAAJAwMAMAQEKtHLRAT6vNKdlU9vWrXpX/NvDCCy/UOm52/TrlHqD7OuUz3VT2dZW6dZGt2tfZc6jqGdS/f/9i1tXVtcHX0501bezjtopaOQAA2AAMzAAAkDAwAwBAwsAMAAAJAzMAACQMzAAAkOjX7gUAtFpVbVDduqfsuE2qlQYMGFDM1qxZkx4XeFHd+rJW1Qc2qZWrWx2XVeT1tHq3ns4vzAAAkDAwAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAwsAMAACJPuu6WTiYdfkBf65VPZ4bmn1dre416pR7gO7rlM/Uvn5R3d7jJtevVfdI3759a52zSdfypvLs6+56/cIMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACS6XSsHAACbIr8wAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJA3MHueCCC6JPnz7p/+vbt2+7lwmsp5EjRxb39Pbbb9/u5QE1PfbYYzFjxozYcccdY7PNNouRI0fGiSeeGMuXL2/30lhP/dq9ALpv3333jVmzZr1iduONN8YNN9wQhx122EZeFbAhbLXVVnHiiSf+xZ8PHjx44y8GaGzJkiUxbty4eOKJJ+Koo46KvfbaK26//fb48pe/HPPmzYubb745hg8f3u5l0k191q1bt67di6C5gw46KG699db44Q9/GEceeWS7lwOsh5EjR0ZExNKlS9u6DmDDectb3hLz58+Pr3zlK3HCCSf86c9POumkOOecc+LDH/5wzJ07t40rZH0YmHuBe+65J8aOHRs77bRT/Md//Ie/lgEdxsAMvcuSJUti9913j5EjR8aSJUviVa/6z78B+4c//CF22GGHWLduXTzxxBMxaNCgNq6U7vJXMnqB8847LyIi/u7v/s6wDB1q9erVcdFFF8UjjzwSgwYNirFjx8bEiRPtaehACxYsiIiIqVOn/tmwHBExZMiQGD9+fMyfPz9uvfXWOOSQQ9qxRNaTgbnDPffcc3HRRRdF37594+///u/bvRygpmXLlsX06dP/7M9GjRoV559/fkyaNKlNqwLqeOCBByIiYvTo0a+Y77HHHjF//vx48MEHDcwdQktGh/v+978fK1asiEMPPTR23nnndi8HqOEDH/hAXH/99bFs2bJYuXJl3HPPPfHhD384li5dGocddljcfffd7V4isB6efvrpiHjxP+Z9JS/9+YoVKzbWkmjIL8wd7qW/jvHhD3+4zSsB6np5+80+++wTc+fOjcGDB8fZZ58ds2fPjssvv7xNqwPAL8wd7L777otbbrklRowYEYcffni7lwNsYMcff3xERCxatKjNKwHWx0u/IL/0S/PLvfTnQ4cO3VhLoiEDcwfzH/tB77bttttGRMTKlSvbvBJgfey5554REfHggw++Yv7QQw9FRPnvONPzqJXrUKtWrYodd9wxnnnmmfj1r3/t7y9DL3TttdfGoYceGq997Wvjl7/8ZbuXA3STWrnexy/MHeoHP/hBLF++PA477DDDMnSwxYsXv+IvyEuXLo2Pf/zjERExbdq0jb0soIHddtstpk6dGkuXLo2vf/3rf5bNmjUrVq5cGdOnTzcsdxC/MHeoCRMmxE033RRXXnllvO1tb2v3coCaZs+eHWeffXZMnDgxdtlllxgyZEgsWbIkrr766li1alUcfvjhcfnll8eAAQPavVRgPbz8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5rOeto+6ux6/MAMAQMLADAAACQMzAAAkDMwAAJAwMAMAQMLADAAAiW7XymX1Iu2oCKmqVsrqZLLalze84Q3pca+88spiNnz48GJ24YUXFrNPfepT6TmffPLJNC9pUgVY97V1K4mq9O/fP82zGqB26Gm1OSVN9nV2j2RZkzqirFZun332qXXOiPx5ktXnZdeoVc+o6667Lj3u29/+9mL23HPPFbMm90KWN6k462m1mZ2yr7PnZXbfRdSv8mtVBWBWF3nxxRenrz3yyCNrn7ek6vpV1XGWzJs3L83POuusYvbTn/601nratb86tS7SL8wAAJAwMAMAQMLADAAACQMzAAAkDMwAAJAwMAMAQMLADAAAibwodAPJujbrdrI26ZIcP358MfvhD3+YHnfo0KHF7P777y9mn/nMZ4pZVc9y3evXpM+wVV2IdfsXq3qWe2LXZCdo0oeZ5VlW936OiLjnnnuK2ete97piVtWJnN1fVa8tqbp+/+///b9iNnv27GJ26aWXpsfNupbrqnovdT9Te7M1qr4fM6149lf1q2fn/OMf/1jMzj333LpLSjuas3t25cqV6XHnzJlTzLJ9ct5556XHrTpvSav2WKu+O3oyvzADAEDCwAwAAAkDMwAAJAzMAACQMDADAEDCwAwAAIk+67rZ71FVC9NJVqxYUcy22mqr9LXZ5TrhhBOK2de//vVi1uTa1q3viqiu8KK+TqnNace+blIBOGrUqGL2oQ99qJgdcMAB6XHf+MY3FrO61+iLX/ximn/jG98oZo899lgxs2/bx76G3qe7+9ovzAAAkDAwAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAou21cnUrpqoq03bddddidsoppxSzd73rXelxb7/99mI2Y8aMYvbb3/62mDWpKso+l06pQOqNOuXaZ/uo6j3069evmK1du3aDryeisyrVmryXbF9XPYs76Rp1mk7Z12rloPvUygEAwAZgYAYAgISBGQAAEgZmAABIGJgBACBhYAYAgES3a+WyCqms/q2JrJapVdVJVXU82eUaOHBgMVu1alXtNdWt3mvyXmimU65tp9VP1X0ONfk86u4/eh/7GnoftXIAALABGJgBACBhYAYAgISBGQAAEgZmAABIGJgBACBhYAYAgES3e5ib9Dpm3alr166tdcysGzUi72nO3kur+p0z2fWJyK9RO7qqqdYb+lqzeyui/v3ViudBU3W7lpu8l+z6ZvdPp9xbvVGnXHs9zNB9epgBAGADMDADAEDCwAwAAAkDMwAAJAzMAACQMDADAECi27VyAACwKfILMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQMDB3oMceeyxmzJgRO+64Y2y22WYxcuTIOPHEE2P58uXtXhpQw7p16+Kb3/xmHHjggTF48OAYNGhQHHDAATF37tx44YUX2r08oIZLL700TjjhhJgwYUJsueWW0adPn5g2bVq7l0VNfdatW7eu3Yug+5YsWRLjxo2LJ554Io466qjYa6+94vbbb48FCxbEnnvuGTfffHMMHz683csE1sOxxx4b3/nOd2K77baLI488MrbYYou47rrrYvHixTF9+vT49re/3e4lAutp3333jbvvvjsGDx4cI0aMiPvvvz+OPfbYuOiii9q9NGro1+4FsH4++tGPxhNPPBFf+cpX4oQTTvjTn5900klxzjnnxOmnnx5z585t4wqB9XH55ZfHd77znRg1alTcfvvtsc0220RExJo1a+Jd73pXXHjhhfH2t7893vnOd7Z5pcD6OOecc2LEiBGx++67x8KFC2PKlCntXhIN+CsZHWTJkiUxf/78GDlyZHzsYx/7s2zOnDkxaNCguPDCC2PlypVtWiGwvi6//PKIiPjUpz71p2E5ImLAgAFxxhlnRETE1772tbasDahvypQpsccee0SfPn3avRQ2AANzB1mwYEFEREydOjVe9ao//+iGDBkS48ePjz/+8Y9x6623tmN5QA3Lli2LiIhdd931L7KX/uzGG2+MNWvWbNR1AfCfDMwd5IEHHoiIiNGjR79ivscee0RExIMPPrjR1gQ089Kvyr/+9a//Inv44YcjImLt2rV/+v8DsPEZmDvI008/HRERW2211SvmL/35ihUrNtaSgIaOOOKIiIj40pe+FL///e//9OddXV0xa9asP/3PWnAA2sd/9AfQRu95z3viwgsvjGuvvTbGjBkTRx11VAwcODB+8pOfxG9/+9t4zWteE4888shf/DUsADYeT+AO8tIvyC/90vxyL/350KFDN9aSgIb69u0bV111VXz+85+PbbfdNr71rW/Ft771rdhjjz3illtuiSFDhkRExHbbbdfmlQJsuvzC3EH23HPPiCj/HeWHHnooIsp/xxnomfr37x+nnHJKnHLKKX/256tWrYqHHnoottlmmxg1alSbVgeAX5g7yEsdjvPnz/+Lf/3rD3/4Q9x8882xxRZbxF//9V+3Y3nABvbd73431qxZE+9973vbvRSATZqBuYPstttuMXXq1Fi6dGl8/etf/7Ns1qxZsXLlypg+fXoMGjSoTSsE6njmmWf+4s/uuuuu+Md//McYNmxYnHrqqW1YFQAv8U9jd5iX/9PYr33ta+O2226LBQsWxOjRo+OWW27xT2NDhznwwANj8803j3322SeGDBkSixcvjquvvjo233zzuOqqq2LSpEntXiKwnq644oq44oorIuLFvvVrr702dt1115gwYUJEvFgpedZZZ7VxhawPA3MHevTRR2PmzJkxb968eOqpp2KHHXaId7zjHTFr1qwYNmxYu5cHrKczzzwzvvvd78aSJUviueeei5122ikOO+ywOO2002LEiBHtXh5Qw+zZs2POnDnFfJdddomlS5duvAXRiIEZAAAS/g4zAAAkDMwAAJAwMAMAQMLADAAACQMzAAAkDMwAAJAwMAMAQKJfd/8X+/Tp08p19BivelX+f0O88MILtV6bva5Kdu2b1Gi34rhV90l23FZdv3bolHrzTWVfd5q+ffsWs+eff34jruRFTZ6LvYl93Vla8Z3S5Dsu047Zo1X7utOeF939zPzCDAAACQMzAAAkDMwAAJAwMAMAQMLADAAACQMzAAAkul0rt6moqjvJKmWy12avq6qpaVX9TV2tqrzqaVUz9B6tqoJqsseqqpdaoV+/8iN/7dq1xazq+tStqMyeJRHtqdCj92jFd0rVXqhb8Va11lY8L5pcnyZzQKuqclvNL8wAAJAwMAMAQMLADAAACQMzAAAkDMwAAJAwMAMAQMLADAAAiT7rull616pO305Tt2OxJ/YOtmJNVV2R2XGb9LVm174d17cnd0n+V/b1i7L7K7unu7q6WrGctuiJz6i6z9tWsa97j1Z8l1ep++84tEq7etB72rOmu+f0CzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACQMzAAAkOjX7gX0NFWVMXWrX5pUpfTrV/6YsvW0qqamSdVT9tosq6q3UaNEpkl9UpZl92zVns/yVtWpZdehSYVU3fVmz7ama6L3a1Jj2o4a2Oy1Vd9hWZ5dh7Vr1xazVu2vqs+lHRV6G4JfmAEAIGFgBgCAhIEZAAASBmYAAEgYmAEAIGFgBgCARJ913exIUdtVrVVVUHVVfWbZR7/vvvsWszlz5hSzI488Mj3nV7/61WL2iU98ophV1U9l1Tnt0KR6aGPaVPZ1k/fZqs+ybnVVqyqb6tZXVuWtqt5rh562npJNZV9XqbvHWlUrl2nyfZ1pUiXZquvQ02al7r4XvzADAEDCwAwAAAkDMwAAJAzMAACQMDADAEDCwAwAAIm8q4sNpqoKKlO3vqXqdVllzN57713MDj/88GJWVVOTVdxk2lE1Q+/RZC/UrVYaMGBAes41a9bUOmfVXqhb2dSkmrHuNar6XLJrmF0/Ng1NqtiyGsUmeyE77ujRo4vZtddemx73n//5n4vZN7/5zWJW9Z2cadX169Tvc78wAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACT0ML9M1i0YkfcL9rRuwTe84Q1p/t73vreYHXfcccUsu0ZVnY9Zr2OT7tm6PbBsGqr6v7P7tm5H88CBA9NzTpgwoZi96U1vKmZV/c7ZM+roo48uZrvuumsxu/3229Nzfu5znytmWb/s6tWr0+PqWibTpIe5SddyJjvumWeeWcx22mmn9Ljjx48vZv/6r/9avbBXUPXvQ2Tfuz1t3tkY/MIMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACTUyr1Mk6qZrKIlq2CpqsbJ8tGjRxezK6+8Mj3uNttsU8yyGq7sGlXVd7Wq/k2tHJmqusPMbrvtVsw++9nPFrMpU6akxx0xYkQxy9ZbVQWVyfZCV1dXMfurv/qr9LhXXHFFMbv88suL2YwZM9LjPv3002nOpq2q2qzud3Ld10XU/+6sklUs1q2+bFINp1YOAAD4MwZmAABIGJgBACBhYAYAgISBGQAAEgZmAABIqJV7marKpqxKpW51XFXt2bbbblvMPvWpTxWzrDYuImLVqlXF7PHHHy9mWR1Wq1RV76mOq6c31fFl72WHHXZIX7v33nsXs/POO6+Y7bzzzsWs6lmSVUz161d+NLeqzqluNVWVI444opiNGzcufe2Pf/zj2uel92tyX7ZKq+rqHnnkkVrryZ7jTb5Xm7yXTuUXZgAASBiYAQAgYWAGAICEgRkAABIGZgAASBiYAQAgYWAGAICEHuaXaUd/4Oabb57mP/jBD4rZhAkTillVj+5HPvKRYnbhhRcWs1/96lfFbNddd03PmfU+boq9ju3WpIc56wrOXvv8888Xs/79+6fn7OrqqnXOj370o+lxTzvttDQvyd5L1rMcEfGTn/ykmC1durSYZf3pERFXX311MXv/+99fzLK+5GHDhqXnzK599plWXSPIVD2j6vY0t+r7Jjtu375909defvnlxawdnfl1/92JiM7r+H+JX5gBACBhYAYAgISBGQAAEgZmAABIGJgBACBhYAYAgIRauZdpUodStxZtzpw56TknTpxYzP7whz8Us9mzZ6fHveqqq4rZ0KFDi1n2PrPar4iIyy67rJhl1yg7Z9VrKWtS71O3EizbY01qxiZPnlzMTj755PS1da9DVq23YMGC9LVHHXVUMdtiiy2KWVZlFxGxevXqWms66aSTitlhhx2WnnPSpEnF7Pe//30xe/jhh9PjNqk9pPdr8r1Q996qmhGy787ddtutmM2bNy897uLFi4tZ3dmjqsouuw7ZcXvr3vQLMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQUCv3Mk3qUPr371/Msoq3adOmpcfNqraymrYvfelL6XGzepx3v/vdxWzkyJG1jhkRcc8996R5iVq51sju9+x+jsgrBLO6oqpatEx2HwwYMKCYVe3r7LjPPvtsMfvEJz5RzL71rW+l58zWlNVFNjFo0KBi9v73v7+YjRkzJj1u9l7e/OY3F7MlS5akx4UmWlFLWPW67bffvphl+6iqYjH7jqv7/Vf1XlpRy9fJ/MIMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACTUyq2nzTffvJidc845xezDH/5wMauqYLnmmmuK2YknnljMsmqviLzeK6vZyqpmqs5ZVTtXklXrVR23t1bctFpWGxeR3yPZvZXdI01qjg499NBillXOReT31/e///1illXHVb2Xunuh6rg77rhjMbvggguKWVV1XCb7XPbbb79idu+996bHza6RKkma3APZ8yu776r27dve9rZar616L3Xfazv2UG+tgfULMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQMDADAEBCD/N6es1rXlPMdt9992J2/PHHF7MjjzwyPeeMGTOK2YoVK9LXZrJ+xqxHsaoTOVPV01yXruV6mnweWddyJuvgbNJdfOONNxazD3zgA+lxBw4cWMwOPvjgYnbxxRcXs//zf/5Pes66PbCDBg1Kj3vyyScXs6wTuUlf67PPPlvM5s+fn74206l9rfR8de+tbbfdNs2/8IUvFLPsmVm3lz0iol+/8ihX9zkdkX8/NDlup/ILMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQUCv3MkOGDEnzT37yk8VswYIFxWzy5MnFbPr06ek5f//736d5XVmF13vf+95ittlmmxWzRx55JD3nypUri1mTCpuskkflXFmrqoGyyrSszqmqWin7LC+//PJidvTRR6fH/du//dtiNnr06GI2cuTIYvae97wnPWdWz5hdh/vvvz89brbe/v371zrn+eefn57z7LPPLmbLli2rdc6q3L6mSivun+z7L6L+vr7iiitqrScif4432Sd1q+6qzln3+6Hd/MIMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACTUyr3M0KFD0/wjH/lIMctq5U444YRitnz58sp1lTSpZ/n2t79dzLIavKw25xvf+EZ6zhUrVqR5SZO6MerJav4i8iqjutVxrfocv/SlL6X5EUccUcwGDx5czPr1Kz9Cq/Zf3dfusssu6XGz6riurq5iln3e8+bNS8/54IMPpnmJfUsrZd+P2fMre0Zleygi30dN6iIz2T7KrkHV/su+65sctydXx2X8wgwAAAkDMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQ2CA9zFkfX0TeuZd1FmY9iVWy4x544IHF7JBDDkmPe8455xSzpUuXFrP77rsvPW5d2bWdOHFi+tp3vetdxWyzzTYrZlmX5CWXXJKeM9OkU7od3b69XZP9l2nH5/Fv//ZvaT58+PBi9slPfrKYXXvttcVs9erV6TnnzJlTzN761rcWsy233DI9bva5Zc/FLFu5cmXtczbZm/Y1marZo+4zLLu3mvybAHfddVcxu/vuuyvXVUerOo87tUu5Cb8wAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAwsAMAACJbtfK9e/fv5h1dXW15LVNKoWyypNp06YVs6222io9bt3XZu+lX7/8Y1i7dm0x++u//utidv7556fHHThwYDHL1nvVVVcVsyeeeCI9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",
|
32 |
+
"text/plain": [
|
33 |
+
"<Figure size 900x900 with 9 Axes>"
|
34 |
+
]
|
35 |
+
},
|
36 |
+
"metadata": {},
|
37 |
+
"output_type": "display_data"
|
38 |
+
}
|
39 |
+
],
|
40 |
+
"source": [
|
41 |
+
"pattern_get_class = re.compile(r'origin_data/MNIST_data/train/train_\\d+_(\\d).jpg')\n",
|
42 |
+
"path = './origin_data/MNIST_data/train'\n",
|
43 |
+
"fnames = get_image_files(path)\n",
|
44 |
+
"\n",
|
45 |
+
"dls = ImageDataLoaders.from_path_re(\n",
|
46 |
+
" path, fnames, pattern_get_class, valid_pct=0.2, seed=42, item_tfms=Resize(28))\n",
|
47 |
+
"dls.show_batch()"
|
48 |
+
]
|
49 |
+
},
|
50 |
+
{
|
51 |
+
"cell_type": "code",
|
52 |
+
"execution_count": 14,
|
53 |
+
"metadata": {},
|
54 |
+
"outputs": [
|
55 |
+
{
|
56 |
+
"name": "stderr",
|
57 |
+
"output_type": "stream",
|
58 |
+
"text": [
|
59 |
+
"c:\\Users\\xuyax\\anaconda3\\envs\\tesseract\\lib\\site-packages\\torchvision\\models\\_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n",
|
60 |
+
" warnings.warn(\n",
|
61 |
+
"c:\\Users\\xuyax\\anaconda3\\envs\\tesseract\\lib\\site-packages\\torchvision\\models\\_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=ResNet34_Weights.IMAGENET1K_V1`. You can also use `weights=ResNet34_Weights.DEFAULT` to get the most up-to-date weights.\n",
|
62 |
+
" warnings.warn(msg)\n"
|
63 |
+
]
|
64 |
+
},
|
65 |
+
{
|
66 |
+
"data": {
|
67 |
+
"text/html": [
|
68 |
+
"\n",
|
69 |
+
"<style>\n",
|
70 |
+
" /* Turns off some styling */\n",
|
71 |
+
" progress {\n",
|
72 |
+
" /* gets rid of default border in Firefox and Opera. */\n",
|
73 |
+
" border: none;\n",
|
74 |
+
" /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
|
75 |
+
" background-size: auto;\n",
|
76 |
+
" }\n",
|
77 |
+
" progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
|
78 |
+
" background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
|
79 |
+
" }\n",
|
80 |
+
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
|
81 |
+
" background: #F44336;\n",
|
82 |
+
" }\n",
|
83 |
+
"</style>\n"
|
84 |
+
],
|
85 |
+
"text/plain": [
|
86 |
+
"<IPython.core.display.HTML object>"
|
87 |
+
]
|
88 |
+
},
|
89 |
+
"metadata": {},
|
90 |
+
"output_type": "display_data"
|
91 |
+
},
|
92 |
+
{
|
93 |
+
"data": {
|
94 |
+
"text/html": [
|
95 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
96 |
+
" <thead>\n",
|
97 |
+
" <tr style=\"text-align: left;\">\n",
|
98 |
+
" <th>epoch</th>\n",
|
99 |
+
" <th>train_loss</th>\n",
|
100 |
+
" <th>valid_loss</th>\n",
|
101 |
+
" <th>error_rate</th>\n",
|
102 |
+
" <th>time</th>\n",
|
103 |
+
" </tr>\n",
|
104 |
+
" </thead>\n",
|
105 |
+
" <tbody>\n",
|
106 |
+
" <tr>\n",
|
107 |
+
" <td>0</td>\n",
|
108 |
+
" <td>0.716198</td>\n",
|
109 |
+
" <td>0.488728</td>\n",
|
110 |
+
" <td>0.153500</td>\n",
|
111 |
+
" <td>02:11</td>\n",
|
112 |
+
" </tr>\n",
|
113 |
+
" </tbody>\n",
|
114 |
+
"</table>"
|
115 |
+
],
|
116 |
+
"text/plain": [
|
117 |
+
"<IPython.core.display.HTML object>"
|
118 |
+
]
|
119 |
+
},
|
120 |
+
"metadata": {},
|
121 |
+
"output_type": "display_data"
|
122 |
+
},
|
123 |
+
{
|
124 |
+
"data": {
|
125 |
+
"text/html": [
|
126 |
+
"\n",
|
127 |
+
"<style>\n",
|
128 |
+
" /* Turns off some styling */\n",
|
129 |
+
" progress {\n",
|
130 |
+
" /* gets rid of default border in Firefox and Opera. */\n",
|
131 |
+
" border: none;\n",
|
132 |
+
" /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
|
133 |
+
" background-size: auto;\n",
|
134 |
+
" }\n",
|
135 |
+
" progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
|
136 |
+
" background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
|
137 |
+
" }\n",
|
138 |
+
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
|
139 |
+
" background: #F44336;\n",
|
140 |
+
" }\n",
|
141 |
+
"</style>\n"
|
142 |
+
],
|
143 |
+
"text/plain": [
|
144 |
+
"<IPython.core.display.HTML object>"
|
145 |
+
]
|
146 |
+
},
|
147 |
+
"metadata": {},
|
148 |
+
"output_type": "display_data"
|
149 |
+
},
|
150 |
+
{
|
151 |
+
"data": {
|
152 |
+
"text/html": [
|
153 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
154 |
+
" <thead>\n",
|
155 |
+
" <tr style=\"text-align: left;\">\n",
|
156 |
+
" <th>epoch</th>\n",
|
157 |
+
" <th>train_loss</th>\n",
|
158 |
+
" <th>valid_loss</th>\n",
|
159 |
+
" <th>error_rate</th>\n",
|
160 |
+
" <th>time</th>\n",
|
161 |
+
" </tr>\n",
|
162 |
+
" </thead>\n",
|
163 |
+
" <tbody>\n",
|
164 |
+
" <tr>\n",
|
165 |
+
" <td>0</td>\n",
|
166 |
+
" <td>0.094292</td>\n",
|
167 |
+
" <td>0.055268</td>\n",
|
168 |
+
" <td>0.018417</td>\n",
|
169 |
+
" <td>08:30</td>\n",
|
170 |
+
" </tr>\n",
|
171 |
+
" </tbody>\n",
|
172 |
+
"</table>"
|
173 |
+
],
|
174 |
+
"text/plain": [
|
175 |
+
"<IPython.core.display.HTML object>"
|
176 |
+
]
|
177 |
+
},
|
178 |
+
"metadata": {},
|
179 |
+
"output_type": "display_data"
|
180 |
+
}
|
181 |
+
],
|
182 |
+
"source": [
|
183 |
+
"learn = vision_learner(dls, resnet34, metrics=error_rate)\n",
|
184 |
+
"learn.fine_tune(1)\n",
|
185 |
+
"learn.export('model.pkl')"
|
186 |
+
]
|
187 |
+
},
|
188 |
+
{
|
189 |
+
"cell_type": "code",
|
190 |
+
"execution_count": 17,
|
191 |
+
"metadata": {},
|
192 |
+
"outputs": [
|
193 |
+
{
|
194 |
+
"data": {
|
195 |
+
"image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAARGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAAcoAMABAAAAAEAAAAcAAAAAGS99KIAAAElSURBVHic7ZOxioMwGIBjwVgcBHFxc3XQKbg4uvoE7g4dnHwCZzefoX0FxVHI6iiItCAuLoLgIlVQbysc13KxOhxcvzGELx9/EgA+/CkghLIs7yzVdZ1l2Z/rB3IFRVEPBcdxtm2rqtr3/aYu3/fneW7btuu6pmkcx3l5PKHRMAyGYY7HI03T1+s1z/P7/b6pked50zTJ9xPN1HXdoijeTXoBxvh2uxmGsadUEIQ4jqdpOp1Oe3ohhGma1nV9OPw+MdJ3Oo7j5XJhGGZZlt2kAABJkpIkIZGuIE1TRVFIdpKWapoWhmGWZRuqviOKoud5u+kAAKqqWpZFcukPnvx9hFDXdVVVIYQQQmVZRlG0quOJlGXZIAgghBjj8/k8DMMq44d/zhce+2HcZnzrUQAAAABJRU5ErkJggg==",
|
196 |
+
"text/plain": [
|
197 |
+
"PILImage mode=RGB size=28x28"
|
198 |
+
]
|
199 |
+
},
|
200 |
+
"execution_count": 17,
|
201 |
+
"metadata": {},
|
202 |
+
"output_type": "execute_result"
|
203 |
+
}
|
204 |
+
],
|
205 |
+
"source": [
|
206 |
+
"# path = '4.jpg'\n",
|
207 |
+
"path = '5.png'\n",
|
208 |
+
"img = PILImage.create(path)\n",
|
209 |
+
"img"
|
210 |
+
]
|
211 |
+
},
|
212 |
+
{
|
213 |
+
"cell_type": "code",
|
214 |
+
"execution_count": 18,
|
215 |
+
"metadata": {},
|
216 |
+
"outputs": [
|
217 |
+
{
|
218 |
+
"data": {
|
219 |
+
"text/html": [
|
220 |
+
"\n",
|
221 |
+
"<style>\n",
|
222 |
+
" /* Turns off some styling */\n",
|
223 |
+
" progress {\n",
|
224 |
+
" /* gets rid of default border in Firefox and Opera. */\n",
|
225 |
+
" border: none;\n",
|
226 |
+
" /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
|
227 |
+
" background-size: auto;\n",
|
228 |
+
" }\n",
|
229 |
+
" progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
|
230 |
+
" background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
|
231 |
+
" }\n",
|
232 |
+
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
|
233 |
+
" background: #F44336;\n",
|
234 |
+
" }\n",
|
235 |
+
"</style>\n"
|
236 |
+
],
|
237 |
+
"text/plain": [
|
238 |
+
"<IPython.core.display.HTML object>"
|
239 |
+
]
|
240 |
+
},
|
241 |
+
"metadata": {},
|
242 |
+
"output_type": "display_data"
|
243 |
+
},
|
244 |
+
{
|
245 |
+
"data": {
|
246 |
+
"text/html": [],
|
247 |
+
"text/plain": [
|
248 |
+
"<IPython.core.display.HTML object>"
|
249 |
+
]
|
250 |
+
},
|
251 |
+
"metadata": {},
|
252 |
+
"output_type": "display_data"
|
253 |
+
},
|
254 |
+
{
|
255 |
+
"data": {
|
256 |
+
"text/plain": [
|
257 |
+
"('3',\n",
|
258 |
+
" TensorBase(3),\n",
|
259 |
+
" TensorBase([6.3668e-07, 1.2593e-05, 4.9185e-05, 9.0997e-01, 8.6236e-06, 8.9614e-02, 2.0983e-06, 2.7297e-04, 2.3416e-05, 4.7457e-05]))"
|
260 |
+
]
|
261 |
+
},
|
262 |
+
"execution_count": 18,
|
263 |
+
"metadata": {},
|
264 |
+
"output_type": "execute_result"
|
265 |
+
}
|
266 |
+
],
|
267 |
+
"source": [
|
268 |
+
"learn.predict(img)"
|
269 |
+
]
|
270 |
+
}
|
271 |
+
],
|
272 |
+
"metadata": {
|
273 |
+
"kernelspec": {
|
274 |
+
"display_name": "tesseract",
|
275 |
+
"language": "python",
|
276 |
+
"name": "python3"
|
277 |
+
},
|
278 |
+
"language_info": {
|
279 |
+
"codemirror_mode": {
|
280 |
+
"name": "ipython",
|
281 |
+
"version": 3
|
282 |
+
},
|
283 |
+
"file_extension": ".py",
|
284 |
+
"mimetype": "text/x-python",
|
285 |
+
"name": "python",
|
286 |
+
"nbconvert_exporter": "python",
|
287 |
+
"pygments_lexer": "ipython3",
|
288 |
+
"version": "3.9.15"
|
289 |
+
},
|
290 |
+
"orig_nbformat": 4,
|
291 |
+
"vscode": {
|
292 |
+
"interpreter": {
|
293 |
+
"hash": "c8334dffe72b6a881969c3515475442b0cf3f3c8c06d8151aebf952bb4134fbe"
|
294 |
+
}
|
295 |
+
}
|
296 |
+
},
|
297 |
+
"nbformat": 4,
|
298 |
+
"nbformat_minor": 2
|
299 |
+
}
|
utils.py
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import numpy as np
|
2 |
+
import cv2
|
3 |
+
import os
|
4 |
+
import struct
|
5 |
+
|
6 |
+
def trans(image, label, save):
|
7 |
+
if 'train' in os.path.basename(image):
|
8 |
+
prefix = 'train'
|
9 |
+
else:
|
10 |
+
prefix = 'test'
|
11 |
+
|
12 |
+
labelIndex = 0
|
13 |
+
imageIndex = 0
|
14 |
+
i = 0
|
15 |
+
lbdata = open(label, 'rb').read()
|
16 |
+
magic, nums = struct.unpack_from(">II", lbdata, labelIndex)
|
17 |
+
labelIndex += struct.calcsize('>II')
|
18 |
+
|
19 |
+
imgdata = open(image, "rb").read()
|
20 |
+
magic, nums, numRows, numColumns = struct.unpack_from('>IIII', imgdata, imageIndex)
|
21 |
+
imageIndex += struct.calcsize('>IIII')
|
22 |
+
|
23 |
+
for i in range(nums):
|
24 |
+
label = struct.unpack_from('>B', lbdata, labelIndex)[0]
|
25 |
+
labelIndex += struct.calcsize('>B')
|
26 |
+
im = struct.unpack_from('>784B', imgdata, imageIndex)
|
27 |
+
imageIndex += struct.calcsize('>784B')
|
28 |
+
im = np.array(im, dtype='uint8')
|
29 |
+
img = im.reshape(28, 28)
|
30 |
+
save_name = os.path.join(save, '{}_{}_{}.jpg'.format(prefix, i, label))
|
31 |
+
cv2.imwrite(save_name, img)
|
32 |
+
|
33 |
+
if __name__ == '__main__':
|
34 |
+
path = './origin_data'
|
35 |
+
train_images = f'{path}/train-images-idx3-ubyte'
|
36 |
+
train_labels = f'{path}/train-labels-idx1-ubyte'
|
37 |
+
test_images =f'{path}/t10k-images-idx3-ubyte'
|
38 |
+
test_labels = f'{path}/t10k-labels-idx1-ubyte'
|
39 |
+
|
40 |
+
save_train =f'{path}/MNIST_data/train_images/'
|
41 |
+
save_test =f'{path}/MNIST_data/test_images/'
|
42 |
+
|
43 |
+
if not os.path.exists(save_train):
|
44 |
+
os.makedirs(save_train)
|
45 |
+
if not os.path.exists(save_test):
|
46 |
+
os.makedirs(save_test)
|
47 |
+
|
48 |
+
trans(test_images, test_labels, save_test)
|
49 |
+
trans(train_images, train_labels, save_train)
|