leaf_classification / src /prediction.py
Heizsenberg's picture
fix prediction
c27bcf0
import numpy as np
import streamlit as st
import tensorflow as tf
from PIL import Image
from huggingface_hub import hf_hub_download
import os
class_names = [
'Tomato_Bacterial_spot',
'Tomato_Early_blight',
'Tomato_Late_blight',
'Tomato_Leaf_Mold',
'Tomato_Septoria_leaf_spot',
'Tomato_Spider_mites_Two_spotted_spider_mite',
'Tomato__Target_Spot',
'Tomato__Tomato_YellowLeaf__Curl_Virus',
'Tomato__Tomato_mosaic_virus',
'Tomato_healthy'
]
@st.cache_resource
def load_model_from_hub():
model_path = hf_hub_download(
repo_id="Heizsenberg/leaf_classification",
filename="leaf_detection_model.keras",
repo_type="space" # VERY IMPORTANT
)
model = tf.keras.models.load_model(model_path)
return model
def predict_image(model, img):
# Preprocess
img = img.convert("RGB") # VERY IMPORTANT
img = img.resize((128, 128))
img_array = np.array(img) / 255.0
img_array = np.expand_dims(img_array, axis=0)
# 4. Predict
predictions = model.predict(img_array)
predicted_index = np.argmax(predictions[0])
predicted_label = class_names[predicted_index]
confidence = np.max(predictions[0])
return img, predicted_label, confidence
def run():
classifier_model = load_model_from_hub()
st.write("upload a tomato leaf image to be predicted")
uploaded_file = st.file_uploader(
"Choose an tomato leaf image to be uploaded",
type=["JPG", "jpg", "jpeg"] # Specify accepted file types
)
if uploaded_file is not None:
st.success("File uploaded successfully!")
st.write("Filename:", uploaded_file.name)
st.write(uploaded_file)
st.write("Image")
# To read image file buffer as a PIL Image:
img = Image.open(uploaded_file)
image, predicted_class, confidence = predict_image(
classifier_model, img
)
confidence = confidence * 100
# show result
st.image(img, caption="Uploaded Image", use_container_width=True)
st.success(f"Tomato Leaf Prediction: {predicted_class}")
st.write(f"with confidence level of: {confidence}")
if __name__ == '__main__':
run()