simple-predictor / src /server.py
Thiago Andrade
reroute to new route
d19e1c4
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from fastapi.middleware.cors import CORSMiddleware
from fastbook import *
from pydantic import BaseModel, Field
from pathlib import *
from pathlib import Path
import urllib.request
import base64
from src.modelsetup import setup_model
app = FastAPI()
## Full documentation on https://thiagoh-simple-predictor.hf.space/docs
## Usage
# curl -X GET 'https://thiagoh-simple-predictor.hf.space/?name=uia' -H "Content-Type: application/json"
origins = ["http://thiagoh.github.io", "https://thiagoh.github.io"]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_origin_regex="https?://thiagoh\.github\.io(/?.*)?",
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
fingers_model, bear_model = setup_model()
@app.get("/", response_class=HTMLResponse)
def read_root():
routes = app.routes
print(f'Routes: {routes}')
content = f"""
<html>
<head>
<title>Some HTML in here</title>
</head>
<body>
<h1>Here's the available routes in this app</h1>
<ul>{''.join(map(lambda e: f'<li><a href="https://thiagoh-simple-predictor.hf.space{e.path}">{e.path}</a></li>', routes))}</ul>
<h3>Navigation details</h3>
<p>Navigate to <a href="https://thiagoh-simple-predictor.hf.space">https://thiagoh-simple-predictor.hf.space</a> to hit the application. You can also <code>curl</code> it</p>
</body>
</html>"""
return HTMLResponse(content=content, status_code=200)
class Prediction(BaseModel):
prediction: str
probability: float
imageEncodedBytes: Union[str, None] = None
class InputItem(BaseModel):
imageUrl: Union[str, None] = Field(default=None, title="Url of an image", max_length=2400)
imageEncodedBytes: Union[str, None] = None
@app.post("/predict-finger")
def predict_finger(item: InputItem):
if item.imageUrl:
with urllib.request.urlopen(item.imageUrl) as f:
decoded_bytes = f.read()
encoded_bytes = base64.b64encode(decoded_bytes)
else:
decoded_bytes = base64.b64decode(item.imageEncodedBytes)
encoded_bytes = item.imageEncodedBytes
prediction, prediction_idx, probabilities = fingers_model.predict(PILImage.create(decoded_bytes))
probability: int = probabilities[prediction_idx]
print(f'Prediction: {prediction}; Probability: {probability:.04f}')
return Prediction(prediction=prediction, probability=probability, imageEncodedBytes=encoded_bytes)