Spaces:
Runtime error
Runtime error
Upload 4 files
Browse files- app.py +14 -0
- model.h5 +3 -0
- train_model.ipynb +271 -0
app.py
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import tensorflow as tf
|
3 |
+
|
4 |
+
model = tf.keras.models.load_model("model.h5")
|
5 |
+
|
6 |
+
|
7 |
+
def sketch_recognition(img):
|
8 |
+
img = img.reshape(1, 28, 28, 1).astype('float32') / 255
|
9 |
+
prediction = model.predict(img)
|
10 |
+
return int(tf.argmax(prediction, 1))
|
11 |
+
|
12 |
+
|
13 |
+
gr.Interface(fn=sketch_recognition, inputs="sketchpad",
|
14 |
+
outputs="text").launch()
|
model.h5
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:dd3ea33e4f093192d767c800f3f4015f9667e1513fc7723bb51d85bc21d20adc
|
3 |
+
size 1509520
|
train_model.ipynb
ADDED
@@ -0,0 +1,271 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 1,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [
|
8 |
+
{
|
9 |
+
"name": "stderr",
|
10 |
+
"output_type": "stream",
|
11 |
+
"text": [
|
12 |
+
"2023-01-18 06:19:20.044209: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n",
|
13 |
+
"2023-01-18 06:19:20.044256: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n"
|
14 |
+
]
|
15 |
+
},
|
16 |
+
{
|
17 |
+
"name": "stdout",
|
18 |
+
"output_type": "stream",
|
19 |
+
"text": [
|
20 |
+
"WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n"
|
21 |
+
]
|
22 |
+
},
|
23 |
+
{
|
24 |
+
"name": "stderr",
|
25 |
+
"output_type": "stream",
|
26 |
+
"text": [
|
27 |
+
"2023-01-18 06:19:24.572788: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory\n",
|
28 |
+
"2023-01-18 06:19:24.572842: W tensorflow/stream_executor/cuda/cuda_driver.cc:269] failed call to cuInit: UNKNOWN ERROR (303)\n",
|
29 |
+
"2023-01-18 06:19:24.572888: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (Tasus): /proc/driver/nvidia/version does not exist\n",
|
30 |
+
"2023-01-18 06:19:24.573984: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n",
|
31 |
+
"To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
|
32 |
+
]
|
33 |
+
},
|
34 |
+
{
|
35 |
+
"name": "stdout",
|
36 |
+
"output_type": "stream",
|
37 |
+
"text": [
|
38 |
+
"Epoch 1/7\n",
|
39 |
+
"1719/1719 [==============================] - 19s 11ms/step - loss: 0.1568 - accuracy: 0.9527 - val_loss: 0.0546 - val_accuracy: 0.9846\n",
|
40 |
+
"Epoch 2/7\n",
|
41 |
+
"1719/1719 [==============================] - 19s 11ms/step - loss: 0.0528 - accuracy: 0.9837 - val_loss: 0.0425 - val_accuracy: 0.9888\n",
|
42 |
+
"Epoch 3/7\n",
|
43 |
+
"1719/1719 [==============================] - 19s 11ms/step - loss: 0.0365 - accuracy: 0.9887 - val_loss: 0.0359 - val_accuracy: 0.9894\n",
|
44 |
+
"Epoch 4/7\n",
|
45 |
+
"1719/1719 [==============================] - 18s 10ms/step - loss: 0.0267 - accuracy: 0.9913 - val_loss: 0.0347 - val_accuracy: 0.9894\n",
|
46 |
+
"Epoch 5/7\n",
|
47 |
+
"1719/1719 [==============================] - 18s 11ms/step - loss: 0.0198 - accuracy: 0.9940 - val_loss: 0.0402 - val_accuracy: 0.9888\n",
|
48 |
+
"Epoch 6/7\n",
|
49 |
+
"1719/1719 [==============================] - 18s 10ms/step - loss: 0.0162 - accuracy: 0.9945 - val_loss: 0.0366 - val_accuracy: 0.9898\n",
|
50 |
+
"Epoch 7/7\n",
|
51 |
+
"1719/1719 [==============================] - 18s 10ms/step - loss: 0.0126 - accuracy: 0.9954 - val_loss: 0.0317 - val_accuracy: 0.9924\n"
|
52 |
+
]
|
53 |
+
},
|
54 |
+
{
|
55 |
+
"data": {
|
56 |
+
"image/png": "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",
|
57 |
+
"text/plain": [
|
58 |
+
"<Figure size 432x288 with 1 Axes>"
|
59 |
+
]
|
60 |
+
},
|
61 |
+
"metadata": {
|
62 |
+
"needs_background": "light"
|
63 |
+
},
|
64 |
+
"output_type": "display_data"
|
65 |
+
},
|
66 |
+
{
|
67 |
+
"data": {
|
68 |
+
"image/png": "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",
|
69 |
+
"text/plain": [
|
70 |
+
"<Figure size 432x288 with 1 Axes>"
|
71 |
+
]
|
72 |
+
},
|
73 |
+
"metadata": {
|
74 |
+
"needs_background": "light"
|
75 |
+
},
|
76 |
+
"output_type": "display_data"
|
77 |
+
},
|
78 |
+
{
|
79 |
+
"name": "stderr",
|
80 |
+
"output_type": "stream",
|
81 |
+
"text": [
|
82 |
+
"2023-01-18 06:21:33.070595: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.\n"
|
83 |
+
]
|
84 |
+
},
|
85 |
+
{
|
86 |
+
"name": "stdout",
|
87 |
+
"output_type": "stream",
|
88 |
+
"text": [
|
89 |
+
"INFO:tensorflow:Assets written to: model.pb/assets\n",
|
90 |
+
"Test accuracy: 0.9905999898910522\n"
|
91 |
+
]
|
92 |
+
}
|
93 |
+
],
|
94 |
+
"source": [
|
95 |
+
"import tensorflow as tf\n",
|
96 |
+
"from tensorflow import keras\n",
|
97 |
+
"from tensorflow.keras import layers\n",
|
98 |
+
"from tensorflow.keras.callbacks import ModelCheckpoint\n",
|
99 |
+
"from keras.preprocessing.image import ImageDataGenerator\n",
|
100 |
+
"import matplotlib.pyplot as plt\n",
|
101 |
+
"\n",
|
102 |
+
"\n",
|
103 |
+
"\n",
|
104 |
+
"# Load the MNIST dataset\n",
|
105 |
+
"(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()\n",
|
106 |
+
"x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255\n",
|
107 |
+
"x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255\n",
|
108 |
+
"\n",
|
109 |
+
"x_val = x_train[:5000]\n",
|
110 |
+
"y_val = y_train[:5000]\n",
|
111 |
+
"x_train = x_train[5000:]\n",
|
112 |
+
"y_train = y_train[5000:]\n",
|
113 |
+
"\n",
|
114 |
+
"# Define the model\n",
|
115 |
+
"model = keras.Sequential()\n",
|
116 |
+
"model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))\n",
|
117 |
+
"model.add(layers.MaxPooling2D((2, 2)))\n",
|
118 |
+
"model.add(layers.Conv2D(64, (3, 3), activation='relu'))\n",
|
119 |
+
"model.add(layers.MaxPooling2D((2, 2)))\n",
|
120 |
+
"model.add(layers.Flatten())\n",
|
121 |
+
"model.add(layers.Dense(64, activation='relu'))\n",
|
122 |
+
"model.add(layers.Dense(10, activation='softmax'))\n",
|
123 |
+
"\n",
|
124 |
+
"# Compile the model\n",
|
125 |
+
"model.compile(optimizer='adam',\n",
|
126 |
+
" loss='sparse_categorical_crossentropy',\n",
|
127 |
+
" metrics=['accuracy'])\n",
|
128 |
+
"checkpoint = ModelCheckpoint('model.h5', save_best_only=True, save_weights_only=False, mode='auto', period=1)\n",
|
129 |
+
"\n",
|
130 |
+
"\n",
|
131 |
+
"# Train the model\n",
|
132 |
+
"history = model.fit(x_train, y_train, epochs=7, validation_data=(x_val, y_val), callbacks=[checkpoint])\n",
|
133 |
+
"\n",
|
134 |
+
"# Plot accuracy vs epoch\n",
|
135 |
+
"plt.plot(history.history['accuracy'])\n",
|
136 |
+
"plt.plot(history.history['val_accuracy'])\n",
|
137 |
+
"plt.title('Model accuracy')\n",
|
138 |
+
"plt.ylabel('Accuracy')\n",
|
139 |
+
"plt.xlabel('Epoch')\n",
|
140 |
+
"plt.legend(['Train', 'Validation'], loc='upper left')\n",
|
141 |
+
"plt.show()\n",
|
142 |
+
"\n",
|
143 |
+
"# Plot loss vs epoch\n",
|
144 |
+
"plt.plot(history.history['loss'])\n",
|
145 |
+
"plt.plot(history.history['val_loss'])\n",
|
146 |
+
"plt.title('Model loss')\n",
|
147 |
+
"plt.ylabel('Loss')\n",
|
148 |
+
"plt.xlabel('Epoch')\n",
|
149 |
+
"plt.legend(['Train', 'Validation'], loc='upper left')\n",
|
150 |
+
"plt.show()\n",
|
151 |
+
"\n",
|
152 |
+
"\n",
|
153 |
+
"# Save the model in protobuf format\n",
|
154 |
+
"tf.saved_model.save(model, 'model.pb')\n",
|
155 |
+
"\n",
|
156 |
+
"# Evaluate the model on test data\n",
|
157 |
+
"test_loss, test_acc = model.evaluate(x_test, y_test, verbose=0)\n",
|
158 |
+
"print('Test accuracy:',test_acc)\n"
|
159 |
+
]
|
160 |
+
},
|
161 |
+
{
|
162 |
+
"cell_type": "code",
|
163 |
+
"execution_count": null,
|
164 |
+
"metadata": {},
|
165 |
+
"outputs": [],
|
166 |
+
"source": []
|
167 |
+
},
|
168 |
+
{
|
169 |
+
"cell_type": "code",
|
170 |
+
"execution_count": 2,
|
171 |
+
"metadata": {},
|
172 |
+
"outputs": [
|
173 |
+
{
|
174 |
+
"name": "stdout",
|
175 |
+
"output_type": "stream",
|
176 |
+
"text": [
|
177 |
+
"313/313 [==============================] - 1s 4ms/step - loss: 0.0314 - accuracy: 0.9906\n",
|
178 |
+
"Test accuracy: 0.9905999898910522\n"
|
179 |
+
]
|
180 |
+
}
|
181 |
+
],
|
182 |
+
"source": [
|
183 |
+
"test_loss, test_acc = model.evaluate(x_test, y_test)\n",
|
184 |
+
"print('Test accuracy:', test_acc)\n"
|
185 |
+
]
|
186 |
+
},
|
187 |
+
{
|
188 |
+
"cell_type": "code",
|
189 |
+
"execution_count": 3,
|
190 |
+
"metadata": {},
|
191 |
+
"outputs": [
|
192 |
+
{
|
193 |
+
"name": "stdout",
|
194 |
+
"output_type": "stream",
|
195 |
+
"text": [
|
196 |
+
"Running on local URL: http://127.0.0.1:7860\n",
|
197 |
+
"\n",
|
198 |
+
"To create a public link, set `share=True` in `launch()`.\n"
|
199 |
+
]
|
200 |
+
},
|
201 |
+
{
|
202 |
+
"data": {
|
203 |
+
"text/html": [
|
204 |
+
"<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>"
|
205 |
+
],
|
206 |
+
"text/plain": [
|
207 |
+
"<IPython.core.display.HTML object>"
|
208 |
+
]
|
209 |
+
},
|
210 |
+
"metadata": {},
|
211 |
+
"output_type": "display_data"
|
212 |
+
},
|
213 |
+
{
|
214 |
+
"data": {
|
215 |
+
"text/plain": []
|
216 |
+
},
|
217 |
+
"execution_count": 3,
|
218 |
+
"metadata": {},
|
219 |
+
"output_type": "execute_result"
|
220 |
+
}
|
221 |
+
],
|
222 |
+
"source": [
|
223 |
+
"import gradio as gr\n",
|
224 |
+
"import tensorflow as tf\n",
|
225 |
+
"\n",
|
226 |
+
"model = tf.keras.models.load_model(\"model.h5\")\n",
|
227 |
+
"\n",
|
228 |
+
"def sketch_recognition(img):\n",
|
229 |
+
" img = img.reshape(1, 28, 28, 1).astype('float32') / 255\n",
|
230 |
+
" prediction = model.predict(img)\n",
|
231 |
+
" return int(tf.argmax(prediction, 1))\n",
|
232 |
+
"\n",
|
233 |
+
"gr.Interface(fn=sketch_recognition, inputs=\"sketchpad\", outputs=\"label\").launch()"
|
234 |
+
]
|
235 |
+
},
|
236 |
+
{
|
237 |
+
"cell_type": "code",
|
238 |
+
"execution_count": null,
|
239 |
+
"metadata": {},
|
240 |
+
"outputs": [],
|
241 |
+
"source": []
|
242 |
+
}
|
243 |
+
],
|
244 |
+
"metadata": {
|
245 |
+
"kernelspec": {
|
246 |
+
"display_name": "Python 3",
|
247 |
+
"language": "python",
|
248 |
+
"name": "python3"
|
249 |
+
},
|
250 |
+
"language_info": {
|
251 |
+
"codemirror_mode": {
|
252 |
+
"name": "ipython",
|
253 |
+
"version": 3
|
254 |
+
},
|
255 |
+
"file_extension": ".py",
|
256 |
+
"mimetype": "text/x-python",
|
257 |
+
"name": "python",
|
258 |
+
"nbconvert_exporter": "python",
|
259 |
+
"pygments_lexer": "ipython3",
|
260 |
+
"version": "3.10.9"
|
261 |
+
},
|
262 |
+
"orig_nbformat": 4,
|
263 |
+
"vscode": {
|
264 |
+
"interpreter": {
|
265 |
+
"hash": "e7370f93d1d0cde622a1f8e1c04877d8463912d04d973331ad4851f04de6915a"
|
266 |
+
}
|
267 |
+
}
|
268 |
+
},
|
269 |
+
"nbformat": 4,
|
270 |
+
"nbformat_minor": 2
|
271 |
+
}
|