| 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" |
|
|
| |
| @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) |
|
|
| |
| @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 |
|
|
| |
| 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 |
|
|
| |
| 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.") |
|
|
| |
| image_display_names = [f"{cls} - {img.name}" for img, cls in all_images] |
| selected_display_name = st.selectbox("Select an image:", image_display_names) |
|
|
| |
| selected_index = image_display_names.index(selected_display_name) |
| selected_image_path, actual_class = all_images[selected_index] |
|
|
| |
| image = Image.open(selected_image_path).convert("RGB").resize((64, 64)) |
|
|
| |
| st.image(image, caption=f"π Original Class: {actual_class}", width=200) |
|
|
| |
| 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.") |
|
|