[Solved] leaf disease detection using keras



  • The code given below is for image classification, it seems to be running well until the last iteration which gives the following error >
    "C:/Users/admin/Desktop/plant_disease_classification/plant_disease_classification/untitled1.py", line 45, in <module>
    print (label_binarizer.classes_[predict1])

    AttributeError: 'LabelBinarizer' object has no attribute 'classes_'

    import numpy as np
    import pickle
    import cv2
    from os import listdir
    from sklearn.preprocessing import LabelBinarizer
    from keras.models import load_model
    from keras.models import Sequential
    from keras.preprocessing import image
    from keras.preprocessing.image import img_to_array
    from sklearn.preprocessing import MultiLabelBinarizer
    
    from sklearn.model_selection import train_test_split
    import matplotlib.pyplot as plt
    import tensorflow
    
    default_image_size = tuple((256, 256))
    
    #load the pickle file 
    file_object = open(r'C:\Users\admin\Desktop\pr3\cnn_model.pkl', 'rb')
    model = pickle.load(file_object)
    
    #load the leaf image that is to be classified
    imgpath=r'C:\Users\admin\Desktop\pr1\PlantVillage\diseases\Pepper__bell___healthy\0a3f2927-4410-46a3-bfda-5f4769a5aaf8___JR_HL 8275.JPG'
    
    
    def convert_image_to_array(image_dir):
        try:
            image = cv2.imread(image_dir)
            if image is not None :
                image = cv2.resize(image, default_image_size)   
                return img_to_array(image)
            else :
                return np.array([])
        except Exception as e:
            print(f"Error : {e}")
            return None
    
    imar = convert_image_to_array(imgpath) 
    np_image_list = np.array([imar], dtype=np.float16) / 225.0 
    
    label_binarizer = LabelBinarizer()
    
    predict1 = model.predict(np_image_list) 
    
    print (label_binarizer.classes_[predict1])
    

    the screenshot of the above complied code and error is uploaded for reference.

    Screenshot (142).png



  • @sreu13 said in leaf disease detection using keras:

    AttributeError: 'LabelBinarizer' object has no attribute 'classes_'

    Hi, Can you try downgrade the scikit by typing

    pip install scikit-learn==0.15.2
    

    and are you following any guide or something, if yes can you share that also?



  • @salmanfaris said in leaf disease detection using keras:

    pip install scikit-learn==0.15.2

    tried downgrading, but came up with this error.

    ERROR: Failed building wheel for scikit-learn

    and I've been following Kaggle kernel,
    link-https://www.kaggle.com/emmarex/plant-disease-detection-using-keras



  • I think you need to use the fit or fit_transform function before you predict the classes and use the Binarizer. Have a look at scikit's official documentation for the same.

    https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelBinarizer.html



  • @SuperGops

    i've entered this code,

    def fit_transform(self, n_classes):

    but as I run it, I get the indentation Error given below
    File"C:/Users/admin/Desktop/plant_disease_classification/plant_disease_classification/untitled1.py", line 42
    label_binarizer = LabelBinarizer()
    ^
    IndentationError: expected an indented block



  • @sreu13
    fit and fit_transform are actually inbuilt functions found in the scikit-learn library. So I'd suggest you fit your model with the available data using those functions whose application can be found on scikit-learn's documentation and then proceed with the Binarizer.



  • @SuperGops
    so basically ,i'll have to restart and retrain the model with fit_transform?



  • @sreu13 Yup



  • Could you please follow my steps:

    1. Uninstall your current Python 3.7 version
    2. Install Python 3.6.5
    3. If you are using spyder editor make a change to vscode.
    4. Go to integrated terminal of vscode and create a virtual environment
    python -m venv venv
    
    1. Activate your virtual environment
    .\venv\Scripts\activate
    
    1. Create a requirements.txt over your current working directory. Contents for requirements.txt given below:
    h5py==2.8.0
    imutils==0.5.1
    Keras==2.2.4
    Keras-Applications==1.0.6
    Keras-Preprocessing==1.0.5
    kiwisolver==1.0.1
    matplotlib==3.0.2
    numpy==1.15.3
    opencv-contrib-python==3.4.3.18
    Pillow==5.3.0
    PyWavelets==1.0.1
    scikit-image==0.14.1
    scikit-learn==0.20.0
    scipy==1.1.0
    six==1.11.0
    sklearn==0.0
    tensorboard==1.12.0
    tensorflow==1.12.0
    termcolor==1.1.0
    toolz==0.9.0
    
    1. Then install necessary packages using requirements.txt file
    pip install -r requirements.txt
    
    1. Then run your code within this venv and say what happened as reply here.


  • @SuperGops
    i also have another pickle file "label_transform", which I got as an output from referring the initial code from gaggle, is there any use of this file?

    label_binarizer = LabelBinarizer()
    image_labels = label_binarizer.fit_transform(label_list)
    pickle.dump(label_binarizer,open('label_transform.pkl', 'wb'))
    n_classes = len(label_binarizer.classes_)
    

    Kaggle >https://www.kaggle.com/emmarex/plant-disease-detection-using-keras/data



  • @arunksoman
    i'll follow this proceedure, but would I be able to deploy this code in raspberry pi 4?



  • @sreu13 As the @SuperGops says you have to use fit_transform. It can be implemented on Raspberry Pi 4. But if it slows down your pi you have use multiprocessing as well as threads to improve that.



  • @arunksoman
    by multiprocessing, do you mean to use multilabel binarizer, if yes , then I have already used it during the training process.
    @SuperGops , fit_transform has also been used in the code prior to using label_binarizer.



  • @sreu13 I didn't mean that. I said if you are trying to run your code on RasPi4 or any other version of RasPi, you have to do some optimization on the code for better performance. Then Multiprocessing and threading Module comes into the picture.



  • @arunksoman
    i followed your proceedure to and installed the requirements.txt file
    after running the code, I got the following error

    File "C:\Users\admin\Anaconda3\envs\test2\lib\site-packages\scipy\special\basic.py", line 15, in <module>
    from ._ufuncs import (ellipkm1, mathieu_a, mathieu_b, iv, jv, gamma,

    ImportError: cannot import name 'ellipkm1'



  • @sreu13 I didn't tell you to install anything via anaconda package manager. You have to uninstall those things first and install python 3.6.5. It was the first step.You have to read things carefully before executing anything.



  • @sreu13 how is the progress?



  • @salmanfaris i know there was a delay in replies, i thought of finishing the project and replying here!....
    i ddnt get the exact reason, but the problem was solved

    what i did was , label binarized was working fine when i did created the training model. So i loaded my training model and deleted the script for the training procedure. i ended up with the code given below. and it worked up fine.

    import numpy as np
    import pickle
    import cv2
    from os import listdir
    from sklearn.preprocessing import LabelBinarizer
    from keras.models import Sequential
    from keras.layers.normalization import BatchNormalization
    from keras.layers.convolutional import Conv2D
    from keras.layers.convolutional import MaxPooling2D
    from keras.layers.core import Activation, Flatten, Dropout, Dense
    from keras import backend as K
    from keras.preprocessing.image import ImageDataGenerator
    from keras.optimizers import Adam
    from keras.preprocessing import image
    from keras.preprocessing.image import img_to_array
    from sklearn.preprocessing import MultiLabelBinarizer
    from sklearn.model_selection import train_test_split
    import matplotlib.pyplot as plt
    
    EPOCHS = 25
    INIT_LR = 1e-3
    BS = 32
    default_image_size = tuple((256, 256))
    image_size = 0
    directory_root = 'PlantVillage'
    width=256
    height=256
    depth=3
    
    #Function to convert images to array
    def convert_image_to_array(image_dir):
        try:
            image = cv2.imread(image_dir)
            if image is not None :
                image = cv2.resize(image, default_image_size)   
                return img_to_array(image)
            else :
                return np.array([])
        except Exception as e:
            print(f"Error : {e}")
            return None
    
    listdir(directory_root)
    
    image_list, label_list = [], []
    try:
        print("[INFO] Loading images ...")
        root_dir = listdir(directory_root)
        for directory in root_dir :
            # remove .DS_Store from list
            if directory == ".DS_Store" :
                root_dir.remove(directory)
    
        for plant_folder in root_dir :
            plant_disease_folder_list = listdir(f"{directory_root}/{plant_folder}")
            
            for disease_folder in plant_disease_folder_list :
                # remove .DS_Store from list
                if disease_folder == ".DS_Store" :
                    plant_disease_folder_list.remove(disease_folder)
    
            for plant_disease_folder in plant_disease_folder_list:
                print(f"[INFO] Processing {plant_disease_folder} ...")
                plant_disease_image_list = listdir(f"{directory_root}/{plant_folder}/{plant_disease_folder}")
               
                    
                for single_plant_disease_image in plant_disease_image_list :
                    if single_plant_disease_image == ".DS_Store" :
                        plant_disease_image_list.remove(single_plant_disease_image)
    
                for image in plant_disease_image_list[:200]:
                    image_directory = f"{directory_root}/{plant_folder}/{plant_disease_folder}/{image}"
                    if image_directory.endswith(".jpg") == True or image_directory.endswith(".JPG") == True:
                        image_list.append(convert_image_to_array(image_directory))
                        label_list.append(plant_disease_folder)
        print("[INFO] Image loading completed")  
    except Exception as e:
        print(f"Error : {e}")
    
    image_size = len(image_list)
    
    #Transform Image Labels uisng Scikit Learn's LabelBinarizer
    label_binarizer = LabelBinarizer()
    image_labels = label_binarizer.fit_transform(label_list)
    pickle.dump(label_binarizer,open('label_transform.pkl', 'wb'))
    n_classes = len(label_binarizer.classes_)
    
    #Print the classes
    print(label_binarizer.classes_)
    
    #load saved pickle model
    loaded_model = pickle.load(open('cnn_model.pkl', 'rb'))
    model_disease=loaded_model
    
    
    #load plant leaf image
    image_dir="plantdisease/Validation_Set/Potato___Early_blight/1d301622-e359-49d5-b4ca-6837f254fd1b___RS_Early.B 6719.JPG"
    
    #convert leaf image to arrays
    im=convert_image_to_array(image_dir)
    np_image_li = np.array(im, dtype=np.float16) / 225.0
    npp_image = np.expand_dims(np_image_li, axis=0)
    
    result=model_disease.predict(npp_image)
    print(result)
    
    #printing result
    itemindex = np.where(result==np.max(result))
    print("probability:"+str(np.max(result))+"\n"+label_binarizer.classes_[itemindex[1][0]])
    

Log in to reply
 

Recent Posts

  • You can find analyzed list of projects to make emergency ventilators in response to COVID-19, focusing on free-libre open-source here on COVID-19 Ventilator Projects and Resources and FAQ

    alt text

    read more
  • @Gladiator54 did you getting any updates on the monitor? and how did you flashed the SD card? which OS are you used?

    read more
  • S

    @arunksoman , any idea on this

    read more
  • G

    Hi all,
    My raspberry pi 3b was working recently ... Installed raspbian os.. but lately on inserting sd card no green light blinks ... Just the red light is there for the power supply... The sd card is being read at other sd card readers or in phone but not in raspberry pi ... Have also tested other sd cards but have got no success... Pls do let me know what can i do ?

    read more
  • @Ggreeshma-stani Pretty good than the previous design. I am able to see 2 crystals on the board. Can I know why did you use another one?

    And finally, you can address me as kowshik. No need of sir😉

    read more