| from fasthtml_hf import setup_hf_backup |
| from fasthtml import FastHTML |
| from monsterui.core import Theme |
| from fasthtml.common import * |
| import os, uvicorn |
| from starlette.responses import FileResponse |
| from starlette.datastructures import UploadFile |
| from fastai.vision.all import * |
|
|
|
|
| theme = Theme.blue |
| app, rt = fast_app(hdrs=theme.headers()) |
|
|
| os.makedirs("uploads", exist_ok=True) |
|
|
| def classify(image_path): |
| im = PILImage.create(image_path) |
| learn = load_learner("model.pkl") |
| cls,idx,probs = learn.predict(im) |
| return cls,probs[idx] |
| |
|
|
| @app.get("/") |
| def home(): |
| return Title("German Bread Classification"), Main( |
| H1("German Bread Classification App"), |
| Form( |
| Input(type="file", name="image", accept="image/*", required=True), |
| Button("Classify"), |
| enctype="multipart/form-data", |
| hx_post="/classify", |
| hx_target="#result" |
| ), |
| Br(), Div(id="result"), |
| cls="container" |
| ) |
|
|
| @app.post("/classify") |
| async def handle_classify(image:UploadFile): |
| |
| image_path = f"uploads/{image.filename}" |
| with open(image_path, "wb") as f: |
| f.write(await image.read()) |
| |
| result = classify(image_path) |
| |
| return Div( |
| P(f"Classification result: {result}"), |
| Img(src=f"/uploads/{image.filename}", alt="Uploaded image", style="max-width: 300px;") |
| ) |
|
|
| @app.get("/uploads/{filename}") |
| async def serve_upload(filename: str): |
| return FileResponse(f"uploads/{filename}") |
|
|
| setup_hf_backup(app) |
| serve() |
|
|