Оглавление

  1. Вступление
  2. Набор данных
  3. Библиотеки
  4. Предварительная обработка данных
  5. Увеличение данных
  6. Модель
  7. Обучение
  8. Оценка
  9. Тестирование
  10. Повторное использование

Вступление

Болезнь очень распространена среди растений из-за различных факторов, таких как удобрения, соблюдаемые культурные обычаи, условия окружающей среды и т. Д. Эти болезни ухудшают урожайность сельскохозяйственных культур и, в конечном итоге, экономику, основанную на них.

Любая техника или метод для решения этой проблемы и получения предупреждения до того, как растения будут заражены, поможет фермерам эффективно выращивать сельскохозяйственные культуры или растения как в качественном, так и в количественном отношении. Таким образом, обнаружение болезней растений играет очень важную роль в сельском хозяйстве.

Из-за ограниченной вычислительной мощности сложно обучить классификационную модель локально на большинстве обычных машин. Поэтому мы используем вычислительную мощность, предлагаемую ноутбуком Google Colab, поскольку он быстро и легко подключает нас к бесплатному экземпляру TPU.

Итак, без лишних слов, давайте приступим!

Набор данных

Мы используем общедоступный и довольно известный набор данных PlantVillage. Набор данных был опубликован crowAI во время Конкурса по классификации болезней PlantVillage.

Набор данных состоит из примерно 54 305 изображений листьев растений, собранных в контролируемых условиях окружающей среды. На изображениях растений представлены 14 видов растений:

Яблоко, черника, вишня, кукуруза, виноград, апельсин, персик, сладкий перец, картофель, малина, соя, тыква, клубника и помидор.

Набор данных содержит в общей сложности 38 классов болезней растений, перечисленных ниже:

  1. Яблочная парша
  2. Черная гниль яблони
  3. Яблочно-кедровая ржавчина
  4. Здоровое яблоко
  5. Полезная черника
  6. Вишня полезная
  7. Вишневая мучнистая роса
  8. Серая пятнистость листьев кукурузы
  9. Кукуруза обыкновенная ржавчина
  10. Кукуруза полезна
  11. Болезнь северных листьев кукурузы
  12. Виноградная черная гниль
  13. Виноградная черная корь
  14. Упадок виноградных листьев
  15. Полезный виноград
  16. Оранжевый Хуанлунбин
  17. Бактериальное пятно на персике
  18. Полезный персик
  19. Бактериальное пятно болгарского перца
  20. Болгарский перец полезный
  21. Ранняя болезнь картофеля
  22. Полезный картофель
  23. Фитофтороз картофеля
  24. Малина полезна
  25. Соя полезна
  26. Мучнистая роса кабачков
  27. Полезная клубника
  28. Опаление от листьев клубники
  29. Бактериальное пятно на помидоре
  30. Ранняя гниль помидоров
  31. Фитофтороз томатов
  32. Плесень листьев томата
  33. Пятно на листьях томата септориоза
  34. Томатный двухпятнистый паутинный клещ
  35. Целевое пятно помидора
  36. Вирус томатной мозаики
  37. Вирус желтолистной курчавости помидоров
  38. Помидор полезный

Примечание. Набор данных также состоит из дополнительного класса background, чтобы различать листья и их фоновые элементы.

Файл набора данных хранится на Google Диске (GDrive) и может быть передан через URL-адрес, который предоставляет уникальный идентификатор. Используя этот уникальный идентификатор, мы загружаем zip-файл набора данных из GDrive и распаковываем его.

Библиотеки

Мы импортируем все необходимые библиотеки, необходимые для обработки данных и построения модели классификации.

  1. NumPy: библиотека для языка программирования Python, добавляющая поддержку больших многомерных массивов и матриц, а также большой набор высокоуровневых математических функций для работы с этими массивами.
  2. Рассол: Любой объект в Python можно мариновать, чтобы его можно было сохранить на диске. Обработка - это способ преобразовать объект Python (список, словарь и т. Д.) В поток символов. Идея состоит в том, что этот символьный поток содержит всю информацию, необходимую для восстановления объекта в другом скрипте Python.
  3. Cv2 (OpenCV): OpenCV - это библиотека привязок, предназначенная для решения задач компьютерного зрения.
  4. Os: модуль ОС в Python предоставляет функции для создания и удаления каталога (папки), получения его содержимого, изменения и идентификации текущего каталога и т. д. Также возможно автоматическое выполнение многих операций. системные задачи.
  5. Sklearn: бесплатная библиотека машинного обучения для языка программирования Python. Он включает различные алгоритмы классификации, регрессии и кластеризации, включая опорные векторные машины, случайные леса, повышение градиента, k -средства и DBSCAN, и разработан для взаимодействия с числовыми и научными библиотеками Python NumPy и SciPy.
  6. Keras: Keras - это библиотека нейронной сети с открытым исходным кодом, написанная на Python. Разработанный для быстрого экспериментирования с глубокими нейронными сетями, он ориентирован на удобство использования, модульность и расширяемость.
  7. Matplotlib: библиотека построения графиков для языка программирования Python и его расширения числовой математики.

Предварительная обработка данных

