Crop-Health-Monitoring-System / predict_single_image.py
Shivani4444's picture
added 7 files
3d07fba verified
Raw
History Blame Contribute Delete
3.32 kB
import cv2
import numpy as np
import joblib
from skimage.feature import hog
svm_model = joblib.load("svm_model.pkl")
scaler = joblib.load("scaler.pkl")
pca = joblib.load("pca_model.pkl")
pca_scaler = joblib.load("pca_scaler.pkl")
label_mapping = np.load("label_mapping.npy", allow_pickle=True).item()
reverse_mapping = {v: k for k, v in label_mapping.items()}
pesticide_db = {
"Tomato___Early_blight": "Chlorothalonil",
"Tomato___Late_blight": "Mancozeb",
"Tomato___healthy": "No pesticide required",
"Maize___Common_rust": "Propiconazole",
"Maize___healthy": "No pesticide required",
}
DEFAULT_PESTICIDE = "Consult Agricultural Expert"
def recommend_quantity(severity):
if severity <= 10:
return "No spray required (Monitoring stage)"
elif severity <= 25:
return "Low Dose (0.5 L/hectare)"
elif severity <= 50:
return "Medium Dose (1.0 L/hectare)"
else:
return "High Dose (1.5 L/hectare) - Immediate Action"
### Image Preprocessing
def preprocess_image(image_path, size=(128, 128)):
img = cv2.imread(image_path)
if img is None:
raise ValueError("Image not found!")
img = cv2.resize(img, size)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
return gray, hsv
### Feature Extraction
def extract_features(gray_img, hsv_img):
hog_features = hog(
gray_img.astype('float32'),
orientations=9,
pixels_per_cell=(16, 16),
cells_per_block=(2, 2),
block_norm='L2-Hys',
visualize=False,
feature_vector=True
).astype('float32')
h_mean = np.mean(hsv_img[:, :, 0])
s_mean = np.mean(hsv_img[:, :, 1])
v_mean = np.mean(hsv_img[:, :, 2])
color_features = np.array([h_mean, s_mean, v_mean], dtype='float32')
combined = np.concatenate((hog_features, color_features))
return combined.reshape(1, -1)
def calculate_severity(gray_img):
_, leaf_mask = cv2.threshold(gray_img, 30, 255, cv2.THRESH_BINARY)
_, disease_mask = cv2.threshold(
gray_img, 0, 255,
cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU
)
disease_mask = cv2.bitwise_and(disease_mask, leaf_mask)
leaf_pixels = np.sum(leaf_mask == 255)
infected_pixels = np.sum(disease_mask == 255)
if leaf_pixels == 0:
return 0
severity = (infected_pixels / leaf_pixels) * 100
return round(severity, 2)
def predict(image_path):
gray, hsv = preprocess_image(image_path)
features = extract_features(gray, hsv)
features = pca_scaler.transform(features)
features = pca.transform(features)
features = scaler.transform(features)
prediction = svm_model.predict(features)[0]
disease_name = reverse_mapping[prediction]
if "healthy" in disease_name.lower():
severity = 0.0
else:
severity = calculate_severity(gray)
if severity!=0.0:
pesticide = pesticide_db.get(disease_name, DEFAULT_PESTICIDE)
else:
pesticide= "No consultant"
quantity = recommend_quantity(severity)
return disease_name,severity,pesticide,quantity
if __name__ == "__main__":
image_path = "PlantVillage-Dataset/processed_dataset/Grape___healthy/3c593da4-e1df-460c-98a9-2bc71df670d5___Mt.N.V_HL 8970.JPG" # Change to your test image
predict(image_path)