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)