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

В этом руководстве я научу вас, как комплексно решить эту проблему, используя методы глубокого обучения для мультиклассовой классификации изображений и Tensorflow.js для развертывания построенной модели и выполнения логических выводов в браузере. В этом подробном руководстве подробно описаны все основные этапы, от загрузки наборов данных через Kaggle API до создания модели с помощью передачи обучения с помощью Keras (MobileNet) и, наконец, развертывания модели с помощью Tensorflow.js.

Требование / предварительные условия

Это руководство для новичков, однако от вас ожидаются базовые знания Python, Javascript, работы с записной книжкой Jupyter и построения моделей машинного обучения или глубокого обучения. Не волнуйтесь, если вы не соответствуете этим требованиям. В руководстве будут упрощены шаги, которые помогут хотя бы получить свежую информацию. Другие очень необходимые требования:

  • Учетная запись Google для доступа к диску Google и блокнот Google для совместной работы (мы будем использовать эту среду и блокнот Google colab, чтобы упростить процесс построения / обучения модели и получить доступ к бесплатному графическому процессору, отметьте здесь, чтобы начать),
  • Учетная запись Kaggle для загрузки необходимых наборов данных для обучения нашей модели с помощью учетных данных Kaggle API. Пожалуйста, проверьте «https://www.kaggle.com/ru, чтобы начать работу,
  • IDE (например, VSCode) для написания кодов Javascript,
  • И самое главное, те, кто не хочет учиться.

Начиная

Первый шаг к началу работы - настройка вашей среды.

  1. Зайдите на свой Google диск на https://drive.google.com/ и создайте новую папку РАСПОЗНАВАНИЕ ЗАБОЛЕВАНИЙ.
  2. Создайте новый файл совместной работы Google в этой папке, чтобы настроить среду, например, plantdiseaserecognition.ipynb.
  3. Измените среду выполнения Google Colab на графический процессор, чтобы оптимизировать процесс обучения модели. Среда выполнения ›Изменить тип среды выполнения› Выберите графический процессор в качестве предпочтительного аппаратного ускорителя.

Итак, ребята, приступим!

Коды и реализация

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

ШАГ 1. - Настройка среды и подключение Google Colab к нашей учетной записи на Google Диске

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

Во-первых, вам необходимо подключить среду Google colab к своей учетной записи на диске Google и изменить рабочий каталог на папку, созданную вами ранее на диске Google «РАСПОЗНАВАНИЕ ЗАБОЛЕВАНИЙ». Запустите эту ячейку в своей записной книжке и авторизуйтесь при необходимости.

# Connecting Google drive to Google colab environment
from google.colab import drive
drive.mount('/content/drive')
# Change working directory to folder created previously
cd '/content/drive/My Drive/PLANT DISEASE RECOGNITION'

Следующим шагом является создание необходимых папок, которые нам понадобятся для хорошей структуры проекта. Это папки «config» (для сохранения наших файлов конфигурации), «models» (для сохранения наших обученных моделей и весов), «datasets» (для сохранения наших загруженных наборов данных), «checkpoints» (для сохранения наших контрольных точек обучения модели). Вы можете легко сделать это, запустив эту команду в другой ячейке кода: -

# Creating neccesary directories
!mkdir config datasets checkpoints models

ШАГ 2. - Загрузка необходимых наборов данных из Kaggle с помощью Kaggle API

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

Чтобы получить свой API-ключ, войдите в свою учетную запись kaggle на https://kaggle.com и перейдите в раздел своей учетной записи: -

Прокрутите вниз до раздела API на странице своей учетной записи и нажмите «Создать новый токен API». На ваш локальный компьютер будет загружен файл «kaggle.json», содержащий ваши учетные данные API.

Перейдите на свой диск Google и загрузите загруженный файл json в каталог «config». В качестве альтернативы вы можете запустить следующие коды в Google colab для автоматизации процесса: -

# Change directory to the previously created 'config' folder
cd config
# Upload the downloaded json file from your computer to Google drive
from google.colab import files
files.upload()

Файл «kaggle.json» успешно загружен в папку «config».

Внутри записной книжки Colab запустите эту ячейку кода, чтобы предоставить записной книжке доступ к файлу «kaggle.json»: -

