{ "cells": [ { "cell_type": "markdown", "id": "fb0b148e", "metadata": {}, "source": [ "# This notebook is the .ipynb file for the model. \n", "The code has been commmented in order to explain various parts, including the unused commented out parts." ] }, { "cell_type": "code", "execution_count": 1, "id": "e39e2ed1", "metadata": {}, "outputs": [], "source": [ "#|default_exp app" ] }, { "cell_type": "code", "execution_count": 2, "id": "35ff6d9b", "metadata": {}, "outputs": [], "source": [ "# The various ~| comments are needed to turn this into a .py file\n", "# The export comments specify to export said cell" ] }, { "cell_type": "code", "execution_count": 3, "id": "435a6f23", "metadata": {}, "outputs": [], "source": [ "# On my computer, I use Anaconda, where these packages are already installed, so there is no need to install them on the notebook\n", "# On HuggingFaceSpaces, these packages have been put into requirements.txt so that the website installs them\n", "# Therefore there is no need to install them \n", "\n", "#%pip install -q gradio\n", "#%pip install fastbook\n", "#%pip install -Uqq fastai" ] }, { "cell_type": "code", "execution_count": 4, "id": "a89a7628", "metadata": {}, "outputs": [], "source": [ "#|export\n", "# Importing neccesary modules\n", "import fastbook\n", "fastbook.setup_book()\n", "from fastbook import *\n", "from fastai.vision.widgets import *\n", "from fastai.vision.all import *\n", "import gradio as gr" ] }, { "cell_type": "code", "execution_count": 5, "id": "8c95d6bd", "metadata": {}, "outputs": [], "source": [ "# There was an error with the module Pillow, it was not updated and I attempted to update it within the notebook\n", "# This was not neccesary as I updated Pillow on my anaconda app and it fixed it.\n", "\n", "#!pip uninstall Pillow\n", "#!pip install Pillow" ] }, { "cell_type": "code", "execution_count": 6, "id": "fe4889a5", "metadata": {}, "outputs": [], "source": [ "# There was an error the first time I ran this code on the notebook: \"NotImplementedError: cannot instantiate 'PosixPath' on your system\"\n", "# this code fixed it, but as it is suited for windows,\n", "# this causes an error on HuggingSpaceFaces, which likely uses linux. \n", "# Strangely, simply commenting this code out does not cause the initial error on HuggingFaceSpaces and works for it\n", "\n", "import pathlib\n", "temp = pathlib.PosixPath\n", "pathlib.PosixPath = pathlib.WindowsPath" ] }, { "cell_type": "code", "execution_count": 7, "id": "d1d0d596", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\Adnan\\anaconda3\\lib\\site-packages\\gradio\\inputs.py:256: UserWarning: Usage of gradio.inputs is deprecated, and will not be supported in the future, please import your component from gradio.components\n", " warnings.warn(\n", "C:\\Users\\Adnan\\anaconda3\\lib\\site-packages\\gradio\\deprecation.py:40: UserWarning: `optional` parameter is deprecated, and it has no effect\n", " warnings.warn(value)\n", "C:\\Users\\Adnan\\anaconda3\\lib\\site-packages\\gradio\\outputs.py:196: UserWarning: Usage of gradio.outputs is deprecated, and will not be supported in the future, please import your components from gradio.components\n", " warnings.warn(\n", "C:\\Users\\Adnan\\anaconda3\\lib\\site-packages\\gradio\\deprecation.py:40: UserWarning: The 'type' parameter has been deprecated. Use the Number component instead.\n", " warnings.warn(value)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", "To create a public link, set `share=True` in `launch()`.\n" ] }, { "data": { "text/plain": [ "(, 'http://127.0.0.1:7860/', None)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#|export\n", "learn_inf = load_learner('NovaOrToastModel.pkl') # Loading the model\n", "learn_inf.dls.vocab # Returns a list of the categories\n", "categories = learn_inf.dls.vocab\n", "\n", "# Gradio code:\n", "\n", "# Function for Gradio to use to classify images\n", "def classify_image(img):\n", " pred, idx, probs = learn_inf.predict(img)\n", " return dict(zip(categories, map(float,probs)))\n", "\n", "image = gr.inputs.Image(shape=(192,192)) \n", "label = gr.outputs.Label()\n", "examples = [\"ToastTest.jpeg\"]\n", "\n", "intf = gr.Interface(fn=classify_image, inputs=image, outputs=label, examples=examples)\n", "intf.launch(inline=False)" ] }, { "cell_type": "code", "execution_count": 17, "id": "300585db", "metadata": {}, "outputs": [ { "ename": "FileNotFoundError", "evalue": "[Errno 2] No such file or directory: 'C:\\\\Users\\\\Adnan\\\\Downloads\\\\Fast AI\\\\Lesson 2 Git\\\\NovaOrToast\\\\NovaOrToast\\\\nbdev\\\\_nbdev.py'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", "Input \u001b[1;32mIn [17]\u001b[0m, in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\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[0;32m 4\u001b[0m \u001b[38;5;66;03m# There were many problems getting notebook2script to work\u001b[39;00m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;66;03m# The fix was to add a text document into the folder called 'settings.ini', for which I used the author's standard settings\u001b[39;00m\n\u001b[0;32m 6\u001b[0m \u001b[38;5;66;03m# which works\u001b[39;00m\n\u001b[1;32m----> 8\u001b[0m \u001b[43mnotebook2script\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mapp.ipynb\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", "File \u001b[1;32m~\\anaconda3\\lib\\site-packages\\nbdev\\export.py:445\u001b[0m, in \u001b[0;36mnotebook2script\u001b[1;34m(fname, silent, to_dict, bare)\u001b[0m\n\u001b[0;32m 443\u001b[0m d \u001b[38;5;241m=\u001b[39m collections\u001b[38;5;241m.\u001b[39mdefaultdict(\u001b[38;5;28mlist\u001b[39m) \u001b[38;5;28;01mif\u001b[39;00m to_dict \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 444\u001b[0m modules \u001b[38;5;241m=\u001b[39m create_mod_files(files, to_dict, bare\u001b[38;5;241m=\u001b[39mbare)\n\u001b[1;32m--> 445\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m f \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28msorted\u001b[39m(files): d \u001b[38;5;241m=\u001b[39m \u001b[43m_notebook2script\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodules\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msilent\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msilent\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mto_dict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43md\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbare\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbare\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 446\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m to_dict: \u001b[38;5;28;01mreturn\u001b[39;00m d\n\u001b[0;32m 447\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m fname \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m: add_init(get_config()\u001b[38;5;241m.\u001b[39mpath(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mlib_path\u001b[39m\u001b[38;5;124m\"\u001b[39m))\n", "File \u001b[1;32m~\\anaconda3\\lib\\site-packages\\nbdev\\export.py:380\u001b[0m, in \u001b[0;36m_notebook2script\u001b[1;34m(fname, modules, silent, to_dict, bare)\u001b[0m\n\u001b[0;32m 378\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mopen\u001b[39m(fname_out, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124ma\u001b[39m\u001b[38;5;124m'\u001b[39m, encoding\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mutf8\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;28;01mas\u001b[39;00m f: f\u001b[38;5;241m.\u001b[39mwrite(code)\n\u001b[0;32m 379\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00me\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.py\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m mod\u001b[38;5;241m.\u001b[39mmodules: mod\u001b[38;5;241m.\u001b[39mmodules\u001b[38;5;241m.\u001b[39mappend(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00me\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.py\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m--> 380\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m has_setting: \u001b[43msave_nbdev_module\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmod\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 382\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m silent: \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mConverted \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfname\u001b[38;5;241m.\u001b[39mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 383\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m to_dict\n", "File \u001b[1;32m~\\anaconda3\\lib\\site-packages\\nbdev\\export.py:290\u001b[0m, in \u001b[0;36msave_nbdev_module\u001b[1;34m(mod)\u001b[0m\n\u001b[0;32m 288\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSave `mod` inside _nbdev\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 289\u001b[0m fname \u001b[38;5;241m=\u001b[39m get_config()\u001b[38;5;241m.\u001b[39mpath(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mlib_path\u001b[39m\u001b[38;5;124m\"\u001b[39m)\u001b[38;5;241m/\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_nbdev.py\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m--> 290\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mfname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mr\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m f: code \u001b[38;5;241m=\u001b[39m f\u001b[38;5;241m.\u001b[39mread()\n\u001b[0;32m 291\u001b[0m t \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mr\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,\u001b[39m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124mn \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mjoin([\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mk\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m: \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mv\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m k,v \u001b[38;5;129;01min\u001b[39;00m mod\u001b[38;5;241m.\u001b[39mindex\u001b[38;5;241m.\u001b[39mitems()])\n\u001b[0;32m 292\u001b[0m code \u001b[38;5;241m=\u001b[39m _re_index_idx\u001b[38;5;241m.\u001b[39msub(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mindex = \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39m t \u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m}\u001b[39m\u001b[38;5;124m\"\u001b[39m, code)\n", "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'C:\\\\Users\\\\Adnan\\\\Downloads\\\\Fast AI\\\\Lesson 2 Git\\\\NovaOrToast\\\\NovaOrToast\\\\nbdev\\\\_nbdev.py'" ] } ], "source": [ "# Notebook2script simply turns the specified cells into a .py file for usage in HuggingFaceSpaces\n", "from nbdev.export import notebook2script\n", "\n", "# There were many problems getting notebook2script to work\n", "# The fix was to add a text document into the folder called 'settings.ini', for which I used the author's standard settings\n", "# This works. It creates a file called app.py and a folder called nbdev to place it in\n", "# But it returns the error \"FileNotFoundError: [Errno 2] No such file or directory: 'C:\\\\Users\\\\Adnan\\\\Downloads\\\\Fast AI\\\\Lesson 2 Git\\\\NovaOrToast\\\\NovaOrToast\\\\nbdev\\\\_nbdev.py'\"\n", "\n", "notebook2script('app.ipynb')" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.12" } }, "nbformat": 4, "nbformat_minor": 5 }