Во-первых, давайте определим пару переменных, необходимых для выполнения операций с изображениями набора данных.

  1. Нам нужно изменить размер необработанных изображений набора данных до DEFAULT_IMAGE_SIZE, чтобы он соответствовал входной форме первичного слоя нейронной сети.
  2. Каждый каталог папки набора данных о болезнях растений различается по количеству изображений. Вместо того, чтобы брать их все, мы выбираем первые N_IMAGES из каждого каталога для обучения нашей модели.
  3. Наконец, мы устанавливаем путь к набору данных в root_dir для доступа к изображениям растений.

Теперь мы пишем функцию для преобразования или изменения размера изображений входного набора данных, чтобы их можно было использовать для обучения.

  1. cv2.imread() загружает изображение из указанного файла, если изображение существует, в противном случае возвращает пустую матрицу, если изображение не может быть прочитано.
  2. cv2.resize() изменяет размеры изображения, будь то ширина, высота или и то, и другое. Кроме того, соотношение сторон исходного изображения может быть сохранено в изображении с измененным размером.

Затем мы перебираем папку с набором данных о болезнях растений, изменяем размер изображений из каждой папки и конвертируем или загружаем их в массив NumPy.

После загрузки набора данных изображения мы сопоставляем каждую метку или класс каждой болезни растений с уникальным значением для обучающей задачи. Кроме того, сохранение этого преобразования в файл рассола поможет нам в дальнейшем прогнозировать метку или класс болезни растений на основе выходных данных модели классификации.

Наконец, мы разделили загруженный набор данных изображения на два набора, а именно обучающий и тестовый наборы с коэффициентом разделения 0,2 . Набор для обучения модели классификации и набор тестов для проверки модели во время обучения.

Увеличение данных

Метод увеличения данных используется для значительного увеличения количества изображений в наборе данных. Мы выполняем различные операции, такие как сдвиг, поворот, масштабирование и зеркальное отображение набора данных изображения, чтобы разнообразить наш набор данных.

Предоставление модели дополненных изображений помогает ей эффективно изучать функции из разных областей одного и того же изображения и, таким образом, лучше работать с невидимыми данными изображения.

Примечание. Сейчас мы просто создаем объект из ImageDataGenerator, который позже будет передан модели во время обучения.

Модель

Здесь мы определяем все гиперпараметры нашей модели классификации болезней растений. Выполнение их изначально в отдельной ячейке позволяет нам легко настроить их позже, если это необходимо.

Теперь создадим последовательную модель для задачи классификации. В модели мы не только используем по умолчанию архитектуру «channel_last», но также создаем переключатель для серверных ВМ, поддерживающих «channel_first» в четвертой строке.

Для модели мы сначала создаем сверточный 2D-слой с 32 фильтрами размером 3 x 3 ядро ​​ и активация ReLU (выпрямленного линейного блока). Затем мы выполняем операции пакетной нормализации максимального пула и 2 5% (0,25) выпадения на следующих уровнях.

Затем мы создаем два блока 2D сверточного слоя с 64 фильтрами и активацией ReLU, за которыми следуют объединение и выпадающий слой. Мы повторяем этот шаг для последнего набора слоев FC (полностью подключенных), единственное отличие - 128 фильтров в слое Conv2D.

Обучение

Перед началом обучения нашей модели мы инициализируем наш оптимизатор с параметрами скорости обучения и затухания, которые мы определили выше. Мы выбрали метод оптимизации Адама, поскольку он почти всегда работает быстрее и лучше, чем другие методы оптимизации.

Оценка

Мы строим график, чтобы сравнить максимальную точность, достигаемую моделью, при минимизации потерь на этапе обучения.

Изучая приведенные выше графики, мы видим, что по мере увеличения точности обучения увеличивается точность проверки. Точно так же, когда потеря обучения уменьшается, потеря проверки также уменьшается.

Мы можем получить лучшие результаты, настроив скорость обучения, обучив больше изображений или просто обучив модель для большего количества эпох.

Чтобы проверить фактическую (тестовую) точность модели, которую мы обучили, мы используем метод evaluate() и получаем тестовую точность 98,75% !!

Тестирование

Мы пишем следующую predict_disease функцию для прогнозирования класса или болезни изображения растения. Нам просто нужно указать полный путь к изображению, и оно отображает изображение вместе с его классом прогноза или заболеванием растения.

В целях тестирования мы случайным образом выбираем изображения из набора данных и пытаемся предсказать класс или заболевание изображения растения.

Примечание. (Nota Bene): Изображения для тестирования здесь выбираются случайным образом, и по совпадению все они были предсказаны правильно. Однако это не всегда может сработать так, как мы ожидали или видели здесь. Вы можете наблюдать ложные срабатывания или ложноотрицания в зависимости от качества тестового изображения, эпох обучения, архитектуры модели и типа данных, на которых была обучена модель.

Повторное использование

Мы можем повторно использовать нашу обученную модель и связанные с ней метки, сохранив (выгрузив) ее значения в два отдельных файла. Эти файлы могут быть загружены в любое время позже для классификации болезней растений по изображению.

Теперь, чтобы перезагрузить обученную модель и ее метки, которые мы сохранили выше, мы загружаем файлы из GDrive.

Мы загружаем модель и метки в model и image_labels соответственно.

Наконец, мы предсказываем болезнь растения по изображению.

Полный исходный код этого проекта доступен на GitHub, а записную книжку Google Colab можно посмотреть здесь.

Не стесняйтесь комментировать, если у вас есть предложения или вопросы.
Спасибо за внимание!

Ссылки

  1. Бумага о наборе данных PlantVillage.
  2. Обнаружение болезней растений с помощью сверточной нейронной сети.