{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Gradio_Digit_Recognizer.ipynb", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "code", "metadata": { "id": "EGWK2pKy1mcQ", "outputId": "b496a529-9ba2-4e8c-a25c-1169a78747c5", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "!pip install gradio" ], "execution_count": 1, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", "Collecting gradio\n", " Downloading gradio-3.0.19-py3-none-any.whl (5.1 MB)\n", "\u001b[K |████████████████████████████████| 5.1 MB 4.4 MB/s \n", "\u001b[?25hRequirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from gradio) (1.3.5)\n", "Collecting fsspec\n", " Downloading fsspec-2022.5.0-py3-none-any.whl (140 kB)\n", "\u001b[K |████████████████████████████████| 140 kB 46.5 MB/s \n", "\u001b[?25hCollecting orjson\n", " Downloading orjson-3.7.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (256 kB)\n", "\u001b[K |████████████████████████████████| 256 kB 32.0 MB/s \n", "\u001b[?25hCollecting python-multipart\n", " Downloading python-multipart-0.0.5.tar.gz (32 kB)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from gradio) (2.23.0)\n", "Collecting aiohttp\n", " Downloading aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.1 MB)\n", "\u001b[K |████████████████████████████████| 1.1 MB 37.3 MB/s \n", "\u001b[?25hCollecting fastapi\n", " Downloading fastapi-0.78.0-py3-none-any.whl (54 kB)\n", "\u001b[K |████████████████████████████████| 54 kB 2.6 MB/s \n", "\u001b[?25hCollecting ffmpy\n", " Downloading ffmpy-0.3.0.tar.gz (4.8 kB)\n", "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from gradio) (1.21.6)\n", "Collecting pydub\n", " Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB)\n", "Collecting analytics-python\n", " Downloading analytics_python-1.4.0-py2.py3-none-any.whl (15 kB)\n", "Collecting uvicorn\n", " Downloading uvicorn-0.17.6-py3-none-any.whl (53 kB)\n", "\u001b[K |████████████████████████████████| 53 kB 1.7 MB/s \n", "\u001b[?25hRequirement already satisfied: Jinja2 in /usr/local/lib/python3.7/dist-packages (from gradio) (2.11.3)\n", "Collecting pycryptodome\n", " Downloading pycryptodome-3.14.1-cp35-abi3-manylinux2010_x86_64.whl (2.0 MB)\n", "\u001b[K |████████████████████████████████| 2.0 MB 37.6 MB/s \n", "\u001b[?25hCollecting paramiko\n", " Downloading paramiko-2.11.0-py2.py3-none-any.whl (212 kB)\n", "\u001b[K |████████████████████████████████| 212 kB 11.2 MB/s \n", "\u001b[?25hRequirement already satisfied: pillow in /usr/local/lib/python3.7/dist-packages (from gradio) (7.1.2)\n", "Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from gradio) (3.2.2)\n", "Collecting markdown-it-py[linkify,plugins]\n", " Downloading markdown_it_py-2.1.0-py3-none-any.whl (84 kB)\n", "\u001b[K |████████████████████████████████| 84 kB 2.9 MB/s \n", "\u001b[?25hCollecting multidict<7.0,>=4.5\n", " Downloading multidict-6.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (94 kB)\n", "\u001b[K |████████████████████████████████| 94 kB 2.7 MB/s \n", "\u001b[?25hRequirement already satisfied: typing-extensions>=3.7.4 in /usr/local/lib/python3.7/dist-packages (from aiohttp->gradio) (4.1.1)\n", "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.7/dist-packages (from aiohttp->gradio) (21.4.0)\n", "Collecting yarl<2.0,>=1.0\n", " Downloading yarl-1.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (271 kB)\n", "\u001b[K |████████████████████████████████| 271 kB 10.7 MB/s \n", "\u001b[?25hCollecting aiosignal>=1.1.2\n", " Downloading aiosignal-1.2.0-py3-none-any.whl (8.2 kB)\n", "Collecting asynctest==0.13.0\n", " Downloading asynctest-0.13.0-py3-none-any.whl (26 kB)\n", "Collecting frozenlist>=1.1.1\n", " Downloading frozenlist-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (144 kB)\n", "\u001b[K |████████████████████████████████| 144 kB 42.9 MB/s \n", "\u001b[?25hRequirement already satisfied: charset-normalizer<3.0,>=2.0 in /usr/local/lib/python3.7/dist-packages (from aiohttp->gradio) (2.0.12)\n", "Collecting async-timeout<5.0,>=4.0.0a3\n", " Downloading async_timeout-4.0.2-py3-none-any.whl (5.8 kB)\n", "Requirement already satisfied: idna>=2.0 in /usr/local/lib/python3.7/dist-packages (from yarl<2.0,>=1.0->aiohttp->gradio) (2.10)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from analytics-python->gradio) (1.15.0)\n", "Collecting backoff==1.10.0\n", " Downloading backoff-1.10.0-py2.py3-none-any.whl (31 kB)\n", "Requirement already satisfied: python-dateutil>2.1 in /usr/local/lib/python3.7/dist-packages (from analytics-python->gradio) (2.8.2)\n", "Collecting monotonic>=1.5\n", " Downloading monotonic-1.6-py2.py3-none-any.whl (8.2 kB)\n", "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->gradio) (1.24.3)\n", "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->gradio) (3.0.4)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->gradio) (2022.6.15)\n", "Collecting starlette==0.19.1\n", " Downloading starlette-0.19.1-py3-none-any.whl (63 kB)\n", "\u001b[K |████████████████████████████████| 63 kB 1.4 MB/s \n", "\u001b[?25hRequirement already satisfied: pydantic!=1.7,!=1.7.1,!=1.7.2,!=1.7.3,!=1.8,!=1.8.1,<2.0.0,>=1.6.2 in /usr/local/lib/python3.7/dist-packages (from fastapi->gradio) (1.8.2)\n", "Collecting anyio<5,>=3.4.0\n", " Downloading anyio-3.6.1-py3-none-any.whl (80 kB)\n", "\u001b[K |████████████████████████████████| 80 kB 7.5 MB/s \n", "\u001b[?25hCollecting sniffio>=1.1\n", " Downloading sniffio-1.2.0-py3-none-any.whl (10 kB)\n", "Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.7/dist-packages (from Jinja2->gradio) (2.0.1)\n", "Collecting mdurl~=0.1\n", " Downloading mdurl-0.1.1-py3-none-any.whl (10 kB)\n", "Collecting linkify-it-py~=1.0\n", " Downloading linkify_it_py-1.0.3-py3-none-any.whl (19 kB)\n", "Collecting mdit-py-plugins\n", " Downloading mdit_py_plugins-0.3.0-py3-none-any.whl (43 kB)\n", "\u001b[K |████████████████████████████████| 43 kB 1.7 MB/s \n", "\u001b[?25hCollecting uc-micro-py\n", " Downloading uc_micro_py-1.0.1-py3-none-any.whl (6.2 kB)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->gradio) (1.4.3)\n", "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->gradio) (3.0.9)\n", "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->gradio) (0.11.0)\n", "Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.7/dist-packages (from pandas->gradio) (2022.1)\n", "Collecting bcrypt>=3.1.3\n", " Downloading bcrypt-3.2.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (62 kB)\n", "\u001b[K |████████████████████████████████| 62 kB 817 kB/s \n", "\u001b[?25hCollecting pynacl>=1.0.1\n", " Downloading PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (856 kB)\n", "\u001b[K |████████████████████████████████| 856 kB 42.8 MB/s \n", "\u001b[?25hCollecting cryptography>=2.5\n", " Downloading cryptography-37.0.2-cp36-abi3-manylinux_2_24_x86_64.whl (4.0 MB)\n", "\u001b[K |████████████████████████████████| 4.0 MB 41.9 MB/s \n", "\u001b[?25hRequirement already satisfied: cffi>=1.1 in /usr/local/lib/python3.7/dist-packages (from bcrypt>=3.1.3->paramiko->gradio) (1.15.0)\n", "Requirement already satisfied: pycparser in /usr/local/lib/python3.7/dist-packages (from cffi>=1.1->bcrypt>=3.1.3->paramiko->gradio) (2.21)\n", "Collecting asgiref>=3.4.0\n", " Downloading asgiref-3.5.2-py3-none-any.whl (22 kB)\n", "Requirement already satisfied: click>=7.0 in /usr/local/lib/python3.7/dist-packages (from uvicorn->gradio) (7.1.2)\n", "Collecting h11>=0.8\n", " Downloading h11-0.13.0-py3-none-any.whl (58 kB)\n", "\u001b[K |████████████████████████████████| 58 kB 5.8 MB/s \n", "\u001b[?25hBuilding wheels for collected packages: ffmpy, python-multipart\n", " Building wheel for ffmpy (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for ffmpy: filename=ffmpy-0.3.0-py3-none-any.whl size=4712 sha256=584a279332656f0cc9ad23d319dc8039982a7664cb49fe13ec93aac904c39c3e\n", " Stored in directory: /root/.cache/pip/wheels/13/e4/6c/e8059816e86796a597c6e6b0d4c880630f51a1fcfa0befd5e6\n", " Building wheel for python-multipart (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for python-multipart: filename=python_multipart-0.0.5-py3-none-any.whl size=31678 sha256=993b969457908c9927e8a5cea3fee7ff1aede0a0797d00dc931f9170dc1f1ed9\n", " Stored in directory: /root/.cache/pip/wheels/2c/41/7c/bfd1c180534ffdcc0972f78c5758f89881602175d48a8bcd2c\n", "Successfully built ffmpy python-multipart\n", "Installing collected packages: sniffio, mdurl, uc-micro-py, multidict, markdown-it-py, frozenlist, anyio, yarl, starlette, pynacl, monotonic, mdit-py-plugins, linkify-it-py, h11, cryptography, bcrypt, backoff, asynctest, async-timeout, asgiref, aiosignal, uvicorn, python-multipart, pydub, pycryptodome, paramiko, orjson, fsspec, ffmpy, fastapi, analytics-python, aiohttp, gradio\n", "Successfully installed aiohttp-3.8.1 aiosignal-1.2.0 analytics-python-1.4.0 anyio-3.6.1 asgiref-3.5.2 async-timeout-4.0.2 asynctest-0.13.0 backoff-1.10.0 bcrypt-3.2.2 cryptography-37.0.2 fastapi-0.78.0 ffmpy-0.3.0 frozenlist-1.3.0 fsspec-2022.5.0 gradio-3.0.19 h11-0.13.0 linkify-it-py-1.0.3 markdown-it-py-2.1.0 mdit-py-plugins-0.3.0 mdurl-0.1.1 monotonic-1.6 multidict-6.0.2 orjson-3.7.2 paramiko-2.11.0 pycryptodome-3.14.1 pydub-0.25.1 pynacl-1.5.0 python-multipart-0.0.5 sniffio-1.2.0 starlette-0.19.1 uc-micro-py-1.0.1 uvicorn-0.17.6 yarl-1.7.2\n" ] } ] }, { "cell_type": "code", "metadata": { "id": "WqmBtpF32XH7" }, "source": [ "import gradio as gr" ], "execution_count": 2, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "FTaalj2K6j_f" }, "source": [ "import tensorflow as tf\n", "from matplotlib import pyplot as plt\n", "import numpy as np" ], "execution_count": 3, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "JWIOKC2f9V5P", "outputId": "397c2f84-61df-429f-d945-c601beeac8f3" }, "source": [ "objects = tf.keras.datasets.mnist\n", "(training_images, training_labels), (test_images, test_labels) = objects.load_data()" ], "execution_count": 4, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n", "11493376/11490434 [==============================] - 0s 0us/step\n", "11501568/11490434 [==============================] - 0s 0us/step\n" ] } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 268 }, "id": "_AsSh53N9X_P", "outputId": "f73cc1e4-66d0-4b2d-8dda-295ffcc4cf17" }, "source": [ "for i in range(9):\n", "\t# define subplot\n", "\tplt.subplot(330 + 1 + i)\n", "\t# plot raw pixel data\n", "\tplt.imshow(training_images[i])" ], "execution_count": 5, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "id": "G0_Q5pLr9ddP" }, "source": [ "training_images = training_images / 255.0\n", "test_images = test_images / 255.0" ], "execution_count": 6, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "OF6EiGRM9imU" }, "source": [ "from tensorflow.keras.layers import Flatten, Dense\n", "model = tf.keras.models.Sequential([Flatten(input_shape=(28,28)), \n", " Dense(256, activation='relu'),\n", " Dense(256, activation='relu'),\n", " Dense(128, activation='relu'), \n", " Dense(10, activation=tf.nn.softmax)])" ], "execution_count": 7, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "xWHIRD1m9vVA" }, "source": [ "model.compile(optimizer = 'adam',\n", " loss = 'sparse_categorical_crossentropy',\n", " metrics=['accuracy'])" ], "execution_count": 8, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3bGGj-gB91lX", "outputId": "5ba11842-879d-4a8a-923e-1d57009ed629" }, "source": [ "model.fit(training_images, training_labels, epochs=10)" ], "execution_count": 9, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/10\n", "1875/1875 [==============================] - 12s 6ms/step - loss: 0.2045 - accuracy: 0.9374\n", "Epoch 2/10\n", "1875/1875 [==============================] - 11s 6ms/step - loss: 0.0887 - accuracy: 0.9727\n", "Epoch 3/10\n", "1875/1875 [==============================] - 11s 6ms/step - loss: 0.0655 - accuracy: 0.9791\n", "Epoch 4/10\n", "1875/1875 [==============================] - 12s 7ms/step - loss: 0.0504 - accuracy: 0.9841\n", "Epoch 5/10\n", "1875/1875 [==============================] - 11s 6ms/step - loss: 0.0406 - accuracy: 0.9874\n", "Epoch 6/10\n", "1875/1875 [==============================] - 10s 6ms/step - loss: 0.0361 - accuracy: 0.9887\n", "Epoch 7/10\n", "1875/1875 [==============================] - 11s 6ms/step - loss: 0.0271 - accuracy: 0.9914\n", "Epoch 8/10\n", "1875/1875 [==============================] - 11s 6ms/step - loss: 0.0281 - accuracy: 0.9907\n", "Epoch 9/10\n", "1875/1875 [==============================] - 11s 6ms/step - loss: 0.0230 - accuracy: 0.9929\n", "Epoch 10/10\n", "1875/1875 [==============================] - 11s 6ms/step - loss: 0.0212 - accuracy: 0.9934\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 9 } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "q3bl7yrc94SL", "outputId": "30335e25-fa53-4563-803d-773066effd17" }, "source": [ "test=test_images[0].reshape(-1,28,28)\n", "pred=model.predict(test)\n", "print(pred)" ], "execution_count": 10, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[1.6474190e-15 3.4591168e-09 3.7868028e-10 3.7181343e-12 3.7054815e-09\n", " 5.4921879e-15 4.1937264e-22 9.9999952e-01 3.1958512e-11 5.2578497e-07]]\n" ] } ] }, { "cell_type": "code", "metadata": { "id": "TgRGYoDA-EUS" }, "source": [ "def predict_image(img):\n", " img_3d=img.reshape(-1,28,28)\n", " im_resize=img_3d/255.0\n", " prediction=model.predict(im_resize)\n", " pred=np.argmax(prediction)\n", " return pred\n" ], "execution_count": 11, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "MY3kvSLy-Z7V" }, "source": [ "iface = gr.Interface(predict_image, inputs=\"sketchpad\", outputs=\"label\")\n" ], "execution_count": 12, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 591 }, "id": "roMyVXOI-dHv", "outputId": "86896fb0-a7f6-4674-d8a6-809f89020a84" }, "source": [ "iface.launch(debug='True')" ], "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Colab notebook detected. This cell will run indefinitely so that you can see errors and logs. To turn off, set debug=False in launch().\n", "Running on public URL: https://49286.gradio.app\n", "\n", "This share link expires in 72 hours. For free permanent hosting, check out Spaces (https://huggingface.co/spaces)\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/html": [ "
" ] }, "metadata": {} } ] }, { "cell_type": "code", "metadata": { "id": "AdWgYU9PkzZ9" }, "source": [ "" ], "execution_count": null, "outputs": [] } ] }