saramneena's picture
Update app.py
3cb453b verified
import streamlit as st
import os
from pathlib import Path
from PIL import Image
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder
DATASET_PATH = "PlantVillage"
# Loading image data from dataset
@st.cache_resource
def load_data(data_dir, img_size=(64, 64)):
X, y = [], []
for class_name in os.listdir(data_dir):
class_path = os.path.join(data_dir, class_name)
if os.path.isdir(class_path):
for file in os.listdir(class_path):
if file.lower().endswith((".jpg", ".jpeg", ".png")):
img_path = os.path.join(class_path, file)
try:
img = Image.open(img_path).convert("RGB").resize(img_size)
X.append(np.array(img).flatten())
y.append(class_name)
except Exception as e:
print(f"Error loading image {img_path}: {e}")
return np.array(X) / 255.0, np.array(y)
# βœ… Training model using RandomForest
@st.cache_resource
def train_model():
X, y = load_data(DATASET_PATH)
le = LabelEncoder()
y_encoded = le.fit_transform(y)
model = RandomForestClassifier()
model.fit(X, y_encoded)
return model, le
# βœ… Getting all images from dataset folders
def get_all_images(data_dir):
image_paths = []
valid_extensions = (".jpg", ".jpeg", ".png")
for class_name in os.listdir(data_dir):
class_path = Path(data_dir) / class_name
if class_path.is_dir():
for file in class_path.iterdir():
if file.suffix.lower() in valid_extensions:
image_paths.append((file, class_name))
return image_paths
# βœ… Streamlit UI
st.set_page_config(page_title="πŸ₯” Potato Leaf Viewer", layout="centered")
st.title("πŸ₯” Potato Leaf Image Viewer + Classifier")
all_images = get_all_images(DATASET_PATH)
if all_images:
st.success(f"βœ… Found {len(all_images)} images in dataset.")
# Show filenames for selection
image_display_names = [f"{cls} - {img.name}" for img, cls in all_images]
selected_display_name = st.selectbox("Select an image:", image_display_names)
# Find selected image
selected_index = image_display_names.index(selected_display_name)
selected_image_path, actual_class = all_images[selected_index]
# Load and show image (small size)
image = Image.open(selected_image_path).convert("RGB").resize((64, 64))
# Show image in smaller size
st.image(image, caption=f"πŸ“‚ Original Class: {actual_class}", width=200)
# Predict
model, le = train_model()
img_array = np.array(image).flatten().reshape(1, -1) / 255.0
prediction = model.predict(img_array)
predicted_class = le.inverse_transform(prediction)[0]
st.markdown(f"### 🧠 Predicted Class: **{predicted_class}**")
else:
st.warning("⚠️ No images found in the dataset. Please check the folder structure.")