|
from fasthtml.common import * |
|
from fasthtml.components import * |
|
from fastai.vision.all import * |
|
import pathlib |
|
|
|
style = Style(""" |
|
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 800px; margin: 0 auto; padding: 20px; } |
|
h2 { color: #2c3e50; } |
|
img { height: 100px; width: auto; } |
|
.image-box { display: flex; } |
|
"""), |
|
|
|
|
|
os.makedirs("uploads", exist_ok=True) |
|
|
|
app, rt = fast_app(hdrs=(style), ) |
|
|
|
plt = platform.system() |
|
if plt == 'Windows': pathlib.PosixPath = pathlib.WindowsPath |
|
learn = load_learner("model.pkl") |
|
|
|
def classify_image(image_path): |
|
img = load_image(image_path) |
|
char,idx,probs = learn.predict(img) |
|
name = " ".join([s.capitalize() for s in (char).split("_")]) |
|
return name, idx, probs |
|
|
|
@rt('/') |
|
def index(): |
|
|
|
return (Titled("Chair vs Lamp Classifier"), |
|
Main(H2("Upload an Image"), |
|
Form( |
|
Input(type="file", name="img_file", accept="image/*", required=True), |
|
Button("Classify"), |
|
enctype="multipart/form-data", |
|
hx_post="/classify", |
|
hx_target="#result" |
|
), |
|
Br(), |
|
Div(id="result"), |
|
H2("Test Images"), |
|
Div( |
|
Img(src="chair1.jpg", hx_trigger="click", hx_get="/classify", |
|
hx_target="#result", hx_vals='{"image_path": "chair1.jpg"}'), |
|
Img(src="chair2.jpg", hx_trigger="click", hx_get="/classify", |
|
hx_target="#result", hx_vals='{"image_path": "chair2.jpg"}'), |
|
Img(src="lamp1.jpg", hx_trigger="click", hx_get="/classify", |
|
hx_target="#result", hx_vals='{"image_path": "lamp1.jpg"}'), |
|
Img(src="lamp2.jpg", hx_trigger="click", hx_get="/classify", |
|
hx_target="#result", hx_vals='{"image_path": "lamp2.jpg"}'), |
|
cls="image-box" |
|
) |
|
)) |
|
|
|
@rt('/classify', methods=['GET', 'POST']) |
|
async def classify(img_file: UploadFile|None = None, |
|
image_path:Str|None = None): |
|
|
|
if img_file: |
|
|
|
image_path = f"uploads/{img_file.filename}" |
|
with open(image_path, "wb") as f: |
|
f.write(await img_file.read()) |
|
|
|
name, idx, probs = classify_image(image_path) |
|
return Img(src=image_path), Div(P(f"This is a {name}."), |
|
P(f"Probability that it's a {name}: {probs[idx]:.4f}")) |
|
|
|
serve() |