|
import streamlit as st |
|
import pandas as pd |
|
import numpy as np |
|
from PIL import Image |
|
import os |
|
from tensorflow.keras.preprocessing.image import ImageDataGenerator |
|
from tensorflow.keras.models import load_model |
|
|
|
|
|
|
|
|
|
model = load_model('model.h5') |
|
img_size = (64, 64) |
|
|
|
def preprocess_input_image(img_path): |
|
img = image.load_img(img_path, target_size=img_size) |
|
img1 = image.load_img(img_path) |
|
x = image.img_to_array(img) |
|
x = np.expand_dims(x, axis=0) |
|
x /= 255. |
|
return x, img1 |
|
|
|
import os |
|
import torch |
|
import torchvision.transforms as transforms |
|
from torch.utils.data import DataLoader |
|
from datasets import load_dataset |
|
|
|
|
|
dataset_path = 'andrewsunanda/fast_food_image_classification' |
|
|
|
|
|
dataset = load_dataset(dataset_path) |
|
|
|
|
|
batch_size = 256 |
|
img_size = (64, 64) |
|
|
|
|
|
train_path = os.path.join(dataset_path, 'Train') |
|
valid_path = os.path.join(dataset_path, 'Valid') |
|
test_path = os.path.join(dataset_path, 'Test') |
|
|
|
|
|
transform = transforms.Compose([ |
|
transforms.Resize(img_size), |
|
transforms.ToTensor(), |
|
]) |
|
|
|
|
|
train_dataset = dataset['train'] |
|
train_dataset = train_dataset.map(lambda x: {'image': transform(x['image']), 'label': x['label']}) |
|
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) |
|
|
|
|
|
valid_dataset = dataset['validation'] |
|
valid_dataset = valid_dataset.map(lambda x: {'image': transform(x['image']), 'label': x['label']}) |
|
valid_loader = DataLoader(valid_dataset, batch_size=batch_size, shuffle=False) |
|
|
|
|
|
test_dataset = dataset['test'] |
|
test_dataset = test_dataset.map(lambda x: {'image': transform(x['image']), 'label': x['label']}) |
|
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) |
|
|
|
|
|
train_datagen = ImageDataGenerator( |
|
rescale=1./255, |
|
horizontal_flip=True |
|
) |
|
|
|
valid_datagen = ImageDataGenerator( |
|
rescale=1./255 |
|
) |
|
test_datagen = ImageDataGenerator( |
|
rescale=1./255 |
|
) |
|
|
|
train_generator = train_datagen.flow_from_directory( |
|
train_path, |
|
target_size=img_size, |
|
batch_size=batch_size, |
|
class_mode='categorical' |
|
) |
|
|
|
valid_generator = valid_datagen.flow_from_directory( |
|
valid_path, |
|
target_size=img_size, |
|
batch_size=batch_size, |
|
class_mode='categorical' |
|
) |
|
|
|
test_generator = test_datagen.flow_from_directory( |
|
test_path, |
|
target_size=img_size, |
|
batch_size=batch_size, |
|
class_mode='categorical' |
|
) |
|
|
|
|
|
class_names = list(train_generator.class_indices.keys()) |
|
train_classes = pd.Series(train_generator.classes) |
|
test_classes = pd.Series(test_generator.classes) |
|
valid_classes = pd.Series(valid_generator.classes) |
|
|
|
def run(): |
|
|
|
st.title('Fast Food Image Prediction') |
|
|
|
|
|
with st.form(key='form_food'): |
|
uploaded_file = st.file_uploader("Choose an image file", type=["jpg", "jpeg", "png"]) |
|
|
|
submitted = st.form_submit_button('Predict') |
|
|
|
|
|
|
|
if submitted: |
|
|
|
if uploaded_file is not None: |
|
|
|
img = Image.open(uploaded_file) |
|
x = np.array(img.resize(img_size))/255. |
|
x = np.expand_dims(x, axis=0) |
|
|
|
|
|
preds = model.predict(x, verbose=0) |
|
pred_class = np.argmax(preds) |
|
pred_class_name = class_names[pred_class] |
|
|
|
|
|
st.image(img, caption=f"Predicted Class: {pred_class_name}", use_column_width=True) |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
run() |