Spaces:
Runtime error
Runtime error
import PIL | |
from torchvision import datasets, transforms, models | |
import torch | |
from PIL import Image | |
import torch.nn as nn | |
import pandas as pd | |
import numpy as np | |
import numpy | |
import gradio as gr | |
# import warnings | |
# warnings.filterwarnings("ignore", category=UserWarning) | |
class_names = ['apple_pie', | |
'bibimbap', | |
'cannoli', | |
'edamame', | |
'falafel', | |
'french_toast', | |
'ramen', | |
'sushi', | |
'tiramisu'] | |
# def pil_loader(path): | |
# with open(path, 'rb') as f: | |
# img = Image.open(f) | |
# return img.convert('RGB') | |
# def predict(img_path): | |
# # Load and preprocess the image | |
# # image = pil_loader(img_path) | |
# # Convert Gradio image input to a NumPy array | |
# img_array = img_path.astype(np.uint8) | |
# # # Convert NumPy array to PIL Image | |
# image = Image.fromarray(img_array) | |
# test_transforms = transforms.Compose([ | |
# transforms.Resize(256), | |
# transforms.CenterCrop(224), | |
# transforms.ToTensor(), | |
# transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) | |
# ]) | |
# # Apply transformations | |
# image = test_transforms(image) | |
# inf_model = models.resnet18(pretrained=False) | |
# num_ftrs = inf_model.fc.in_features | |
# # Here the size of each output sample is set to 2. | |
# # Alternatively, it can be generalized to nn.Linear(num_ftrs, len(class_names)). | |
# inf_model.fc = nn.Linear(num_ftrs, len(class_names)) | |
# # model_1 = model_1.to(device) | |
# inf_model.to(torch.device('cpu')) | |
# inf_model.load_state_dict(torch.load('./resnet18_tinyfood_classifier.pth', map_location='cpu')) | |
# # Perform inference | |
# with torch.no_grad(): | |
# inf_model.eval() | |
# out = inf_model(image.unsqueeze(0)) # Add batch dimension | |
# # Get the predicted class and confidence | |
# _, preds = torch.max(out, 1) | |
# idx = preds.cpu().numpy()[0] | |
# pred_class = class_names[idx] | |
# # Assuming `out` is logits, you may need to apply softmax instead of sigmoid | |
# probabilities = torch.softmax(out, dim=1) # Apply softmax to get probabilities | |
# confidence = probabilities[0, idx].item() * 100 # Get confidence for the predicted class | |
# nutrition_data_path = './food-data.csv' | |
# # Membaca file CSV | |
# df = pd.read_csv(nutrition_data_path) | |
# # Mencocokkan prediksi dengan data CSV | |
# if pred_class.capitalize() in df["Makanan"].values: | |
# row = df.loc[df["Makanan"] == pred_class.capitalize()] | |
# # Convert int64 values to native Python data types | |
# calories = int(row["Kalori"].values[0]) | |
# protein = int(row["Protein"].values[0]) | |
# fat = int(row["Lemak"].values[0]) | |
# carbs = int(row["Karbohidrat"].values[0]) | |
# fiber = int(row["Serat"].values[0]) | |
# sugar = int(row["Gula"].values[0]) | |
# price = int(row["Harga (Rp)"].values[0]) | |
# # # Mengambil informasi gizi | |
# # calories = row["Kalori"].values[0] | |
# # protein = row["Protein"].values[0] | |
# # fat = row["Lemak"].values[0] | |
# # carbs = row["Karbohidrat"].values[0] | |
# # fiber = row["Serat"].values[0] | |
# # sugar = row["Gula"].values[0] | |
# # price = row["Harga (Rp)"].values[0] | |
# return pred_class, calories, protein, fat, carbs, fiber, sugar, price | |
# else: | |
# nutrition_info = None | |
# return 'Food not found', 0, 0, 0, 0, 0, 0 | |
# # return pred_class, confidence | |
# img_path = '/content/drive/MyDrive/Assignment-Citra-SkillacademyAI/bibimbap.jpeg' | |
# print(predict(img_path)) | |
def pil_loader(path): | |
# Define a function to load an image using PIL and convert it to RGB format | |
with open(path, 'rb') as f: | |
with open(path, 'rb') as f: | |
img = Image.open(f) | |
return img.convert('RGB') | |
def predict(img_path): | |
# Load and preprocess the image | |
##### Uncomment: without gradio | |
# image = pil_loader(img_path) | |
##### Uncomment: with gradio | |
# Convert Gradio image input to a NumPy array | |
img_array = img_path.astype(np.uint8) | |
# Convert NumPy array to PIL Image | |
image = Image.fromarray(img_array) | |
# Define transformations to apply to the image | |
test_transforms = transforms.Compose([ | |
transforms.Resize(256), | |
transforms.CenterCrop(224), | |
transforms.ToTensor(), | |
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) | |
]) | |
# Apply transformations | |
image = test_transforms(image) | |
# Load a pre-trained ResNet18 model and modify the fully connected layer | |
inf_model = models.resnet18(pretrained=False) | |
num_ftrs = inf_model.fc.in_features | |
# Here the size of each output sample is set to 2. | |
# Alternatively, it can be generalized to nn.Linear(num_ftrs, len(class_names)). | |
inf_model.fc = nn.Linear(num_ftrs, len(class_names)) | |
# model_1 = model_1.to(device) | |
# Move the model to CPU and load its state dict from the specified path | |
inf_model.to(torch.device('cpu')) | |
inf_model.load_state_dict(torch.load('./resnet18_tinyfood_classifier.pth', map_location='cpu')) | |
# Perform inference on the image using the model | |
with torch.no_grad(): | |
inf_model.eval() | |
out = inf_model(image.unsqueeze(0)) # Add batch dimension | |
# Get the predicted class and confidence | |
_, preds = torch.max(out, 1) | |
idx = preds.cpu().numpy()[0] | |
pred_class = class_names[idx] | |
# Assuming `out` is logits, you may need to apply softmax instead of sigmoid | |
# Apply softmax to get probabilities and calculate confidence for the predicted class | |
probabilities = torch.softmax(out, dim=1) # Apply softmax to get probabilities | |
confidence = probabilities[0, idx].item() * 100 # Get confidence for the predicted class | |
# Read nutrition data from a CSV file and match the predicted class | |
nutrition_data_path = './food-data.csv' | |
df = pd.read_csv(nutrition_data_path) | |
if pred_class.capitalize() in df["Makanan"].values: | |
row = df.loc[df["Makanan"] == pred_class.capitalize()] | |
# Extract nutrition information for the predicted class | |
calories = row["Kalori"].values[0] | |
protein = row["Protein"].values[0] | |
fat = row["Lemak"].values[0] | |
carbs = row["Karbohidrat"].values[0] | |
fiber = row["Serat"].values[0] | |
sugar = row["Gula"].values[0] | |
price = row["Harga (Rp)"].values[0] | |
return pred_class, calories, protein, fat, carbs, fiber, sugar, price | |
# return "Food", 1, 1, 1, 1, 1, 1 | |
# return calories | |
else: | |
nutrition_info = None | |
# Return 'Food not found' message if predicted class not in the nutrition data | |
return 'Food not found', 0, 0, 0, 0, 0, 0 | |
# return "Text2" | |
# return pred_class, confidence | |
# img_path = '/content/drive/MyDrive/Assignment-Citra-SkillacademyAI/bibimbap.jpeg' | |
# img_path = '/content/drive/MyDrive/Assignment-Citra-SkillacademyAI/food-101-tiny/cannoli.jpeg' | |
# print(predict(img_path)) | |
# interface = gr.Interface( | |
# predict, | |
# inputs="image", | |
# title="Cafe App", | |
# description="This App will provide the information of your food choice in Selera Cafe. The menu includes: Apple Pie, Bibimbap, Cannoli, Edamame, Falafel, French Toast, Ramen, Sushi, Tiramisu. Enjoy your food!", | |
# outputs=[ | |
# gr.Text(label="Food Label"), | |
# gr.Number(label="Calories"), | |
# gr.Number(label="Protein"), | |
# gr.Number(label="Fat"), | |
# gr.Number(label="Carbs"), | |
# gr.Number(label="Fiber"), | |
# gr.Number(label="Sugar"), | |
# gr.Number(label="Price") | |
# ], | |
# examples = [ | |
# './bibimbap.jpeg', | |
# './apple-pie.jpeg', | |
# './cannoli.jpeg' | |
# ]) | |
# interface.launch() | |
interface = gr.Interface( | |
predict, | |
inputs="image", | |
title="Selera Cafe App", | |
description="This App will provide the information of your food choice in Selera Cafe. The menu includes: Apple Pie, Bibimbap, Cannoli, Edamame, Falafel, French Toast, Ramen, Sushi, Tiramisu. Enjoy your food!", | |
# outputs=gr.Text(), | |
outputs=[ | |
gr.Text(label="Food Label"), | |
gr.Text(label="Calories"), | |
gr.Text(label="Protein"), | |
gr.Text(label="Fat"), | |
gr.Text(label="Carbs"), | |
gr.Text(label="Fiber"), | |
gr.Text(label="Sugar"), | |
gr.Text(label="Price") | |
], | |
# examples = [ | |
# '/content/drive/MyDrive/Assignment-Citra-SkillacademyAI/bibimbap.jpeg', | |
# '/content/drive/MyDrive/Assignment-Citra-SkillacademyAI/food-101-tiny/apple-pie.jpeg', | |
# '/content/drive/MyDrive/Assignment-Citra-SkillacademyAI/food-101-tiny/cannoli.jpeg' | |
# ]) | |
examples = [ | |
'./bibimbap.jpeg', | |
'./apple-pie.jpeg', | |
'./cannoli.jpeg' | |
]) | |
interface.launch() | |
# Type is not JSON serializable: numpy.int64 |