import os
os.environ['KAGGLE_CONFIG_DIR'] = "/content/drive/My Drive/PLANT DISEASE RECOGNITION/config"

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

cd '/content/drive/My Drive/PLANT DISEASE RECOGNITION/datasets'

Мы будем использовать новый набор данных о болезнях растений на kaggle, который содержит 87 тысяч изображений здоровых и инфицированных листьев сельскохозяйственных культур, разделенных на 38 различных классов. Перейдите https://www.kaggle.com/vipoooool/new-plant-diseases-dataset в своем браузере, чтобы получить доступ к набору данных. Щелкните значок с тремя точками ›Скопируйте команду API› и вставьте новую ячейку кода, чтобы загрузить заархивированные наборы данных в текущий каталог наборы данных.

!kaggle datasets download -d vipoooool/new-plant-diseases-dataset

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

#Unzipping the zip files to extract the dataset folder and deleting the zip files
!unzip \*.zip  && rm *.zip

Замечательно! После распаковки назначьте базовый каталог для наборов данных переменной «base_dir».

base_dir = './New Plant Diseases Dataset(Augmented)/New Plant Diseases Dataset(Augmented)'
# Check the directories in the base_dir , OUTPUT = ['train', 'valid']
os.listdir(base_dir)

Конец ШАГА 2, перейдем к следующему разделу

ШАГ 3. - Импорт необходимых библиотек и загрузка наборов данных для обучения и проверки с помощью ImageDataGenerator (для увеличения данных)

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

Первым шагом является импорт / загрузка необходимых библиотек в новую ячейку кода: -

Как было показано ранее, общий набор данных делится на набор для обучения и проверки в соотношении 80/20 и сохраняется в разных каталогах для сохранения структуры каталогов. Папка «поезд» содержит набор данных поезда, а папка «действительный» содержит набор для проверки.

Мы будем использовать класс ImageDataGenerator, импортированный из keras.preprocessing.image, чтобы генерировать случайные пакеты данных тензорного изображения, а также выполнять на них увеличение данных в реальном времени. С помощью Data Augmentation мы можем выполнять случайную нормализацию, методы масштабирования и преобразования в нашем наборе данных, чтобы предотвратить переоснащение и обеспечить правильное обобщение нашей модели.

ImageDataGenerator также предоставляет методы для загрузки расширенных изображений из каталогов наборов данных с помощью метода «flow_from_directory ()», а также из фреймов данных pandas с использованием метода «flow_from_dataframe ()». Генераторы также могут быть переданы в качестве входных данных методам модели keras, которые принимают входные данные генератора, такие как fit_generator (), для обучения нашей модели.

Запустите этот код в новой ячейке кода, чтобы выполнить увеличение и преобразование данных для набора данных для обучения и проверки: -

Следующим шагом является загрузка изображений (с помощью метода flow_from_directory () в генераторах) из родительских каталогов, содержащих папки для каждой отдельной категории / класса. В нашем случае родительскими каталогами являются «поезд» (для набора данных поезда) и «действительный» (для набора данных проверки). Имена классов / меток будут автоматически сгенерированы из имен подкаталогов, поэтому нам не нужно определять их явно.

Запустите это в новой ячейке кода, чтобы выполнить эту операцию: -

Выход :-

Удивительно !, вы успешно загрузили изображения из соответствующих каталогов. Следующим шагом является сохранение файла class_indices, который представляет собой словарь, в котором закодированный индекс является ключом, а имя метки - значением. Он будет сохранен как файл json для использования в будущем.

import json
classes_dict = train_set_from_dir.class_indices
with open('/content/drive/My Drive/PLANT DISEASE RECOGNITION/class_indices.json','w') as f:
    json.dump(classes_dict, f)

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

ШАГ 4. - Создание и обучение модели MobileNet V2 с помощью Transfer Learning

Трансферное обучение - это стратегия построения модели в машинном обучении, которая включает в себя «повторное использование» предварительно обученной модели для конкретной задачи для повышения производительности аналогичной задачи (например, «передача» или «повторная передача»). используя ' модель, обученную для конкретной задачи другой задаче). Мы используем переносное обучение с весами ImageNet (вместо создания с нуля) для этой задачи, потому что это помогает ускорить время обучения и сходимость, а также позволяет нам использовать передовые модели, разработанные другими экспертами по глубокому обучению.

