Руководство по созданию системы обнаружения болезней растений.

Оглавление-

  1. Введение
  2. Описание данных
  3. Используемая метрика
  4. Функция потерь
  5. Исследование данных
  6. Обучающий тестовый сплит
  7. Моделирование
  8. Предсказание по изображениям
  9. Библиотека FastAi
  10. Результаты
  11. использованная литература

Введение-

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

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

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

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

Набор данных Описание-

Я использовал «набор данных PlantVillage», который доступен по ссылке ниже -

git clone https://github.com/spMohanty/PlantVillage-Dataset
cd PlantVillage-Dataset
  • Набор данных содержит 54 305 изображений. На изображениях представлены 14 видов сельскохозяйственных культур: яблоко, черника, сладкий перец, вишня, виноград, апельсин, персик, картофель, малина, соя, кабачки, клубника и помидоры.
  • Он содержит изображения 17 грибковых заболеваний, 4 бактериальных заболеваний, 2 болезней плесени (оомицетов), 2 вирусных заболеваний и 1 болезни, вызванной клещом. У 12 видов сельскохозяйственных культур также есть изображения здоровых листьев, которые явно не поражены болезнью.
  • Набор данных содержит 38 классов пар болезней сельскохозяйственных культур и перечислен ниже:

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

Используемая метрика

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

Итак, здесь мы используем-

  • Точность
  • Отзывать
  • F1_Score

Давайте разберемся в следующих показателях:

  1. Точность - выражает долю точек данных, которые, по мнению нашей модели, были релевантными, действительно были релевантными.

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

3. F1_Score - его можно интерпретировать как средневзвешенное значение точности и запоминания, когда оценка F1 достигает своего лучшего значения при 1 и худшего результата при 0.

Функция потерь

Здесь мы используем категориальную кросс-энтропию как функцию потерь для минимизации. Это также называется Softmax Loss. Это активация Softmax плюс потеря кросс-энтропии. Если мы используем эту потерю, мы обучим CNN выводить вероятность по классам C для каждого изображения. Используется для мультиклассовой классификации.

Изучение данных-

Во-первых, нам нужно импортировать некоторые важные библиотеки, чтобы облегчить нашу работу.

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

и в результате выполнения приведенного выше кода мы получаем следующий вывод:

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

А вот результат вышеприведенного кода:

  • Как вы можете заметить, количество изображений в каждом классе разное, поэтому это случай несбалансированных данных, и поэтому мы не можем полагаться на точность.
  • Если просуммировать общее количество изображений, мы получим 54305 изображений.
  • Затем мы попытаемся получить путь и метку для каждого изображения, используя приведенный ниже код:

  • Давайте построим по 10 изображений каждого класса и визуализируем их.

  • Двигаясь дальше, как насчет того, чтобы нарисовать по одному изображению для каждого класса и присвоить им ярлыки:

Тренировка-тест Сплит-

Процесс разделения данных на обучающие и тестовые.

  • создайте две папки в папке с данными и назовите их поезд и тест.
  • В папке train и test создайте подпапку c, где c - количество классов, присутствующих в папке данных с таким же именем, как у class.
  • Теперь создайте фрейм данных, который содержит путь к изображению (например, Apple__Apple_scab / 00075aa8 ..) как имя_файла, метку и имя класса.
  • Используя генератор numpy биономиальных чисел, сгенерируйте 54305 (равное количеству изображений) число с n = 1 (кол-во следов), p = 0.8 (train_size).
  • Запустите цикл по имени файла в df. Если сгенерированное число равно 1, добавьте это изображение (имя файла) для обучения, иначе оно перейдет в тест.

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

Моделирование-

  • Я пробовал разные модели, но здесь я пишу о модели, которая лучше всего подходит для этого случая.
  • Попробовав разные модели, я обнаружил, что модель Inception V3 - лучшая модель.
  • Итак, давайте перейдем к изучению его использования здесь с помощью трансферного обучения.
  • Также мы применили здесь увеличение изображения, которое используется для искусственного увеличения вариаций изображений в наборе данных с помощью горизонтального / вертикального переворачивания, поворота, изменения яркости изображений, горизонтального / вертикального сдвига и т. Д., И это увеличение изображения выполняется ImageDataGenerator.

  • Мы используем поток Keras из каталога, чтобы получить данные о поездах и тестах. Не забудьте установить shuffle = False в test_generator, иначе при прогнозировании будет случайность.

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

  • Поскольку это несбалансированные данные, мы можем использовать здесь Accuracy в качестве метрики, и нам нужно использовать F1_score, precision и вспомнить, но проблема в том, что у Keras нет этих метрик, поэтому мы получаем их с помощью метода обратного вызова Keras.

  • Пришло время представить другие функции обратного вызова, доступные в keras и соответствующие модели.

  • Постройте график потерь поезда и теста, а также различные показатели на данных поезда и теста

  • Прогнозирование по тестовым данным - нам нужно сбросить тестовый генератор перед использованием pred_generator, чтобы избежать странных / случайных выходных данных.

  • y_pred имеет предсказанные метки, но мы не можем просто сказать, что это за предсказания, потому что все, что мы можем видеть, это числа вроде 0,1,4,1,0,6…
    и, что наиболее важно, нам нужно сопоставить предсказывали метки с их уникальными идентификаторами, такими как имена файлов, чтобы узнать, что мы предсказали для какого изображения.

  • Давайте визуализируем матрицу путаницы, точности и отзыва.

Предсказание по изображениям-

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

  • Предсказание на некоторых изображениях-

Библиотека FAST-AI-

  • А как насчет того, чтобы попробовать новую библиотеку для той же проблемы, поэтому здесь я пробую библиотеку Fast AI для обнаружения болезни в растении.
  • Первый шаг - импортировать библиотеку

  • Загрузка данных и получение классов, присутствующих в data- ImageDataBunch.from_folder может использоваться для загрузки данных, которые имеют следующую структуру.

-Тренироваться

-Class1
 -Class2
 -...

-Действительный

-Class1
 -Class2
 -...

  • Покажите случайный пакет изображений с помощью метода show_batch.

  • Здесь для моделирования мы используем архитектуру resnet34, которая используется с помощью метода cnn_learner библиотеки fastai, и для соответствия модели используется цикл fit_one, который в основном меняет скорость обучения с течением времени для достижения лучших результатов.

  • Интерпретируйте результаты и постройте изображения с максимальными потерями, матрицей путаницы и наиболее запутанным прогнозом.

  • Прогнозирование по одному изображению-

Таким образом, можно сделать вывод, что с библиотекой FASTAI очень просто работать. Мы можем получить различные методы с помощью одной строчки кода.

Результаты-

Подведем итоги в красивой таблице.

Ссылки-

1- https://arxiv.org/ftp/arxiv/papers/1604/1604.03169.pdf

2- https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

3- https://github.com/bkleyn/plant_diseases

Спасибо за чтение !!!