pillow
torch
torchvision
import json
import torch
import torch.nn as nn
from torchvision import models, transforms
import gradio as gr
from PIL import Image
# โหลด Class names
with open('class_names.json', encoding='utf-8') as f:
meta = json.load(f)
classes, th_names = meta['classes'], meta['th_names']
# โหลดโมเดล ResNet18
model = models.resnet18()
model.fc = nn.Linear(model.fc.in_features, len(classes))
model.load_state_dict(torch.load('siamtech_food10_resnet18.pt', map_location='cpu'))
model.eval()
# Transform
tf = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
])
def predict(img: Image.Image):
if img is None:
return None
x = tf(img.convert('RGB')).unsqueeze(0)
with torch.no_grad():
probs = torch.softmax(model(x)[0], dim=0)
return {th_names.get(classes[i], classes[i]): float(probs[i]) for i in range(len(classes))}
demo = gr.Interface(
fn=predict,
inputs=gr.Image(type='pil', label='อัปโหลดรูปอาหาร 🍜'),
outputs=gr.Label(num_top_classes=3, label='โมเดลคิดว่าเป็น...'),
title='🍜 AroiMai — AI แยกเมนูอาหารไทย',
description='ResNet18 fine-tune โดยนิสิต CpE ม.เกษตรศาสตร์ กำแพงแสน · Workshop "AI in the Real World"',
)
demo.launch()