| 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" |
|
|
| |
| 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 |
|
|
| |
| 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" |
| predict(image_path) |
|
|