Модель MobileNet будет использоваться специально для этой задачи из-за ее легкой архитектуры, скорости и совместимости с Tensorflow.js. Тем не менее, вам рекомендуется попробовать другие модели трансферного обучения, такие как ResNet, InceptionV3, DenseNet, VGG, чтобы оценить их соответствующую производительность. Пожалуйста, обратитесь к разделу ссылки, чтобы получить больше теоретических знаний об архитектуре MobileNet (слои и используемые свертки / вычисления).

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

Запустите следующие коды в новой ячейке кода, PS: - При необходимости вы можете выполнить рефакторинг этого раздела: -

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

PS: - Обратите внимание, что это не лучшая модель для данного случая, это только базовая архитектура для целей данного руководства. Рекомендуется создать модель CNN с нуля или настроить эту модель путем точной настройки или добавления дополнительных слоев для получения более оптимальной производительности.

Затем вы можете получить сводную информацию о структуре и параметрах модели:

# Compiling the model with the optimizer and loss function
# categorical_accuracy is used as the loss function because it is a multi-class classification task
mobilenet_model.compile(optimizer = Adam(),
                        loss = 'categorical_crossentropy',
                        metrics = ['accuracy']
)

Отличная работа! Следующий шаг - настроить обратные вызовы для нашей построенной модели и обучить модель на нашем сгенерированном наборе данных.

Запустите следующий код в новой ячейке кода: -

Аргумент steps_per_epoch установлен на 128 для обучающего набора и 100 для набора проверки, это определяет количество пакетов выборок для обучения для каждой эпохи. Поскольку мы определили размер нашей партии как 32 для генератора данных обучения и проверки, это означает, что мы обучаемся с (128 * 32 = 2¹² выборками) для каждой эпохи обучения и (100 * 32 = 3200 выборок) для каждой эпохи проверки.

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

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

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

n = 6
plt.figure(figsize = (8,5))
plt.plot(np.arange(1,n+1), history.history['loss'], label = 'train_loss')
plt.plot(np.arange(1,n+1), history.history['val_loss'], label = 'val_loss')
plt.plot(np.arange(1,n+1), history.history['accuracy'], label = 'train_accuracy')
plt.plot(np.arange(1,n+1), history.history['val_accuracy'], label = 'val_accuracy')
plt.grid(True)
plt.legend(loc = "best")
plt.savefig('/content/drive/My Drive/PLANT DISEASE RECOGNITION/performance.jpg')
plt.show()

Отлично !, Вы легко можете проверить работоспособность модели на случайных изображениях из тестового набора (см. Блокнот). Следующим шагом является сохранение модели в каталоге models, созданном ранее (для повторного использования). Модель сохраняется в формате HDF5 (.h5) (формат файла с открытым исходным кодом, который поддерживает хранение сложных / разнородных данных).

# Save model as HDF5 format
mobilenet_model.save('/content/drive/My Drive/PLANT DISEASE RECOGNITION/models/mobilenet_model.h5')

Следующий шаг включает преобразование модели, созданной в Keras (python), в модель Tensorflow.js, чтобы мы могли встроить ее в веб-приложение для вывода на основе браузера.

Эти и другие шаги будут обсуждаться во второй части этой серии. Я очень надеюсь, что вам понравилось это руководство, и рекомендую вам прочитать ЧАСТЬ 2 также здесь. Записную книжку Jupyter для этого руководства можно найти здесь: - https://colab.research.google.com/drive/1_VBVthqVSvj8QqSvlfm2k1ZviOlcSK2o?usp=sharing

И все используемые файлы также доступны в этом репозитории GitHub: -



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

  1. Https://keras.io/api/applications/mobilenet/
  2. Https://towardsdatascience.com/transfer-learning-using-mobilenet-and-keras-c75daf7ff299

Пожалуйста, ознакомьтесь со второй частью статьи ниже, где мы развернем модель MobileNet в браузере с помощью Tensorflow.js.

Https://medium.com/@rexsimiloluwa/building-a-plant-disease-classification-web-app-in-keras-and-tensorflow-js-part-2-deee91b91ce4

Пожалуйста, свяжитесь со мной в LinkedIn, если у вас есть какие-либо вопросы или предложения.

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