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()