Spaces:
Sleeping
Sleeping
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() | |
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 | |
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) | |