Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
LearnJoy-ML
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
chameera
LearnJoy-ML
Commits
4531590e
Commit
4531590e
authored
Feb 13, 2024
by
chameera
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Handwriting model
parent
bcb9c50c
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
1 addition
and
0 deletions
+1
-0
function2.ipynb
function2.ipynb
+1
-0
No files found.
function2.ipynb
0 → 100644
View file @
4531590e
{"cells":[{"cell_type":"code","execution_count":null,"metadata":{"id":"6pajsg8Fie5S"},"outputs":[],"source":["import cv2\n","import numpy as np\n","from keras.models import load_model\n","from PIL import Image\n","import requests\n","import matplotlib.pyplot as plt\n","from io import BytesIO\n","from tensorflow.keras.applications.resnet50 import preprocess_input\n","import imutils\n"]},{"cell_type":"code","execution_count":null,"metadata":{"executionInfo":{"elapsed":542,"status":"ok","timestamp":1702626602134,"user":{"displayName":"Kaushi Gihan","userId":"11214181140146971518"},"user_tz":-330},"id":"j2u2Ou-HjNoa","colab":{"base_uri":"https://localhost:8080/"},"outputId":"0c6866c8-421d-42ea-c443-02b54fb70e09"},"outputs":[{"output_type":"stream","name":"stdout","text":["Writing Handwriting_recognition.py\n"]}],"source":["#%%writefile Handwriting_recognition.py\n","\n","import cv2\n","import numpy as np\n","from keras.models import load_model\n","from PIL import Image\n","\n","\n","# Load the saved model\n","model = load_model('/content/drive/MyDrive/Work_space/Silverline_IT/Project/Learn_Joy/function2/fun2_model/Handwriting_recognition_1/Handwriting_recognition_1.hdf5')\n","\n","\n","\n","def Handwriting_recognition(BB_image:str=None,WB_image:str=None):\n","\n","\n"," if WB_image is not None:\n","\n"," # Load the test image\n"," image = cv2.imread(WB_image)\n"," # Preprocess the image\n"," if image is not None:\n"," #image = cv2.imread(img_path)\n"," gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n"," thresh = cv2.threshold(gray, 0, 255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]\n"," thresh = cv2.resize(thresh, (32, 32), interpolation = cv2.INTER_CUBIC)\n"," thresh = thresh.astype(\"float32\") / 255.0\n"," thresh = np.expand_dims(thresh, axis=-1)\n"," thresh = thresh.reshape(1,32,32,1)\n","\n"," else:\n"," print(\"Invalid or empty image.\")\n","\n","\n"," elif BB_image is not None:\n","\n"," # Load the test image\n"," image = cv2.imread(BB_image)\n","\n"," # Preprocess the image\n"," if image is not None:\n"," #image = cv2.imread(img_path)\n"," image = cv2.resize(cv2.cvtColor(image, cv2.COLOR_BGR2RGB),dsize=(32,32))\n"," image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n"," (thresh, image_binary) = cv2.threshold(image_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)\n"," image_binary = cv2.threshold(image_gray, thresh, 255, cv2.THRESH_BINARY)[1]\n"," thresh = np.array(image_binary)/255.0\n"," thresh = thresh.reshape(-1,32,32,1)\n","\n","\n"," else:\n"," print(\"Invalid or empty image.\")\n","\n"," else:\n"," pass\n","\n"," # Make predictions\n"," predictions = model.predict(thresh)\n"," #print(predictions)\n"," #print(np.argmax(predictions,axis=1))\n","\n"," # Check the shape of predictions\n"," #print(\"Shape of predictions:\", predictions[0].shape)\n","\n"," classes=['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']\n"," lable_nu=list(range(0,len(classes)))\n"," real_lB=dict(zip(lable_nu,classes))\n"," #print(real_lB)\n","\n"," predicted_class = np.vectorize(real_lB.get)(np.argmax(predictions,axis=1))\n"," #print(predicted_class)\n","\n"," return {\"Recognized Character\":predicted_class[0]}\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":984,"status":"ok","timestamp":1702611194909,"user":{"displayName":"Kaushi Gihan","userId":"11214181140146971518"},"user_tz":-330},"id":"mqZIbWYY7nm2","outputId":"0141bae3-3f9f-441c-a449-072e7732dff3"},"outputs":[{"name":"stdout","output_type":"stream","text":["1/1 [==============================] - 0s 81ms/step\n"]},{"data":{"text/plain":["{'Recognized Character': 'A'}"]},"execution_count":4,"metadata":{},"output_type":"execute_result"}],"source":["Handwriting_recognition(\"/content/drive/MyDrive/Work_space/Data set/Learn_Joy/function2/Predict/2313.jpg\")"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":5059,"status":"ok","timestamp":1702611191208,"user":{"displayName":"Kaushi Gihan","userId":"11214181140146971518"},"user_tz":-330},"id":"nVoTmDYD_cjU","outputId":"355070ce-c738-4a25-db36-12151e9c4dc7"},"outputs":[{"name":"stdout","output_type":"stream","text":["1/1 [==============================] - 0s 190ms/step\n"]},{"data":{"text/plain":["{'Recognized Character': 'T'}"]},"execution_count":3,"metadata":{},"output_type":"execute_result"}],"source":["Handwriting_recognition(WB_image=\"/content/drive/MyDrive/Work_space/Data set/Learn_Joy/function2/Predict/img030-047.png\")"]},{"cell_type":"markdown","metadata":{"id":"4ZD0Z_PMb_gK"},"source":["##Predict with bounding box & white bachground"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"t_wTnH1o1Rbq"},"outputs":[],"source":["def sort_contours(cnts, method=\"left-to-right\"):\n"," reverse = False\n"," i = 0\n"," if method == \"right-to-left\" or method == \"bottom-to-top\":\n"," reverse = True\n"," if method == \"top-to-bottom\" or method == \"bottom-to-top\":\n"," i = 1\n"," boundingBoxes = [cv2.boundingRect(c) for c in cnts]\n"," (cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),\n"," key=lambda b:b[1][i], reverse=reverse))\n","\n"," return (cnts, boundingBoxes)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"UXQDSxifuqgs"},"outputs":[],"source":["#image = cv2.imread()\n","\n","model = load_model('/content/drive/MyDrive/Work_space/Silverline_IT/Project/Learn_Joy/function2/fun2_model/Handwriting_recognition_1/Handwriting_recognition_1.hdf5')\n","\n","def get_letters(img):\n"," letters = []\n"," total_bbox_cordi = []\n"," image = cv2.imread(img)\n"," gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n"," ret,thresh1 = cv2.threshold(gray ,127,255,cv2.THRESH_BINARY_INV)\n"," dilated = cv2.dilate(thresh1, None, iterations=2)\n","\n"," cnts = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)\n"," cnts = imutils.grab_contours(cnts)\n"," cnts = sort_contours(cnts, method=\"left-to-right\")[0]\n","\n"," for c in cnts:\n"," if cv2.contourArea(c) > 10:\n"," (x, y, w, h) = cv2.boundingRect(c)\n"," print([x,y,w,h])\n"," single_bbox_cordi = [x,y,w,h]\n"," total_bbox_cordi.append(single_bbox_cordi)\n"," cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)\n"," roi = gray[y:y + h, x:x + w]\n"," thresh = cv2.threshold(roi, 0, 255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]\n"," thresh = cv2.resize(thresh, (32, 32), interpolation = cv2.INTER_CUBIC)\n"," thresh = thresh.astype(\"float32\") / 255.0\n"," thresh = np.expand_dims(thresh, axis=-1)\n"," thresh = thresh.reshape(1,32,32,1)\n"," ypred = model.predict(thresh)\n"," #ypred = LB.inverse_transform(ypred)\n"," [x] = ypred\n"," letters.append(x)\n"," return ypred, image, total_bbox_cordi"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":483,"status":"ok","timestamp":1702566070631,"user":{"displayName":"Kaushi Gihan","userId":"11214181140146971518"},"user_tz":-330},"id":"W8g-434_0_VN","outputId":"ca905f9a-8e8c-457d-bdf3-5e612da69858"},"outputs":[{"name":"stdout","output_type":"stream","text":["[460, 261, 422, 375]\n","1/1 [==============================] - 0s 23ms/step\n"]}],"source":["letter,image,total_bbox_cordi = get_letters('/content/drive/MyDrive/Work_space/Data set/Learn_Joy/function2/Predict/img027-034.png')"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":16,"status":"ok","timestamp":1702566072608,"user":{"displayName":"Kaushi Gihan","userId":"11214181140146971518"},"user_tz":-330},"id":"2L294BJ91ytw","outputId":"8ad0a604-58cf-419f-fc26-7ee4880aef31"},"outputs":[{"name":"stdout","output_type":"stream","text":["[[6.5416185e-05 1.6269371e-09 5.9041672e-04 1.1789890e-08 1.6744872e-07\n"," 1.2843116e-08 4.3512742e-07 8.7157115e-10 9.3695093e-08 1.7395679e-07\n"," 1.3048541e-03 5.8992364e-06 1.0420042e-06 1.1702650e-03 9.9977512e-08\n"," 1.6490534e-07 3.8444973e-04 1.2546275e-08 7.7148997e-08 1.8157302e-06\n"," 9.0535551e-11 2.1660206e-08 6.8394826e-08 2.4115893e-06 2.4366493e-06\n"," 9.9644524e-01 5.0177903e-07 2.9452164e-07 8.7145813e-10 1.6614571e-06\n"," 1.5226144e-08 2.1720891e-05 2.1708865e-10 5.4405479e-08 1.8828146e-07]]\n"]}],"source":["print(letter)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":487},"executionInfo":{"elapsed":2367,"status":"ok","timestamp":1702566154598,"user":{"displayName":"Kaushi Gihan","userId":"11214181140146971518"},"user_tz":-330},"id":"Bp2tzAA1128l","outputId":"9b1ba58b-138e-40c6-e203-4c155f49ccd4"},"outputs":[{"name":"stdout","output_type":"stream","text":["[25]\n","[[460, 261, 422, 375]]\n"]},{"data":{"text/plain":["<matplotlib.image.AxesImage at 0x7de7d293c3d0>"]},"execution_count":63,"metadata":{},"output_type":"execute_result"},{"data":{"image/png":"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\n","text/plain":["<Figure size 640x480 with 1 Axes>"]},"metadata":{},"output_type":"display_data"}],"source":["print(np.argmax(letter,axis=1))\n","print(total_bbox_cordi)\n","plt.imshow(image)"]},{"cell_type":"markdown","metadata":{"id":"TRKxPN7e_7gh"},"source":["##Fast API"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":35668,"status":"ok","timestamp":1702611234404,"user":{"displayName":"Kaushi Gihan","userId":"11214181140146971518"},"user_tz":-330},"id":"qG1kwa3_CvGR","outputId":"9ddaaf93-5abd-4764-fc6b-65739937cc64"},"outputs":[{"name":"stdout","output_type":"stream","text":["Collecting python-multipart\n"," Downloading python_multipart-0.0.6-py3-none-any.whl (45 kB)\n","\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/45.7 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m45.7/45.7 kB\u001b[0m \u001b[31m2.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hInstalling collected packages: python-multipart\n","\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n","lida 0.0.10 requires fastapi, which is not installed.\n","lida 0.0.10 requires kaleido, which is not installed.\n","lida 0.0.10 requires uvicorn, which is not installed.\u001b[0m\u001b[31m\n","\u001b[0mSuccessfully installed python-multipart-0.0.6\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m93.1/93.1 kB\u001b[0m \u001b[31m2.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m67.0/67.0 kB\u001b[0m \u001b[31m4.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25h\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n","lida 0.0.10 requires kaleido, which is not installed.\n","lida 0.0.10 requires uvicorn, which is not installed.\n","tensorflow-probability 0.22.0 requires typing-extensions<4.6.0, but you have typing-extensions 4.9.0 which is incompatible.\u001b[0m\u001b[31m\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m59.7/59.7 kB\u001b[0m \u001b[31m2.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.3/58.3 kB\u001b[0m \u001b[31m7.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25h\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n","lida 0.0.10 requires kaleido, which is not installed.\u001b[0m\u001b[31m\n","\u001b[0mRequirement already satisfied: nest-asyncio in /usr/local/lib/python3.10/dist-packages (1.5.8)\n"]}],"source":["!pip install python-multipart\n","!pip install fastapi -q\n","!pip install pyngrok -q\n","!pip install uvicorn -q\n","!pip install pydantic -q\n","!pip install nest-asyncio"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"iohU7kEWEd70"},"outputs":[],"source":["from fastapi import FastAPI\n","from pydantic import BaseModel\n","import uvicorn\n","from pyngrok import ngrok\n","import nest_asyncio"]},{"cell_type":"code","execution_count":null,"metadata":{"executionInfo":{"elapsed":507,"status":"ok","timestamp":1702626629090,"user":{"displayName":"Kaushi Gihan","userId":"11214181140146971518"},"user_tz":-330},"id":"s_KwQ1_t__TY","colab":{"base_uri":"https://localhost:8080/"},"outputId":"335c81d6-d9e2-4a3b-db4f-0bf341d952af"},"outputs":[{"output_type":"stream","name":"stdout","text":["Writing app02.py\n"]}],"source":["#%%writefile app02.py\n","from fastapi import FastAPI\n","from fastapi import File, UploadFile\n","from typing import List\n","from pydantic import BaseModel\n","import uvicorn\n","\n","\n","import cv2\n","import tempfile\n","import os\n","import shutil\n","\n","app=FastAPI(title=\"Learn Joy\",\n"," description=\"FastAPI for Learn_Joy\",\n"," version=\"0.104.1\")\n","\n","\n","\n","@app.get(\"/\")\n","async def root():\n"," return{\"Fast API\":\"Hello World\"}\n","\n","\n","@app.post(\"/function02/recognition_BB\")\n","async def function2_recognition(BB_image:UploadFile =File(...)):\n"," out_put={}\n"," temp_dir = tempfile.mkdtemp()\n","\n"," # Create a temporary file path foe doner file\n"," BB_image_path = os.path.join(temp_dir,BB_image.filename)\n","\n"," # Write the uploaded file content to the temporary file\n"," with open(BB_image_path, \"wb\") as temp_file1:\n"," shutil.copyfileobj(BB_image.file, temp_file1)\n","\n"," out_put= Handwriting_recognition(BB_image=BB_image_path,WB_image=None)\n","\n","\n"," # Clean up: Remove the temporary directory and its contents\n"," shutil.rmtree(temp_dir)\n","\n"," return out_put\n","\n","@app.post(\"/function02/recognition_WB\")\n","async def function2_recognition(WB_image:UploadFile =File(...)):\n"," out_put={}\n"," # Create a temporary directory\n"," temp_dir = tempfile.mkdtemp()\n"," WB_image_path = os.path.join(temp_dir,WB_image.filename)\n","\n"," # Write the uploaded file content to the temporary file\n"," with open(WB_image_path, \"wb\") as temp_file2:\n"," shutil.copyfileobj(WB_image.file, temp_file2)\n","\n","\n"," out_put= Handwriting_recognition(BB_image=None,WB_image=WB_image_path)\n","\n"," # Clean up: Remove the temporary directory and its contents\n"," shutil.rmtree(temp_dir)\n","\n","\n"," return out_put"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"zFoJ5KojCrn3"},"outputs":[],"source":["ngrok.set_auth_token(\"2YX5IJustLB5zcqU9rbzA9iZLVf_86pZKjHT2kXNELQgLRkyi\")"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"w2y_Zbs9Ctlh","executionInfo":{"status":"ok","timestamp":1702625055784,"user_tz":-330,"elapsed":31613,"user":{"displayName":"Kaushi Gihan","userId":"11214181140146971518"}},"outputId":"e329e6ff-039b-4833-abe8-a787c63cf7e5"},"outputs":[{"metadata":{"tags":null},"name":"stdout","output_type":"stream","text":["Public URL: https://9c75-34-16-185-214.ngrok-free.app\n"]},{"metadata":{"tags":null},"name":"stderr","output_type":"stream","text":["INFO: Started server process [2017]\n","INFO: Waiting for application startup.\n","INFO: Application startup complete.\n","INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)\n"]},{"metadata":{"tags":null},"name":"stdout","output_type":"stream","text":["INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"GET / HTTP/1.1\" 200 OK\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"GET / HTTP/1.1\" 200 OK\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"GET /favicon.ico HTTP/1.1\" 404 Not Found\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"GET /docs HTTP/1.1\" 200 OK\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"GET /openapi.json HTTP/1.1\" 200 OK\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"GET /docs HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 58ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_WB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_WB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_WB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 17ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_WB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 20ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_WB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 17ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 15ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 21ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 17ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 15ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 17ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 18ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 15ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 15ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 15ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 15ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 15ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 15ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 17ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 19ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 14ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 15ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 18ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 15ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 15ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 20ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 18ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 17ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 15ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 17ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 14ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 20ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 17ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 17ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 20ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 15ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 14ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 17ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 19ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n","1/1 [==============================] - 0s 16ms/step\n","INFO: 2402:4000:21c3:1fa7:18b1:f959:46a6:6c1d:0 - \"POST /function02/recognition_BB HTTP/1.1\" 200 OK\n"]},{"output_type":"stream","name":"stderr","text":["INFO: Shutting down\n","INFO: Waiting for application shutdown.\n","INFO: Application shutdown complete.\n","INFO: Finished server process [2017]\n"]}],"source":["ngrok_tunnel = ngrok.connect(8000)\n","print('Public URL:', ngrok_tunnel.public_url)\n","nest_asyncio.apply()\n","uvicorn.run(app, port=8000)"]}],"metadata":{"colab":{"collapsed_sections":["4ZD0Z_PMb_gK"],"provenance":[],"mount_file_id":"1BpT_sd4w1-FwnK-TfsP5vTkDaM5_DE62","authorship_tag":"ABX9TyPh9OwNrIbVLI5ImSKsM1N8"},"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"name":"python"}},"nbformat":4,"nbformat_minor":0}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment